Compare commits

...

153 Commits

Author SHA1 Message Date
semantic-release-bot 11034dc7a8 chore(release): 0.0.2-develop.1 [skip ci]
## [0.0.2-develop.1](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.1...v0.0.2-develop.1) (2023-07-01)

### Reverts

* Revert "*Change end to close" ([b5a81d5](b5a81d51ab))
2023-07-01 20:07:12 +00:00
Derrick Hammer 009dc4e003
refactor: switch to emittery 2023-07-01 16:06:03 -04:00
Derrick Hammer d22b636889
refactor: use new sdks and portal system 2023-07-01 05:36:28 -04:00
Derrick Hammer 2ebe64b33a
*Update dist 2023-04-16 22:44:11 -04:00
Derrick Hammer 00f37b829b
*Update module hash 2023-04-16 22:44:04 -04:00
Derrick Hammer 8daf4b4e7d
*Update dist 2023-04-09 11:52:55 -04:00
Derrick Hammer 060faf45ac
*Update module hash 2023-04-09 11:52:44 -04:00
Derrick Hammer f7a5628a91
*Update dist 2023-04-08 21:21:14 -04:00
Derrick Hammer 4829b48058
*Update module hash 2023-04-08 21:21:04 -04:00
Derrick Hammer 79bbf5c144
*Update dist 2023-04-08 21:02:16 -04:00
Derrick Hammer 9740402e82
*Update module hash 2023-04-08 21:02:10 -04:00
Derrick Hammer bb657e5af0
* Refactor event emitter library to eventemitter2 and remove unnecessary import of protomux. Rewrite on and off methods to accept options object and change event listener parameter name for consistency. Replace call to protomux with emitting a setup event. 2023-04-08 16:11:39 -04:00
Derrick Hammer 20e9a6e0e5
* Add EventEmitter2 library for event handling and remove EventEmitter3 library in index.ts; update package.json to include EventEmitter2 library. 2023-04-08 16:11:03 -04:00
Derrick Hammer fdda2befa8
* Refactor swarm setup event to include the current instance in the emitted data. 2023-04-08 15:56:43 -04:00
Derrick Hammer cf27a6518f
* Add call to emitAsync method to trigger "setup" event on swarm object. 2023-04-08 15:55:09 -04:00
Derrick Hammer 952b3a0d1a
*Update deps 2023-04-08 15:41:52 -04:00
Derrick Hammer 0d7090206c
*Remove use of protomux 2023-04-08 15:19:31 -04:00
Derrick Hammer 3a207c107c
*Remove syncProtomux 2023-04-08 15:18:37 -04:00
Derrick Hammer 92bc8e5ce8
*Update dist 2023-04-07 13:20:36 -04:00
Derrick Hammer 7c8763c530
*Export MODULE 2023-04-07 13:20:31 -04:00
Derrick Hammer d10aad49f4
*Update dist 2023-04-06 17:34:42 -04:00
Derrick Hammer 1d0718af05
*Pass socket id 2023-04-06 17:34:23 -04:00
Derrick Hammer b274b82d3c
*Update dist 2023-04-06 16:36:41 -04:00
Derrick Hammer 9ae392e1ab
*Switch to simpler protomux sync approach 2023-04-06 16:36:13 -04:00
Derrick Hammer 62058d31fd
*Update dist 2023-04-06 14:38:17 -04:00
Derrick Hammer c0acff3955
*Flag protomux as slave 2023-04-06 14:38:07 -04:00
Derrick Hammer caec48d0a6
*Update dist 2023-04-06 14:36:16 -04:00
Derrick Hammer eec453ba91
*await on the update being sent, and the update getting received 2023-04-06 14:29:15 -04:00
Derrick Hammer c2ebdc00b9
*Update dist 2023-04-06 10:48:50 -04:00
Derrick Hammer 0596a132f3
*Move setup emit until after the setup promise has resolved 2023-04-06 10:48:27 -04:00
Derrick Hammer f5127bd809
*Update dist 2023-04-06 10:30:15 -04:00
Derrick Hammer aefd401d22
*Create a setup defer to ensure we wait until the 1st sync is done before setting up the stream on our end 2023-04-06 10:29:59 -04:00
Derrick Hammer 650998c810
*Update dist 2023-04-06 10:17:33 -04:00
Derrick Hammer 382ce99ada
*Add protomux userData field as null, otherwise it does not get set 2023-04-06 10:17:16 -04:00
Derrick Hammer 4cd89acb12
*update dist 2023-04-06 10:08:44 -04:00
Derrick Hammer 794ab2f792
*forgot to pass swarm to socket 2023-04-06 10:08:23 -04:00
Derrick Hammer 9c1bedc83e
*Update dist 2023-04-06 09:57:29 -04:00
Derrick Hammer a9bc1e3a73
*emit setup event to allow setup of a socket before triggering the connection event
*add a link to the parent swarm in the socket to call emit
2023-04-06 09:57:04 -04:00
Derrick Hammer 4541386514
*Update dist 2023-04-05 18:02:23 -04:00
Derrick Hammer a59de99e56
*Use pdefer to wait until the other site has responded that they synced changes and gave true 2023-04-05 18:01:59 -04:00
Derrick Hammer bce1bca13e
*update dist 2023-04-05 04:08:02 -04:00
Derrick Hammer 7a6a740484
*update module hash 2023-04-05 04:07:46 -04:00
Derrick Hammer 301f751ad4
*update dist 2023-04-05 03:54:36 -04:00
Derrick Hammer 55159d89ce
*implement syncing protomux channel/message state 2023-04-05 03:54:27 -04:00
Derrick Hammer 3bdaedd939
*update dist 2023-04-04 11:24:11 -04:00
Derrick Hammer be450ecbce
*update module hash 2023-04-04 11:23:55 -04:00
Derrick Hammer 7486904592
*update dist 2023-04-04 08:08:05 -04:00
Derrick Hammer 275c08efe7
*update module hash 2023-04-04 08:08:00 -04:00
Derrick Hammer d61df5d4e8
*Update dist 2023-04-04 06:28:48 -04:00
Derrick Hammer 990d77d86e
*Update module hash 2023-04-04 06:28:27 -04:00
Derrick Hammer 6c41fbc114
*Update dist 2023-03-29 17:03:43 -04:00
Derrick Hammer 8d74bf96af
*Update module hash 2023-03-29 17:03:26 -04:00
Derrick Hammer 049a629e47
*update dist 2023-03-24 16:14:55 -04:00
Derrick Hammer c7a7fa9194
*update module hash 2023-03-24 16:14:21 -04:00
Derrick Hammer 1aa1be90d4
*update module hash 2023-03-19 15:23:32 -04:00
Derrick Hammer e47a1f26d7
*Update dist 2023-03-19 14:55:38 -04:00
Derrick Hammer 1c167aad2a
*modify connect to return an existing connection if it exists, and if not, throw a not implemented error 2023-03-19 14:55:23 -04:00
Derrick Hammer bdf0cb705c
*Update dist 2023-03-19 14:03:38 -04:00
Derrick Hammer 1a4f33c697
*Move _connectBackoff retry to costructor so we don't create duplicate hooks 2023-03-19 14:03:24 -04:00
Derrick Hammer 290ca18c4b
*Store the listenConnections connection so don't create duplicates incase init/ready is called multiple times 2023-03-19 14:02:50 -04:00
Derrick Hammer 14a71cffd9
*update dist 2023-03-19 11:14:53 -04:00
Derrick Hammer ce24ca1bd9
*missing storing the socket 2023-03-19 11:14:31 -04:00
Derrick Hammer 0ee94ca1e5
*Update dist 2023-03-19 10:48:28 -04:00
Derrick Hammer c869488951
*Track socks to reuse objects as we are storing state on them 2023-03-19 10:48:11 -04:00
Derrick Hammer ab78add294
*update dist 2023-03-18 14:42:37 -04:00
Derrick Hammer 4e504124b2
*update module hash 2023-03-18 14:42:22 -04:00
Derrick Hammer 30c08327b4
*update dist 2023-03-18 13:55:47 -04:00
Derrick Hammer 44b9842ea9
*add dht getter that returns a mock object including ready 2023-03-18 13:55:33 -04:00
Derrick Hammer 46b0911d57
*Update dist 2023-03-16 14:25:09 -04:00
Derrick Hammer acc2ed4db3
*Update module hash 2023-03-16 14:24:41 -04:00
Derrick Hammer 1d61d00881
*Update dist 2023-02-17 21:05:40 -05:00
Derrick Hammer 36dd596aab
*Methods not needed 2023-02-17 21:05:28 -05:00
Derrick Hammer ee3e71351c
*Update dist 2023-02-17 21:03:50 -05:00
Derrick Hammer 7028609da4
*Set hash length to 32 2023-02-17 21:03:42 -05:00
Derrick Hammer bbbe813360
*Update dist 2023-02-17 20:07:08 -05:00
Derrick Hammer 4977f88d55
*Mixed up code 2023-02-17 20:06:46 -05:00
Derrick Hammer 1ba371fb1c
*Update dist 2023-02-17 20:05:07 -05:00
Derrick Hammer 232f82d828
*Support strings in join with nobile blake2b hashing 2023-02-17 20:04:21 -05:00
Derrick Hammer 8061477c0b
*Update dist 2023-02-17 19:36:14 -05:00
Derrick Hammer df63f8be30
*Add persistent tracking of topics 2023-02-17 19:35:56 -05:00
Derrick Hammer ae487a27e5
*Update dist 2023-02-17 16:50:42 -05:00
Derrick Hammer b98db98b6a
*Missing await 2023-02-17 16:50:05 -05:00
Derrick Hammer c52e437f50
*Update dist 2023-02-17 11:28:36 -05:00
Derrick Hammer 6f30bb7faa
*set maxAttempts to Number.MAX_SAFE_INTEGER 2023-02-17 11:28:07 -05:00
Derrick Hammer 1970763114
*Update dist 2023-02-17 09:26:10 -05:00
Derrick Hammer ff7266f05e
*Switch to backoff.js 2023-02-17 09:25:58 -05:00
Derrick Hammer acbc5408c9
*Update dist 2023-02-17 08:50:06 -05:00
Derrick Hammer b76aa38f76
*Move listenConnections call to private method that will do a backoff connection after returning 2023-02-17 08:49:35 -05:00
Derrick Hammer 7d031231a3
*Update dist 2023-02-17 08:31:37 -05:00
Derrick Hammer d3460ae956
*Move backoff reset to the ready method 2023-02-17 08:31:24 -05:00
Derrick Hammer 54a817742c
*Update dist 2023-02-17 08:20:16 -05:00
Derrick Hammer a7384cf688
*Listen for connections before waiting for ready 2023-02-17 08:20:02 -05:00
Derrick Hammer 72324beb68
*Update dist 2023-02-17 08:08:57 -05:00
Derrick Hammer ba0832588d
*Refactor start 2023-02-17 08:08:43 -05:00
Derrick Hammer 3ede7224aa
*Update dist 2023-02-16 21:48:11 -05:00
Derrick Hammer db894376eb
*Add connection retry with backoff support 2023-02-16 21:47:49 -05:00
Derrick Hammer 524d647f21
*Update dist 2023-02-06 05:25:32 -05:00
Derrick Hammer 1786e56380
*Change createSocket to call setup which will fetch socket info from socketGetInfo and setup as mock objects 2023-02-06 05:25:00 -05:00
Derrick Hammer e69e7a67b6
*Update dist 2023-02-06 03:50:00 -05:00
Derrick Hammer 1f76aef53a
*Change socket close module method name to be consistent with the rest 2023-02-06 03:49:48 -05:00
Derrick Hammer e84b009244
*Change socket listen module method name to be consistent with the rest 2023-02-06 03:35:04 -05:00
Derrick Hammer e211fa3b48
*Fix write module call name 2023-02-06 03:33:44 -05:00
Derrick Hammer d4df7d45c3
*Update dist 2023-02-06 03:26:19 -05:00
Derrick Hammer 875ba862f0
*Use createSocket not createClient 2023-02-06 03:26:06 -05:00
Derrick Hammer fe04cbe10d
*On the ready method, setup a connection to the swarm module to listen for new connections 2023-02-06 03:13:32 -05:00
Derrick Hammer 2bcd37e271
*Properly overload eventemitter3 methods 2023-02-06 03:11:42 -05:00
Derrick Hammer 176a95f026
*fix package name 2023-02-04 16:53:32 -05:00
Derrick Hammer acdbfb7a9a
*Update dist 2023-02-01 14:08:26 -05:00
Derrick Hammer 994cab10bc
*Make async 2023-02-01 14:08:11 -05:00
Derrick Hammer 9e8665338b
*Update dist 2023-02-01 14:06:25 -05:00
Derrick Hammer 7fa2a83141
*Join added to the wrong class 2023-02-01 14:06:13 -05:00
Derrick Hammer 8ec7444770
*Update dist 2023-02-01 14:00:26 -05:00
Derrick Hammer b252b331ad
*Add join api 2023-02-01 14:00:08 -05:00
Derrick Hammer 0bcec3e3e1
*Update dist 2023-02-01 12:33:30 -05:00
Derrick Hammer a0279262b1
*Update module hash 2023-02-01 12:33:17 -05:00
Derrick Hammer 1af9931725
*Update dist 2023-02-01 12:09:29 -05:00
Derrick Hammer 9354fbebbd
*Update module hash 2023-02-01 12:09:11 -05:00
Derrick Hammer b250c30327
*Update dist 2023-02-01 08:47:57 -05:00
Derrick Hammer c6b595380a
*Add prettier 2023-02-01 08:47:29 -05:00
Derrick Hammer 4359c590ba
*Add init method 2023-02-01 08:47:19 -05:00
Derrick Hammer ebe2a18d91
*Update dist 2023-02-01 07:55:30 -05:00
Derrick Hammer 5974956e48
*add typescript 2023-02-01 07:55:16 -05:00
Derrick Hammer b567d70dda
*rewrite for new design 2023-02-01 07:54:20 -05:00
Derrick Hammer b5a81d51ab
Revert "*Change end to close"
This reverts commit 14d6888baf.
2022-08-31 20:38:28 -04:00
Derrick Hammer 3ebfe51a83
Revert "*Update dist"
This reverts commit 2773b1f38b.
2022-08-31 20:38:27 -04:00
Derrick Hammer 2773b1f38b
*Update dist 2022-08-31 20:35:02 -04:00
Derrick Hammer 14d6888baf
*Change end to close 2022-08-31 20:34:41 -04:00
Derrick Hammer 4799cf4a98
*Update dist 2022-08-14 07:58:39 -04:00
Derrick Hammer 557fb887d2
*Remove random import 2022-08-14 07:58:13 -04:00
Derrick Hammer 2e20565e54
*Update dist 2022-08-14 07:33:04 -04:00
Derrick Hammer f404dff8eb
*add getRelays and getRelayServers methods 2022-08-14 07:32:37 -04:00
Derrick Hammer 77141c3003
*Update dist 2022-08-03 22:26:40 -04:00
Derrick Hammer 4f21ab970d
*Check if socket exists before closing to prevent errors on possible race conditions 2022-08-03 22:26:34 -04:00
Derrick Hammer 43041160be
*update dist 2022-08-03 21:36:52 -04:00
Derrick Hammer 395edfe75a
*dht missing on connect call 2022-08-03 21:36:30 -04:00
Derrick Hammer cc2def1901
*Update dist 2022-08-03 21:09:44 -04:00
Derrick Hammer bf70a54b31
*dht id is nested 2022-08-03 21:09:24 -04:00
Derrick Hammer ddf79c2efd
*Update dist 2022-08-03 12:37:15 -04:00
Derrick Hammer 85fb05b854
*Add setup method and use it in all methods 2022-08-03 12:36:58 -04:00
Derrick Hammer cc3b188d5d
*Update dist 2022-08-03 12:29:53 -04:00
Derrick Hammer 20c55f94ad
*Set id to 0 2022-08-03 12:27:47 -04:00
Derrick Hammer f76391d46e
*prettier 2022-08-03 12:05:10 -04:00
Derrick Hammer 9071ed0592
*add support for creating a DHT connection or using the default 2022-08-03 12:04:53 -04:00
Derrick Hammer 188fa6433b *Update dist 2022-07-21 00:56:59 -04:00
Derrick Hammer 018c9f0387 *Load callModule and connectModule on the fly 2022-07-21 00:56:04 -04:00
Derrick Hammer a321cf0859 *Update dist 2022-07-20 18:03:37 -04:00
Derrick Hammer 179bef1f9f *Add removeRelay and clearRelays API methods 2022-07-20 18:03:10 -04:00
Derrick Hammer 2c41826632 *Update dist 2022-07-20 17:24:00 -04:00
Derrick Hammer 200221e742 *Add more safety checks on window 2022-07-20 17:23:48 -04:00
Derrick Hammer 648951208c *Update dist 2022-07-20 03:27:17 -04:00
Derrick Hammer 2437037a14 *Wrap err in Error 2022-07-20 03:26:55 -04:00
Derrick Hammer 1fabdc7e4d *add dist 2022-07-20 02:13:07 -04:00
Derrick Hammer afc332b75e *Add addRelay interface method 2022-07-19 22:59:07 -04:00
7 changed files with 18261 additions and 110 deletions

13
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,13 @@
name: Build/Publish
on:
push:
branches:
- master
- develop
- develop-*
jobs:
main:
uses: lumeweb/github-node-deploy-workflow/.github/workflows/main.yml@master
secrets: inherit

5
.presetterrc.json Normal file
View File

@ -0,0 +1,5 @@
{
"preset": [
"@lumeweb/node-library-preset"
]
}

6
CHANGELOG.md Normal file
View File

@ -0,0 +1,6 @@
## [0.0.2-develop.1](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.1...v0.0.2-develop.1) (2023-07-01)
### Reverts
* Revert "*Change end to close" ([b5a81d5](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/commit/b5a81d51ab490e5e8f405a18a5859f624d7b0b93))

17968
npm-shrinkwrap.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,32 @@
{
"name": "@lumeweb/kernel-dht-client",
"version": "0.1.0",
"name": "@lumeweb/kernel-swarm-client",
"version": "0.0.2-develop.1",
"type": "module",
"main": "dist/index.js",
"dependencies": {
"buffer": "^6.0.3",
"libkernel": "^0.1.43",
"libkmodule": "^0.2.44",
"libskynet": "^0.0.62"
"main": "lib/index.js",
"repository": {
"type": "git",
"url": "gitea@git.lumeweb.com:LumeWeb/kernel-swarm-client.git"
},
"devDependencies": {
"@types/node": "^18.0.6",
"prettier": "^2.7.1"
"@lumeweb/node-library-preset": "^0.2.7",
"@types/b4a": "^1.6.0",
"presetter": "*"
},
"readme": "ERROR: No README data found!",
"scripts": {
"prepare": "presetter bootstrap",
"build": "run build",
"semantic-release": "semantic-release"
},
"dependencies": {
"@lumeweb/libkernel": "^0.1.0-develop.9",
"async-mutex": "^0.4.0",
"b4a": "^1.6.4"
},
"files": [
"lib/**"
],
"publishConfig": {
"access": "public"
}
}

View File

@ -1,94 +1,260 @@
import {
callModule as callModuleKernel,
connectModule as connectModuleKernel,
} from "libkernel";
import {
callModule as callModuleModule,
connectModule as connectModuleModule,
} from "libkmodule";
import { EventEmitter } from "events";
import { DataFn, ErrTuple } from "libskynet";
import { Buffer } from "buffer";
import { Client, factory } from "@lumeweb/libkernel/module";
import { DataFn, ErrTuple, hexToBuf, logErr } from "@lumeweb/libkernel";
import { blake2b } from "@noble/hashes/blake2b";
import b4a from "b4a";
const DHT_MODULE = "AQD1IgE4lTZkq1fqdoYGojKRNrSk0YQ_wrHbRtIiHDrnow";
// @ts-ignore
import Backoff from "backoff.js";
import { Mutex } from "async-mutex";
// @ts-ignore
import Protomux from "protomux";
import type { UnsubscribeFn } from "emittery";
let callModule: typeof callModuleModule,
connectModule: typeof connectModuleModule;
export class SwarmClient extends Client {
private useDefaultSwarm: boolean;
private id: number = 0;
private _autoReconnect: boolean;
private _connectBackoff: any;
if (window.document) {
callModule = callModuleKernel;
connectModule = connectModuleKernel;
} else {
callModule = callModuleModule;
connectModule = connectModuleModule;
private _ready?: Promise<void>;
private _connectionListener?: [
sendUpdate: DataFn,
response: Promise<ErrTuple>,
];
private _topics: Set<Uint8Array> = new Set<Uint8Array>();
private _sockets: Map<number, Socket> = new Map<number, Socket>();
get dht() {
const self = this;
return {
async ready() {
return self.ready();
},
};
}
constructor(module: string, useDefaultDht = true, autoReconnect = false) {
super(module);
this.useDefaultSwarm = useDefaultDht;
this._autoReconnect = autoReconnect;
this._connectBackoff = new Backoff({
strategy: "fibo",
maxAttempts: Number.MAX_SAFE_INTEGER,
});
this._connectBackoff.on("retry", (error: any) => {
logErr(error);
});
}
get swarm(): number | undefined {
return this.useDefaultSwarm ? undefined : this.id;
}
public async connect(pubkey: string | Uint8Array): Promise<Socket> {
if (typeof pubkey === "string") {
const buf = hexToBuf(pubkey);
pubkey = this.handleErrorOrReturn(buf);
}
let existing = Array.from(this._sockets.values()).filter((socket) => {
return b4a.equals(socket.remotePublicKey, pubkey as Uint8Array);
});
if (existing.length) {
return existing[0] as Socket;
}
throw new Error("not implemented");
}
async init(): Promise<ErrTuple> {
return await this.callModuleReturn("init", { swarm: this.swarm });
}
async ready(): Promise<void> {
if (this._ready) {
return this._ready;
}
this._listen();
this._ready = this.callModuleReturn("ready", { swarm: this.swarm });
await this._ready;
this._ready = undefined;
for (const topic of this._topics) {
await this.join(topic);
}
}
async start(): Promise<void> {
await this._connectBackoff.run(() => this.init());
await this.ready();
}
private async _listen() {
if (!this._connectionListener) {
this._connectionListener = this.connectModule(
"listenConnections",
{ swarm: this.swarm },
async (socketId: any) => {
const socket =
this._sockets.get(socketId) ?? (await createSocket(socketId, this));
socket.on("close", () => {
this._sockets.delete(socketId);
});
if (!this._sockets.has(socketId)) {
this._sockets.set(socketId, socket);
}
this.emit("connection", socket);
},
);
}
await this._connectionListener[1];
this._connectionListener = undefined;
this.start();
}
public async addRelay(pubkey: string): Promise<void> {
return this.callModuleReturn("addRelay", { pubkey, swarm: this.swarm });
}
public async removeRelay(pubkey: string): Promise<void> {
return this.callModuleReturn("removeRelay", { pubkey, swarm: this.swarm });
}
public async clearRelays(): Promise<void> {
return this.callModuleReturn("clearRelays", { swarm: this.swarm });
}
public async getRelays(): Promise<string[]> {
return this.callModuleReturn("getRelays", { swarm: this.swarm });
}
public async join(topic: Buffer | Uint8Array | string): Promise<void> {
if (typeof topic === "string") {
topic = blake2b(topic, { dkLen: 32 });
}
this._topics.add(topic);
this.callModule("join", { id: this.id, topic });
}
}
export class DHT {
public async connect(pubkey: string): Promise<Socket> {
const [resp, err] = await callModule(DHT_MODULE, "connect", { pubkey });
if (err) {
throw err;
}
return new Socket(resp.id);
}
async ready(): Promise<ErrTuple> {
return callModule(DHT_MODULE, "ready");
}
interface SocketRawStream {
remoteHost: string;
remotePort: number;
remoteFamily: string;
}
export class Socket extends EventEmitter {
private id: number;
private eventUpdates: { [event: string]: DataFn[] } = {};
export class Socket extends Client {
private id: number;
private eventUpdates: { [event: string]: DataFn[] } = {};
constructor(id: number) {
super();
this.id = id;
private syncMutex = new Mutex();
private swarm: SwarmClient;
private userData?: any = null;
constructor(module: string, id: number, swarm: SwarmClient) {
super(module);
this.id = id;
this.swarm = swarm;
}
private _remotePublicKey?: Uint8Array;
get remotePublicKey(): Uint8Array {
return this._remotePublicKey as Uint8Array;
}
private _rawStream?: Uint8Array;
get rawStream(): Uint8Array {
return this._rawStream as Uint8Array;
}
async setup() {
let info = await this.callModuleReturn("socketGetInfo", { id: this.id });
this._remotePublicKey = info.remotePublicKey;
this._rawStream = info.rawStream;
await this.swarm.emit("setup", this);
}
on(event: any, listener: any): UnsubscribeFn {
const [update, promise] = this.connectModule(
"socketListenEvent",
{ id: this.id, event: event },
(data: any) => {
this.emit(event, data);
},
);
this.trackEvent(event as string, update);
promise.then(() => {
this.off(event as string, listener);
});
return super.on(event, listener);
}
off(event: any, listener: any): this {
const updates = [...this.eventUpdates[event as string]];
this.eventUpdates[event as string] = [];
for (const func of updates) {
func();
}
super.off(event, listener);
return this;
}
on(eventName: string, listener: (...args: any[]) => void): this {
const [update, promise] = connectModule(
DHT_MODULE,
"listenSocketEvent",
{ id: this.id, event: eventName },
(data: any) => {
this.emit(eventName, data);
}
);
this.trackEvent(eventName, update);
write(message: string | Buffer): void {
this.callModule("socketWrite", { id: this.id, message });
}
promise.then(() => {
this.off(eventName, listener);
});
return super.on(eventName, listener);
}
off(type: string, listener: any): this {
const updates = [...this.eventUpdates[type]];
this.eventUpdates[type] = [];
for (const func of updates) {
func({ action: "off" });
end(): void {
this.callModule("socketExists", { id: this.id }).then(
([exists]: ErrTuple) => {
if (exists) {
this.callModule("socketClose", { id: this.id });
}
return super.off(type, listener);
}
},
);
}
write(message: string | Buffer): void {
callModule(DHT_MODULE, "write", { id: this.id, message });
private ensureEvent(event: string): void {
if (!(event in this.eventUpdates)) {
this.eventUpdates[event] = [];
}
}
end(): void {
callModule(DHT_MODULE, "close", { id: this.id });
}
private ensureEvent(event: string): void {
if (!(event in this.eventUpdates)) {
this.eventUpdates[event] = [];
}
}
private trackEvent(event: string, update: DataFn): void {
this.ensureEvent(event as string);
this.eventUpdates[event].push(update);
}
private trackEvent(event: string, update: DataFn): void {
this.ensureEvent(event as string);
this.eventUpdates[event].push(update);
}
}
export const MODULE =
"zduSB7gEXpcHo4F1esrpHRaB9nYh6KtTn3bktnpJRxWnpvqPhaLNmPwAp7";
export const createClient = factory<SwarmClient>(SwarmClient, MODULE);
const socketFactory = factory<Socket>(Socket, MODULE);
const createSocket = async (...args: any): Promise<Socket> => {
const socket = socketFactory(...args);
await socket.setup();
return socket;
};

View File

@ -1,23 +0,0 @@
{
"compilerOptions": {
"declaration": true,
"strict": true,
"module": "esnext",
"target": "esnext",
"esModuleInterop": true,
"sourceMap": false,
"rootDir": "src",
"outDir": "dist",
"typeRoots": [
"node_modules/@types",
],
"moduleResolution": "node",
"declarationMap": true,
"declarationDir": "dist",
"emitDeclarationOnly": false,
"allowJs": true
},
"include": [
"src"
]
}