@derivesome/sockets
Advanced tools
| import { type Binary } from "binencode"; | ||
| import { type WebSocket as WSWebSocket } from "ws"; | ||
| import { type InferPattern, type PatLoose } from 'p-lens'; | ||
| import { type InferPattern, type PatLoose } from "p-lens"; | ||
| import { type PubSub } from "@derivesome/core"; | ||
@@ -9,10 +9,14 @@ export type WebSocketImplementation = WebSocket | WSWebSocket; | ||
| connection: Impl; | ||
| factory: () => Impl; | ||
| private factory; | ||
| ps: PubSub<Binary>; | ||
| private cleanups; | ||
| constructor(factory: () => Impl, _cfg?: SocketConfig); | ||
| addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions, autoCleanup?: boolean): () => void; | ||
| once<K extends keyof WebSocketEventMap>(type: K, listener: (ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; | ||
| whenReady(fn: () => (void | Promise<void>)): Promise<void>; | ||
| private connect; | ||
| sendBinary(data: Binary): void; | ||
| send<T>(data: T): void; | ||
| watch<P extends PatLoose>(pat: P, fn: (data: InferPattern<P>) => (void | Promise<void>)): import("@derivesome/core").VoidFunction; | ||
| send<T>(data: T): Promise<void>; | ||
| watch<P extends PatLoose>(pat: P, fn: (data: InferPattern<P>) => void | Promise<void>): import("@derivesome/core").VoidFunction; | ||
| } | ||
| //# sourceMappingURL=socket.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC;AACnD,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,EAC1B,CAAA;AAED,qBAAa,MAAM,CACjB,IAAI,SAAS,uBAAuB,GAAG,uBAAuB;IAE9D,UAAU,EAAG,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;gBAEN,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,YAAiB;IAMxD,OAAO,CAAC,OAAO;IAqBf,UAAU,CAAC,IAAI,EAAE,MAAM;IAKvB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAKf,KAAK,CAAC,CAAC,SAAS,QAAQ,EACtB,GAAG,EAAE,CAAC,EACN,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CASxD"} | ||
| {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC;AACnD,OAAO,EAAW,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAU,KAAK,MAAM,EAAc,MAAM,kBAAkB,CAAC;AAEnE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,EAAE,CAAC;AAE9B,qBAAa,MAAM,CACjB,IAAI,SAAS,uBAAuB,GAAG,uBAAuB;IAE9D,UAAU,EAAG,IAAI,CAAC;IAClB,OAAO,CAAC,OAAO,CAAa;IAC5B,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,QAAQ,CAA8B;gBAElC,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,YAAiB;IAMxD,gBAAgB,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAChD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,GAAG,EAC5D,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,EAC3C,WAAW,CAAC,EAAE,OAAO,GACpB,MAAM,IAAI;IAkBb,IAAI,CAAC,CAAC,SAAS,MAAM,iBAAiB,EACpC,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,GAAG,EAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB;IAevC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAehD,OAAO,CAAC,OAAO;IAkBf,UAAU,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAMrB,KAAK,CAAC,CAAC,SAAS,QAAQ,EACtB,GAAG,EAAE,CAAC,EACN,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAStD"} |
+59
-16
@@ -11,2 +11,3 @@ "use strict"; | ||
| ps; | ||
| cleanups = new Set(); | ||
| constructor(factory, _cfg = {}) { | ||
@@ -17,22 +18,62 @@ this.factory = factory; | ||
| } | ||
| connect() { | ||
| this.connection = this.factory(); | ||
| this.connection.binaryType = "arraybuffer"; | ||
| addEventListener(type, listener, options, autoCleanup) { | ||
| const con = this.connection; | ||
| if (con instanceof WebSocket) { | ||
| con.addEventListener('message', async (ev) => { | ||
| if (ev.data instanceof ArrayBuffer) { | ||
| const buff = new binencode_1.BinaryBuffer(); | ||
| buff.data = new Uint8Array(ev.data); | ||
| try { | ||
| const decoded = binencode_1.serial.decode(buff); | ||
| await this.ps.publishAsync(decoded); | ||
| } | ||
| catch (e) { | ||
| console.error(e); | ||
| } | ||
| con.addEventListener(type, listener, options); | ||
| const unsub = () => { | ||
| try { | ||
| con.removeEventListener(type, listener, options); | ||
| } | ||
| catch { } | ||
| }; | ||
| if (autoCleanup !== false) { | ||
| this.cleanups.add(unsub); | ||
| } | ||
| return unsub; | ||
| } | ||
| else { | ||
| return () => { }; | ||
| } | ||
| } | ||
| once(type, listener, options) { | ||
| const unsub = this.addEventListener(type, async (ev) => { | ||
| try { | ||
| await listener(ev); | ||
| } | ||
| finally { | ||
| (0, core_1.onNextTick)(unsub); | ||
| } | ||
| }, options); | ||
| } | ||
| async whenReady(fn) { | ||
| if (!(this.connection instanceof WebSocket)) { | ||
| await fn(); | ||
| return; | ||
| } | ||
| if (this.connection.readyState === WebSocket.OPEN) { | ||
| await fn(); | ||
| } | ||
| else { | ||
| this.once('open', async () => { | ||
| await fn(); | ||
| }); | ||
| } | ||
| } | ||
| connect() { | ||
| this.connection = this.factory(); | ||
| this.connection.binaryType = "arraybuffer"; | ||
| this.addEventListener("message", async (ev) => { | ||
| if (ev.data instanceof ArrayBuffer) { | ||
| const buff = new binencode_1.BinaryBuffer(); | ||
| buff.data = new Uint8Array(ev.data); | ||
| try { | ||
| const decoded = binencode_1.serial.decode(buff); | ||
| await this.ps.publishAsync(decoded); | ||
| } | ||
| catch (e) { | ||
| console.error(e); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| sendBinary(data) { | ||
@@ -42,4 +83,6 @@ const encoded = binencode_1.serial.encode(data); | ||
| } | ||
| send(data) { | ||
| return this.sendBinary(binencode_1.bin.auto(data)); | ||
| async send(data) { | ||
| await this.whenReady(() => { | ||
| this.sendBinary(binencode_1.bin.auto(data)); | ||
| }); | ||
| } | ||
@@ -46,0 +89,0 @@ watch(pat, fn) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":";;;AAAA,yCAAmE;AAEnE,mCAA6E;AAC7E,2CAAuD;AAOvD,MAAa,MAAM;IAGjB,UAAU,CAAQ;IAClB,OAAO,CAAa;IACpB,EAAE,CAAgB;IAElB,YAAY,OAAmB,EAAE,OAAqB,EAAE;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,IAAA,aAAM,GAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,aAAa,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QAE5B,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC3C,IAAI,EAAE,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;oBACnC,MAAM,IAAI,GAAG,IAAI,wBAAY,EAAE,CAAC;oBAChC,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,kBAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACpC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,MAAM,OAAO,GAAG,kBAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAI,IAAO;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,eAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAGD,KAAK,CACH,GAAM,EACN,EAAqD;QAErD,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,kBAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,gBAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAvDD,wBAuDC"} | ||
| {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"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"} |
| import { type Binary } from "binencode"; | ||
| import { type WebSocket as WSWebSocket } from "ws"; | ||
| import { type InferPattern, type PatLoose } from 'p-lens'; | ||
| import { type InferPattern, type PatLoose } from "p-lens"; | ||
| import { type PubSub } from "@derivesome/core"; | ||
@@ -9,10 +9,14 @@ export type WebSocketImplementation = WebSocket | WSWebSocket; | ||
| connection: Impl; | ||
| factory: () => Impl; | ||
| private factory; | ||
| ps: PubSub<Binary>; | ||
| private cleanups; | ||
| constructor(factory: () => Impl, _cfg?: SocketConfig); | ||
| addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions, autoCleanup?: boolean): () => void; | ||
| once<K extends keyof WebSocketEventMap>(type: K, listener: (ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; | ||
| whenReady(fn: () => (void | Promise<void>)): Promise<void>; | ||
| private connect; | ||
| sendBinary(data: Binary): void; | ||
| send<T>(data: T): void; | ||
| watch<P extends PatLoose>(pat: P, fn: (data: InferPattern<P>) => (void | Promise<void>)): import("@derivesome/core").VoidFunction; | ||
| send<T>(data: T): Promise<void>; | ||
| watch<P extends PatLoose>(pat: P, fn: (data: InferPattern<P>) => void | Promise<void>): import("@derivesome/core").VoidFunction; | ||
| } | ||
| //# sourceMappingURL=socket.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC;AACnD,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,EAC1B,CAAA;AAED,qBAAa,MAAM,CACjB,IAAI,SAAS,uBAAuB,GAAG,uBAAuB;IAE9D,UAAU,EAAG,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;gBAEN,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,YAAiB;IAMxD,OAAO,CAAC,OAAO;IAqBf,UAAU,CAAC,IAAI,EAAE,MAAM;IAKvB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAKf,KAAK,CAAC,CAAC,SAAS,QAAQ,EACtB,GAAG,EAAE,CAAC,EACN,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CASxD"} | ||
| {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,IAAI,CAAC;AACnD,OAAO,EAAW,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAU,KAAK,MAAM,EAAc,MAAM,kBAAkB,CAAC;AAEnE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,EAAE,CAAC;AAE9B,qBAAa,MAAM,CACjB,IAAI,SAAS,uBAAuB,GAAG,uBAAuB;IAE9D,UAAU,EAAG,IAAI,CAAC;IAClB,OAAO,CAAC,OAAO,CAAa;IAC5B,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,QAAQ,CAA8B;gBAElC,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,YAAiB;IAMxD,gBAAgB,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAChD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,GAAG,EAC5D,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,EAC3C,WAAW,CAAC,EAAE,OAAO,GACpB,MAAM,IAAI;IAkBb,IAAI,CAAC,CAAC,SAAS,MAAM,iBAAiB,EACpC,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,GAAG,EAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB;IAevC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAehD,OAAO,CAAC,OAAO;IAkBf,UAAU,CAAC,IAAI,EAAE,MAAM;IAKjB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAMrB,KAAK,CAAC,CAAC,SAAS,QAAQ,EACtB,GAAG,EAAE,CAAC,EACN,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAStD"} |
+61
-18
| import { bin, BinaryBuffer, serial } from "binencode"; | ||
| import { pattern } from 'p-lens'; | ||
| import { pubsub } from "@derivesome/core"; | ||
| import { pattern } from "p-lens"; | ||
| import { pubsub, onNextTick } from "@derivesome/core"; | ||
| export class Socket { | ||
@@ -8,2 +8,3 @@ connection; | ||
| ps; | ||
| cleanups = new Set(); | ||
| constructor(factory, _cfg = {}) { | ||
@@ -14,22 +15,62 @@ this.factory = factory; | ||
| } | ||
| connect() { | ||
| this.connection = this.factory(); | ||
| this.connection.binaryType = "arraybuffer"; | ||
| addEventListener(type, listener, options, autoCleanup) { | ||
| const con = this.connection; | ||
| if (con instanceof WebSocket) { | ||
| con.addEventListener('message', async (ev) => { | ||
| if (ev.data instanceof ArrayBuffer) { | ||
| const buff = new BinaryBuffer(); | ||
| buff.data = new Uint8Array(ev.data); | ||
| try { | ||
| const decoded = serial.decode(buff); | ||
| await this.ps.publishAsync(decoded); | ||
| } | ||
| catch (e) { | ||
| console.error(e); | ||
| } | ||
| con.addEventListener(type, listener, options); | ||
| const unsub = () => { | ||
| try { | ||
| con.removeEventListener(type, listener, options); | ||
| } | ||
| catch { } | ||
| }; | ||
| if (autoCleanup !== false) { | ||
| this.cleanups.add(unsub); | ||
| } | ||
| return unsub; | ||
| } | ||
| else { | ||
| return () => { }; | ||
| } | ||
| } | ||
| once(type, listener, options) { | ||
| const unsub = this.addEventListener(type, async (ev) => { | ||
| try { | ||
| await listener(ev); | ||
| } | ||
| finally { | ||
| onNextTick(unsub); | ||
| } | ||
| }, options); | ||
| } | ||
| async whenReady(fn) { | ||
| if (!(this.connection instanceof WebSocket)) { | ||
| await fn(); | ||
| return; | ||
| } | ||
| if (this.connection.readyState === WebSocket.OPEN) { | ||
| await fn(); | ||
| } | ||
| else { | ||
| this.once('open', async () => { | ||
| await fn(); | ||
| }); | ||
| } | ||
| } | ||
| connect() { | ||
| this.connection = this.factory(); | ||
| this.connection.binaryType = "arraybuffer"; | ||
| this.addEventListener("message", async (ev) => { | ||
| if (ev.data instanceof ArrayBuffer) { | ||
| const buff = new BinaryBuffer(); | ||
| buff.data = new Uint8Array(ev.data); | ||
| try { | ||
| const decoded = serial.decode(buff); | ||
| await this.ps.publishAsync(decoded); | ||
| } | ||
| catch (e) { | ||
| console.error(e); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| sendBinary(data) { | ||
@@ -39,4 +80,6 @@ const encoded = serial.encode(data); | ||
| } | ||
| send(data) { | ||
| return this.sendBinary(bin.auto(data)); | ||
| async send(data) { | ||
| await this.whenReady(() => { | ||
| this.sendBinary(bin.auto(data)); | ||
| }); | ||
| } | ||
@@ -43,0 +86,0 @@ watch(pat, fn) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAe,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAY,OAAO,EAAoC,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAe,MAAM,kBAAkB,CAAC;AAOvD,MAAM,OAAO,MAAM;IAGjB,UAAU,CAAQ;IAClB,OAAO,CAAa;IACpB,EAAE,CAAgB;IAElB,YAAY,OAAmB,EAAE,OAAqB,EAAE;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,aAAa,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QAE5B,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC3C,IAAI,EAAE,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;oBACnC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;oBAChC,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACpC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAI,IAAO;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAGD,KAAK,CACH,GAAM,EACN,EAAqD;QAErD,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"} | ||
| {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"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"} |
+2
-2
| { | ||
| "name": "@derivesome/sockets", | ||
| "version": "1.0.7", | ||
| "version": "1.0.8", | ||
| "description": "", | ||
@@ -70,3 +70,3 @@ "main": "./dist/cjs/index.js", | ||
| "ws": "^8.19.0", | ||
| "@derivesome/core": "1.0.1" | ||
| "@derivesome/core": "1.0.2" | ||
| }, | ||
@@ -73,0 +73,0 @@ "scripts": { |
+79
-25
| import { bin, BinaryBuffer, serial, type Binary } from "binencode"; | ||
| import { type WebSocket as WSWebSocket } from "ws"; | ||
| import { type Pat, pattern, type InferPattern, type PatLoose } from 'p-lens'; | ||
| import { pubsub, type PubSub } from "@derivesome/core"; | ||
| import { pattern, type InferPattern, type PatLoose } from "p-lens"; | ||
| import { pubsub, type PubSub, onNextTick } from "@derivesome/core"; | ||
| export type WebSocketImplementation = WebSocket | WSWebSocket; | ||
| export type SocketConfig = { | ||
| } | ||
| export type SocketConfig = {}; | ||
@@ -15,4 +14,5 @@ export class Socket< | ||
| connection!: Impl; | ||
| factory: () => Impl; | ||
| ps: PubSub<Binary> | ||
| private factory: () => Impl; | ||
| ps: PubSub<Binary>; | ||
| private cleanups: Set<() => void> = new Set(); | ||
@@ -25,23 +25,76 @@ constructor(factory: () => Impl, _cfg: SocketConfig = {}) { | ||
| private connect() { | ||
| this.connection = this.factory(); | ||
| this.connection.binaryType = "arraybuffer"; | ||
| addEventListener<K extends keyof WebSocketEventMap>( | ||
| type: K, | ||
| listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, | ||
| options?: boolean | AddEventListenerOptions, | ||
| autoCleanup?: boolean, | ||
| ): () => void { | ||
| const con = this.connection; | ||
| if (con instanceof WebSocket) { | ||
| con.addEventListener('message', async (ev) => { | ||
| if (ev.data instanceof ArrayBuffer) { | ||
| const buff = new BinaryBuffer(); | ||
| buff.data = new Uint8Array(ev.data); | ||
| try { | ||
| const decoded = serial.decode(buff); | ||
| await this.ps.publishAsync(decoded); | ||
| } catch (e) { | ||
| console.error(e); | ||
| } | ||
| con.addEventListener(type, listener, options); | ||
| const unsub = () => { | ||
| try { | ||
| con.removeEventListener(type, listener, options); | ||
| } catch {} | ||
| }; | ||
| if (autoCleanup !== false) { | ||
| this.cleanups.add(unsub); | ||
| } | ||
| return unsub; | ||
| } else { | ||
| return () => {}; | ||
| } | ||
| } | ||
| once<K extends keyof WebSocketEventMap>( | ||
| type: K, | ||
| listener: (ev: WebSocketEventMap[K]) => any, | ||
| options?: boolean | AddEventListenerOptions, | ||
| ) { | ||
| const unsub = this.addEventListener( | ||
| type, | ||
| async (ev) => { | ||
| try { | ||
| await listener(ev); | ||
| } finally { | ||
| onNextTick(unsub); | ||
| } | ||
| }) | ||
| }, | ||
| options, | ||
| ); | ||
| } | ||
| async whenReady(fn: () => (void | Promise<void>)) { | ||
| if (!(this.connection instanceof WebSocket)) { | ||
| await fn(); | ||
| return; | ||
| } | ||
| if (this.connection.readyState === WebSocket.OPEN) { | ||
| await fn(); | ||
| } else { | ||
| this.once('open', async () => { | ||
| await fn(); | ||
| }); | ||
| } | ||
| } | ||
| private connect() { | ||
| this.connection = this.factory(); | ||
| this.connection.binaryType = "arraybuffer"; | ||
| this.addEventListener("message", async (ev) => { | ||
| if (ev.data instanceof ArrayBuffer) { | ||
| const buff = new BinaryBuffer(); | ||
| buff.data = new Uint8Array(ev.data); | ||
| try { | ||
| const decoded = serial.decode(buff); | ||
| await this.ps.publishAsync(decoded); | ||
| } catch (e) { | ||
| console.error(e); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| sendBinary(data: Binary) { | ||
@@ -52,10 +105,11 @@ const encoded = serial.encode(data); | ||
| send<T>(data: T) { | ||
| return this.sendBinary(bin.auto(data)); | ||
| async send<T>(data: T) { | ||
| await this.whenReady(() => { | ||
| this.sendBinary(bin.auto(data)) | ||
| }); | ||
| } | ||
| watch<P extends PatLoose>( | ||
| pat: P, | ||
| fn: (data: InferPattern<P>) => (void | Promise<void>) | ||
| fn: (data: InferPattern<P>) => void | Promise<void>, | ||
| ) { | ||
@@ -62,0 +116,0 @@ return this.ps.subscribe(async (binary) => { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
2482964
9.69%1490
10.78%+ Added
- Removed
Updated