Compare commits
3 Commits
v0.0.2-dev
...
v0.0.2-dev
Author | SHA1 | Date |
---|---|---|
semantic-release-bot | a490281514 | |
Derrick Hammer | cbdf0a3ffa | |
Derrick Hammer | 11ee1d687a |
|
@ -1,3 +1,5 @@
|
||||||
|
## [0.0.2-develop.10](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.2-develop.9...v0.0.2-develop.10) (2023-07-22)
|
||||||
|
|
||||||
## [0.0.2-develop.9](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.2-develop.8...v0.0.2-develop.9) (2023-07-12)
|
## [0.0.2-develop.9](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.2-develop.8...v0.0.2-develop.9) (2023-07-12)
|
||||||
|
|
||||||
## [0.0.2-develop.8](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.2-develop.7...v0.0.2-develop.8) (2023-07-08)
|
## [0.0.2-develop.8](https://git.lumeweb.com/LumeWeb/kernel-swarm-client/compare/v0.0.2-develop.7...v0.0.2-develop.8) (2023-07-08)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "@lumeweb/kernel-swarm-client",
|
"name": "@lumeweb/kernel-swarm-client",
|
||||||
"version": "0.0.2-develop.9",
|
"version": "0.0.2-develop.10",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@lumeweb/kernel-swarm-client",
|
"name": "@lumeweb/kernel-swarm-client",
|
||||||
"version": "0.0.2-develop.9",
|
"version": "0.0.2-develop.10",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lumeweb/libkernel": "^0.1.0-develop.9",
|
"@lumeweb/libkernel": "^0.1.0-develop.9",
|
||||||
"async-mutex": "^0.4.0",
|
"async-mutex": "^0.4.0",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@lumeweb/kernel-swarm-client",
|
"name": "@lumeweb/kernel-swarm-client",
|
||||||
"version": "0.0.2-develop.9",
|
"version": "0.0.2-develop.10",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|
40
src/index.ts
40
src/index.ts
|
@ -6,10 +6,8 @@ import b4a from "b4a";
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import Backoff from "backoff.js";
|
import Backoff from "backoff.js";
|
||||||
import { Mutex } from "async-mutex";
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import Protomux from "protomux";
|
import Protomux from "protomux";
|
||||||
import type { UnsubscribeFn } from "emittery";
|
|
||||||
|
|
||||||
export class SwarmClient extends Client {
|
export class SwarmClient extends Client {
|
||||||
private useDefaultSwarm: boolean;
|
private useDefaultSwarm: boolean;
|
||||||
|
@ -159,9 +157,7 @@ interface SocketRawStream {
|
||||||
|
|
||||||
export class Socket extends Client {
|
export class Socket extends Client {
|
||||||
private id: number;
|
private id: number;
|
||||||
private eventUpdates: { [event: string]: DataFn[] } = {};
|
private eventUpdates: { [event: string]: Map<Function, DataFn> } = {};
|
||||||
|
|
||||||
private syncMutex = new Mutex();
|
|
||||||
|
|
||||||
private swarm: SwarmClient;
|
private swarm: SwarmClient;
|
||||||
private userData?: any = null;
|
private userData?: any = null;
|
||||||
|
@ -192,7 +188,12 @@ export class Socket extends Client {
|
||||||
await this.swarm.emit("setup", this);
|
await this.swarm.emit("setup", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
on(event: any, listener: any): UnsubscribeFn {
|
// @ts-ignore
|
||||||
|
on(event: any, listener: any): this {
|
||||||
|
if (this.eventUpdates[event]?.has(listener)) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
const [update, promise] = this.connectModule(
|
const [update, promise] = this.connectModule(
|
||||||
"socketListenEvent",
|
"socketListenEvent",
|
||||||
{ id: this.id, event: event },
|
{ id: this.id, event: event },
|
||||||
|
@ -200,22 +201,30 @@ export class Socket extends Client {
|
||||||
this.emit(event, data);
|
this.emit(event, data);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
this.trackEvent(event as string, update);
|
this.trackEvent(event as string, listener, update);
|
||||||
|
|
||||||
promise.then(() => {
|
promise.then(() => {
|
||||||
this.off(event as string, listener);
|
this.off(event as string, listener);
|
||||||
});
|
});
|
||||||
|
|
||||||
return super.on(event, listener);
|
super.on(event, listener);
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
off(event: any, listener: any): this {
|
off(event: any, listener: any): this {
|
||||||
const updates = [...this.eventUpdates[event as string]];
|
if (listener) {
|
||||||
this.eventUpdates[event as string] = [];
|
const updates = this.eventUpdates[event];
|
||||||
for (const func of updates) {
|
updates?.get(listener)?.();
|
||||||
func();
|
updates?.delete(listener);
|
||||||
|
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const updates = [...this.eventUpdates[event as string].values()];
|
||||||
|
this.eventUpdates[event as string] = new Map<Function, DataFn>();
|
||||||
|
updates.forEach((update) => update());
|
||||||
super.off(event, listener);
|
super.off(event, listener);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,13 +244,13 @@ export class Socket extends Client {
|
||||||
|
|
||||||
private ensureEvent(event: string): void {
|
private ensureEvent(event: string): void {
|
||||||
if (!(event in this.eventUpdates)) {
|
if (!(event in this.eventUpdates)) {
|
||||||
this.eventUpdates[event] = [];
|
this.eventUpdates[event] = new Map<Function, DataFn>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private trackEvent(event: string, update: DataFn): void {
|
private trackEvent(event: string, listener: Function, update: DataFn): void {
|
||||||
this.ensureEvent(event as string);
|
this.ensureEvent(event as string);
|
||||||
this.eventUpdates[event].push(update);
|
this.eventUpdates[event].set(listener, update);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,6 +259,7 @@ export const MODULE =
|
||||||
|
|
||||||
export const createClient = factory<SwarmClient>(SwarmClient, MODULE);
|
export const createClient = factory<SwarmClient>(SwarmClient, MODULE);
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
const socketFactory = factory<Socket>(Socket, MODULE);
|
const socketFactory = factory<Socket>(Socket, MODULE);
|
||||||
const createSocket = async (...args: any): Promise<Socket> => {
|
const createSocket = async (...args: any): Promise<Socket> => {
|
||||||
const socket = socketFactory(...args);
|
const socket = socketFactory(...args);
|
||||||
|
|
Loading…
Reference in New Issue