@spider-mesh/ws 1.0.146 → 2.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +240 -0
- package/build/examples/websocket-client.d.ts +1 -0
- package/build/examples/websocket-client.js +18 -0
- package/build/examples/websocket-client.js.map +1 -0
- package/build/examples/websocket-e2e-client.d.ts +1 -0
- package/build/examples/websocket-e2e-client.js +38 -0
- package/build/examples/websocket-e2e-client.js.map +1 -0
- package/build/examples/websocket-e2e-matrix-client.d.ts +1 -0
- package/build/examples/websocket-e2e-matrix-client.js +68 -0
- package/build/examples/websocket-e2e-matrix-client.js.map +1 -0
- package/build/examples/websocket-e2e-matrix-provider.d.ts +1 -0
- package/build/examples/websocket-e2e-matrix-provider.js +42 -0
- package/build/examples/websocket-e2e-matrix-provider.js.map +1 -0
- package/build/examples/websocket-e2e-matrix-test.d.ts +1 -0
- package/build/examples/websocket-e2e-matrix-test.js +85 -0
- package/build/examples/websocket-e2e-matrix-test.js.map +1 -0
- package/build/examples/websocket-e2e-provider.d.ts +1 -0
- package/build/examples/websocket-e2e-provider.js +23 -0
- package/build/examples/websocket-e2e-provider.js.map +1 -0
- package/build/examples/websocket-e2e-reverse-client.d.ts +1 -0
- package/build/examples/websocket-e2e-reverse-client.js +23 -0
- package/build/examples/websocket-e2e-reverse-client.js.map +1 -0
- package/build/examples/websocket-e2e-reverse-server.d.ts +1 -0
- package/build/examples/websocket-e2e-reverse-server.js +38 -0
- package/build/examples/websocket-e2e-reverse-server.js.map +1 -0
- package/build/examples/websocket-e2e-reverse-test.d.ts +1 -0
- package/build/examples/websocket-e2e-reverse-test.js +85 -0
- package/build/examples/websocket-e2e-reverse-test.js.map +1 -0
- package/build/examples/websocket-e2e-round-robin-client.d.ts +1 -0
- package/build/examples/websocket-e2e-round-robin-client.js +42 -0
- package/build/examples/websocket-e2e-round-robin-client.js.map +1 -0
- package/build/examples/websocket-e2e-round-robin-test.d.ts +1 -0
- package/build/examples/websocket-e2e-round-robin-test.js +93 -0
- package/build/examples/websocket-e2e-round-robin-test.js.map +1 -0
- package/build/examples/websocket-e2e-test.d.ts +1 -0
- package/build/examples/websocket-e2e-test.js +85 -0
- package/build/examples/websocket-e2e-test.js.map +1 -0
- package/build/examples/websocket-provider.d.ts +1 -0
- package/build/examples/websocket-provider.js +21 -0
- package/build/examples/websocket-provider.js.map +1 -0
- package/build/examples/websocket-server.d.ts +1 -0
- package/build/examples/websocket-server.js +6 -0
- package/build/examples/websocket-server.js.map +1 -0
- package/build/examples/websocket-smoke-test.d.ts +1 -0
- package/build/examples/websocket-smoke-test.js +170 -0
- package/build/examples/websocket-smoke-test.js.map +1 -0
- package/build/src/WebsocketRelayServer.d.ts +24 -0
- package/build/src/WebsocketRelayServer.js +239 -0
- package/build/src/WebsocketRelayServer.js.map +1 -0
- package/build/src/WebsocketTransporter.d.ts +28 -0
- package/build/src/WebsocketTransporter.js +276 -0
- package/build/src/WebsocketTransporter.js.map +1 -0
- package/build/src/index.d.ts +1 -1
- package/build/src/index.js +1 -1
- package/build/src/index.js.map +1 -1
- package/build/src/relay-server.d.ts +1 -0
- package/build/src/relay-server.js +2 -0
- package/build/src/relay-server.js.map +1 -0
- package/build/src/websocketProtocol.d.ts +52 -0
- package/build/src/websocketProtocol.js +39 -0
- package/build/src/websocketProtocol.js.map +1 -0
- package/build/tests/helpers/runBunScript.d.ts +6 -0
- package/build/tests/helpers/runBunScript.js +46 -0
- package/build/tests/helpers/runBunScript.js.map +1 -0
- package/build/tests/websocket-spidermesh-matrix.e2e.test.d.ts +1 -0
- package/build/tests/websocket-spidermesh-matrix.e2e.test.js +13 -0
- package/build/tests/websocket-spidermesh-matrix.e2e.test.js.map +1 -0
- package/build/tests/websocket-spidermesh-reverse.e2e.test.d.ts +1 -0
- package/build/tests/websocket-spidermesh-reverse.e2e.test.js +9 -0
- package/build/tests/websocket-spidermesh-reverse.e2e.test.js.map +1 -0
- package/build/tests/websocket-spidermesh-round-robin.e2e.test.d.ts +1 -0
- package/build/tests/websocket-spidermesh-round-robin.e2e.test.js +20 -0
- package/build/tests/websocket-spidermesh-round-robin.e2e.test.js.map +1 -0
- package/build/tests/websocket-spidermesh.e2e.test.d.ts +1 -0
- package/build/tests/websocket-spidermesh.e2e.test.js +9 -0
- package/build/tests/websocket-spidermesh.e2e.test.js.map +1 -0
- package/build/tests/websocket-transporter.e2e.test.d.ts +1 -0
- package/build/tests/websocket-transporter.e2e.test.js +9 -0
- package/build/tests/websocket-transporter.e2e.test.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +29 -15
- package/tsconfig.json +7 -7
- package/build/src/SpiderMeshWebsocketTransporter.d.ts +0 -16
- package/build/src/SpiderMeshWebsocketTransporter.js +0 -159
- package/build/src/SpiderMeshWebsocketTransporter.js.map +0 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { decode, encode } from '@msgpack/msgpack';
|
|
2
|
+
export function encodeRelayFrame(frame) {
|
|
3
|
+
return encode(frame);
|
|
4
|
+
}
|
|
5
|
+
export function decodeRelayFrame(raw) {
|
|
6
|
+
try {
|
|
7
|
+
return decode(raw);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function normalizeRelayRawData(raw) {
|
|
14
|
+
if (raw instanceof Uint8Array)
|
|
15
|
+
return raw;
|
|
16
|
+
if (Array.isArray(raw))
|
|
17
|
+
return concatUint8Arrays(raw.map(chunk => normalizeRelayRawData(chunk)));
|
|
18
|
+
if (raw instanceof ArrayBuffer)
|
|
19
|
+
return new Uint8Array(raw);
|
|
20
|
+
return asUint8Array(raw);
|
|
21
|
+
}
|
|
22
|
+
function concatUint8Arrays(chunks) {
|
|
23
|
+
const size = chunks.reduce((total, chunk) => total + chunk.length, 0);
|
|
24
|
+
const merged = new Uint8Array(size);
|
|
25
|
+
let offset = 0;
|
|
26
|
+
for (const chunk of chunks) {
|
|
27
|
+
merged.set(chunk, offset);
|
|
28
|
+
offset += chunk.length;
|
|
29
|
+
}
|
|
30
|
+
return merged;
|
|
31
|
+
}
|
|
32
|
+
function asUint8Array(raw) {
|
|
33
|
+
if (raw instanceof Uint8Array)
|
|
34
|
+
return raw;
|
|
35
|
+
if (ArrayBuffer.isView(raw))
|
|
36
|
+
return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength);
|
|
37
|
+
return new Uint8Array(raw);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=websocketProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocketProtocol.js","sourceRoot":"","sources":["../../src/websocketProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAgDjD,MAAM,UAAU,gBAAgB,CAAC,KAAsC;IACnE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC5C,IAAI,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAoC,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAsB;IACxD,IAAI,GAAG,YAAY,UAAU;QAAE,OAAO,GAAG,CAAA;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChG,IAAI,GAAG,YAAY,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;IAC1D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED,OAAO,MAAM,CAAA;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,GAAsC;IACxD,IAAI,GAAG,YAAY,UAAU;QAAE,OAAO,GAAG,CAAA;IACzC,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;IAC9F,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export async function runBunScript(args, timeoutMs = 15000, env = {}) {
|
|
3
|
+
return await new Promise((resolve, reject) => {
|
|
4
|
+
const child = spawn('bun', args, {
|
|
5
|
+
cwd: new URL('../..', import.meta.url),
|
|
6
|
+
env: {
|
|
7
|
+
...process.env,
|
|
8
|
+
...env,
|
|
9
|
+
},
|
|
10
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
11
|
+
});
|
|
12
|
+
const stdout = child.stdout;
|
|
13
|
+
const stderr = child.stderr;
|
|
14
|
+
if (!stdout || !stderr) {
|
|
15
|
+
reject(new Error('Missing piped stdout/stderr from bun child process'));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
let stdoutText = '';
|
|
19
|
+
let stderrText = '';
|
|
20
|
+
const cleanup = () => {
|
|
21
|
+
clearTimeout(timer);
|
|
22
|
+
stdout.off('data', onStdout);
|
|
23
|
+
stderr.off('data', onStderr);
|
|
24
|
+
child.off('exit', onExit);
|
|
25
|
+
};
|
|
26
|
+
const onStdout = (chunk) => {
|
|
27
|
+
stdoutText += chunk.toString();
|
|
28
|
+
};
|
|
29
|
+
const onStderr = (chunk) => {
|
|
30
|
+
stderrText += chunk.toString();
|
|
31
|
+
};
|
|
32
|
+
const onExit = (code) => {
|
|
33
|
+
cleanup();
|
|
34
|
+
resolve({ code, stdout: stdoutText, stderr: stderrText });
|
|
35
|
+
};
|
|
36
|
+
const timer = setTimeout(() => {
|
|
37
|
+
cleanup();
|
|
38
|
+
child.kill('SIGTERM');
|
|
39
|
+
reject(new Error(`bun ${args.join(' ')} timed out after ${timeoutMs}ms\nstdout:\n${stdoutText}\nstderr:\n${stderrText}`));
|
|
40
|
+
}, timeoutMs);
|
|
41
|
+
stdout.on('data', onStdout);
|
|
42
|
+
stderr.on('data', onStderr);
|
|
43
|
+
child.on('exit', onExit);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=runBunScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runBunScript.js","sourceRoot":"","sources":["../../../tests/helpers/runBunScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAQ1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,SAAS,GAAG,KAAK,EAAE,MAA8B,EAAE;IAClG,OAAO,MAAM,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACtC,GAAG,EAAE;gBACD,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,GAAG;aACT;YACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAA;YACvE,OAAM;QACV,CAAC;QAED,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,UAAU,GAAG,EAAE,CAAA;QAEnB,MAAM,OAAO,GAAG,GAAG,EAAE;YACjB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC7B,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,EAAE;YACnC,OAAO,EAAE,CAAA;YACT,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QAC7D,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,OAAO,EAAE,CAAA;YACT,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,SAAS,gBAAgB,UAAU,cAAc,UAAU,EAAE,CAAC,CAAC,CAAA;QAC7H,CAAC,EAAE,SAAS,CAAC,CAAA;QAEb,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { expect, test } from 'bun:test';
|
|
2
|
+
import { runBunScript } from './helpers/runBunScript.js';
|
|
3
|
+
test('websocket spidermesh rpc matrix e2e', async () => {
|
|
4
|
+
const result = await runBunScript(['run', 'examples/websocket-e2e-matrix-test.ts'], 25000);
|
|
5
|
+
expect(result.code).toBe(0);
|
|
6
|
+
expect(result.stderr).toBe('');
|
|
7
|
+
expect(result.stdout).toContain('"syncValue":"sync:case-sync"');
|
|
8
|
+
expect(result.stdout).toContain('"asyncValue":"async:case-async"');
|
|
9
|
+
expect(result.stdout).toContain('"syncObservable":["sync-observable:case-sync-observable:1","sync-observable:case-sync-observable:2"]');
|
|
10
|
+
expect(result.stdout).toContain('"asyncObservable":["async-observable:case-async-observable:1","async-observable:case-async-observable:2"]');
|
|
11
|
+
expect(result.stdout).toContain('"errors":["sync-error","async-error","observable-error"]');
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=websocket-spidermesh-matrix.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-spidermesh-matrix.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh-matrix.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAIxD,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;IACnD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,uCAAuC,CAAC,EAAE,KAAK,CAAC,CAAA;IAE1F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;IAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAA;IAClE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sGAAsG,CAAC,CAAA;IACvI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2GAA2G,CAAC,CAAA;IAC5I,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0DAA0D,CAAC,CAAA;AAC/F,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { expect, test } from 'bun:test';
|
|
2
|
+
import { runBunScript } from './helpers/runBunScript.js';
|
|
3
|
+
test('websocket spidermesh reverse rpc e2e', async () => {
|
|
4
|
+
const result = await runBunScript(['run', 'examples/websocket-e2e-reverse-test.ts'], 20000);
|
|
5
|
+
expect(result.code).toBe(0);
|
|
6
|
+
expect(result.stderr).toBe('');
|
|
7
|
+
expect(result.stdout).toContain('hello from server from client');
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=websocket-spidermesh-reverse.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-spidermesh-reverse.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh-reverse.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;IACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,wCAAwC,CAAC,EAAE,KAAK,CAAC,CAAA;IAE3F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAA;AACpE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect, setDefaultTimeout, test } from 'bun:test';
|
|
2
|
+
import { runBunScript } from './helpers/runBunScript.js';
|
|
3
|
+
setDefaultTimeout(30000);
|
|
4
|
+
test('websocket spidermesh round-robin e2e', async () => {
|
|
5
|
+
const result = await runBunScript(['run', 'examples/websocket-e2e-round-robin-test.ts'], 25000);
|
|
6
|
+
expect(result.code).toBe(0);
|
|
7
|
+
expect(result.stderr).toBe('');
|
|
8
|
+
const jsonLine = result.stdout.split('\n').find(line => line.includes('"results":['));
|
|
9
|
+
expect(jsonLine).toBeDefined();
|
|
10
|
+
const payload = JSON.parse(jsonLine);
|
|
11
|
+
const providers = payload.results.map(result => result.split(' from ')[1]);
|
|
12
|
+
expect(payload.results).toHaveLength(4);
|
|
13
|
+
expect(new Set(providers).size).toBe(2);
|
|
14
|
+
expect(providers[0]).toContain('provider-');
|
|
15
|
+
expect(providers[1]).toContain('provider-');
|
|
16
|
+
expect(providers[0]).not.toBe(providers[1]);
|
|
17
|
+
expect(providers[0]).toBe(providers[2]);
|
|
18
|
+
expect(providers[1]).toBe(providers[3]);
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=websocket-spidermesh-round-robin.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-spidermesh-round-robin.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh-round-robin.e2e.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,iBAAiB,CAAC,KAAK,CAAC,CAAA;AAExB,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;IACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,4CAA4C,CAAC,EAAE,KAAK,CAAC,CAAA;IAE/F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;IACrF,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,CAA0B,CAAA;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE1E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { expect, test } from 'bun:test';
|
|
2
|
+
import { runBunScript } from './helpers/runBunScript.js';
|
|
3
|
+
test('websocket spidermesh rpc e2e', async () => {
|
|
4
|
+
const result = await runBunScript(['run', 'examples/websocket-e2e-test.ts'], 20000);
|
|
5
|
+
expect(result.code).toBe(0);
|
|
6
|
+
expect(result.stderr).toBe('');
|
|
7
|
+
expect(result.stdout).toContain('hello websocket e2e from provider');
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=websocket-spidermesh.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-spidermesh.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,gCAAgC,CAAC,EAAE,KAAK,CAAC,CAAA;IAEnF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { expect, test } from 'bun:test';
|
|
2
|
+
import { runBunScript } from './helpers/runBunScript.js';
|
|
3
|
+
test('websocket transporter e2e', async () => {
|
|
4
|
+
const result = await runBunScript(['run', 'examples/websocket-smoke-test.ts'], 20000);
|
|
5
|
+
expect(result.code).toBe(0);
|
|
6
|
+
expect(result.stderr).toBe('');
|
|
7
|
+
expect(result.stdout).toContain('WebSocket binary smoke test passed');
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=websocket-transporter.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-transporter.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-transporter.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,kCAAkC,CAAC,EAAE,KAAK,CAAC,CAAA;IAErF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;AACzE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../examples/websocket-client.ts","../examples/websocket-e2e-client.ts","../examples/websocket-e2e-matrix-client.ts","../examples/websocket-e2e-matrix-provider.ts","../examples/websocket-e2e-matrix-test.ts","../examples/websocket-e2e-provider.ts","../examples/websocket-e2e-reverse-client.ts","../examples/websocket-e2e-reverse-server.ts","../examples/websocket-e2e-reverse-test.ts","../examples/websocket-e2e-round-robin-client.ts","../examples/websocket-e2e-round-robin-test.ts","../examples/websocket-e2e-test.ts","../examples/websocket-provider.ts","../examples/websocket-server.ts","../examples/websocket-smoke-test.ts","../src/websocketrelayserver.ts","../src/websockettransporter.ts","../src/index.ts","../src/relay-server.ts","../src/websocketprotocol.ts"],"version":"6.0.3"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spider-mesh/ws",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
5
|
-
"description": "
|
|
4
|
+
"version": "2.0.38",
|
|
5
|
+
"description": "Built-in WebSocket transporter and relay server for Spider Mesh",
|
|
6
6
|
"main": "./build/src/index.js",
|
|
7
7
|
"types": "./build/src/index.d.ts",
|
|
8
8
|
"repository": {
|
|
@@ -13,13 +13,15 @@
|
|
|
13
13
|
"tsconfig.json",
|
|
14
14
|
"yarn.lock"
|
|
15
15
|
],
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"@spider-mesh/core": "^2.0.38"
|
|
18
|
+
},
|
|
16
19
|
"devDependencies": {
|
|
17
|
-
"@spider-mesh/core": "
|
|
18
|
-
"@types/
|
|
19
|
-
"@types/
|
|
20
|
-
"@types/
|
|
21
|
-
"
|
|
22
|
-
"typescript": "^5.0.4"
|
|
20
|
+
"@spider-mesh/core": "file:../core",
|
|
21
|
+
"@types/bun": "^1.3.13",
|
|
22
|
+
"@types/node": "^25.6.0",
|
|
23
|
+
"@types/ws": "^8.18.1",
|
|
24
|
+
"typescript": "^6.0.3"
|
|
23
25
|
},
|
|
24
26
|
"exports": {
|
|
25
27
|
".": {
|
|
@@ -27,21 +29,33 @@
|
|
|
27
29
|
"types": "./build/src/index.d.ts",
|
|
28
30
|
"default": "./build/src/index.js"
|
|
29
31
|
}
|
|
32
|
+
},
|
|
33
|
+
"./relay-server": {
|
|
34
|
+
"import": {
|
|
35
|
+
"types": "./build/src/relay-server.d.ts",
|
|
36
|
+
"default": "./build/src/relay-server.js"
|
|
37
|
+
}
|
|
30
38
|
}
|
|
31
39
|
},
|
|
32
40
|
"scripts": {
|
|
33
|
-
"
|
|
34
|
-
"
|
|
41
|
+
"build": "tsc -v && tsc -b tsconfig.json",
|
|
42
|
+
"example:websocket:server": "bun run examples/websocket-server.ts",
|
|
43
|
+
"example:websocket:provider": "bun run examples/websocket-provider.ts",
|
|
44
|
+
"example:websocket:client": "bun run examples/websocket-client.ts",
|
|
45
|
+
"test:websocket": "bun run examples/websocket-smoke-test.ts",
|
|
46
|
+
"test:websocket:e2e": "bun run examples/websocket-e2e-test.ts",
|
|
47
|
+
"test:websocket:e2e:matrix": "bun run examples/websocket-e2e-matrix-test.ts",
|
|
48
|
+
"test:websocket:e2e:reverse": "bun run examples/websocket-e2e-reverse-test.ts",
|
|
49
|
+
"test:e2e": "bun test tests/websocket-transporter.e2e.test.ts && bun test tests/websocket-spidermesh.e2e.test.ts && bun test tests/websocket-spidermesh-reverse.e2e.test.ts && bun test tests/websocket-spidermesh-matrix.e2e.test.ts && bun test tests/websocket-spidermesh-round-robin.e2e.test.ts"
|
|
35
50
|
},
|
|
36
51
|
"author": "Duong Van Ba",
|
|
37
52
|
"license": "ISC",
|
|
38
53
|
"dependencies": {
|
|
39
|
-
"
|
|
40
|
-
"rxjs": "^7.8.
|
|
41
|
-
"
|
|
42
|
-
"ws": "^8.18.0"
|
|
54
|
+
"@msgpack/msgpack": "^3.1.3",
|
|
55
|
+
"rxjs": "^7.8.2",
|
|
56
|
+
"ws": "^8.20.0"
|
|
43
57
|
},
|
|
44
58
|
"browser": {
|
|
45
59
|
"crypto": false
|
|
46
60
|
}
|
|
47
|
-
}
|
|
61
|
+
}
|
package/tsconfig.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"strict": true,
|
|
3
|
+
"strict": true,
|
|
4
4
|
"module": "NodeNext",
|
|
5
5
|
"declaration": true,
|
|
6
6
|
"removeComments": true,
|
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
"experimentalDecorators": true,
|
|
10
10
|
"target": "ESNext",
|
|
11
11
|
"sourceMap": true,
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"strictPropertyInitialization": false ,
|
|
12
|
+
"moduleResolution": "NodeNext",
|
|
13
|
+
"strictPropertyInitialization": false,
|
|
15
14
|
"outDir": "./build",
|
|
16
15
|
"incremental": false,
|
|
17
16
|
"useDefineForClassFields": true,
|
|
@@ -25,14 +24,15 @@
|
|
|
25
24
|
],
|
|
26
25
|
"esModuleInterop": true,
|
|
27
26
|
"importHelpers": true,
|
|
28
|
-
"strictNullChecks": true
|
|
27
|
+
"strictNullChecks": true,
|
|
28
|
+
"skipLibCheck": true
|
|
29
29
|
},
|
|
30
30
|
"exclude": [
|
|
31
31
|
"node_modules",
|
|
32
32
|
"out",
|
|
33
33
|
"src/schema.ts",
|
|
34
34
|
"bin",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
35
|
+
"tests",
|
|
36
|
+
"./build/**/*"
|
|
37
37
|
]
|
|
38
38
|
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { PublishMetadata, Encodable, SpiderMeshTransporter, SpiderMeshTransporterEvent, SpiderMeshTransporterEventMetadata, TcpNodeStatus } from '@spider-mesh/core';
|
|
2
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
-
export declare class SpiderMeshWebsocketTransporter implements SpiderMeshTransporter {
|
|
4
|
-
#private;
|
|
5
|
-
readonly transporter_id: string;
|
|
6
|
-
$nodes_status: Subject<TcpNodeStatus>;
|
|
7
|
-
readonly $status: BehaviorSubject<{
|
|
8
|
-
[key: string]: "created" | "connected" | "connecting" | "disconnected";
|
|
9
|
-
}>;
|
|
10
|
-
constructor(options?: Partial<{
|
|
11
|
-
urls: string;
|
|
12
|
-
port: number;
|
|
13
|
-
}>);
|
|
14
|
-
listen<T extends Encodable, Metadata extends SpiderMeshTransporterEventMetadata>(topic: string): import("rxjs").Observable<SpiderMeshTransporterEvent<T, Metadata>>;
|
|
15
|
-
publish<T extends Encodable, Metadata extends SpiderMeshTransporterEventMetadata>(payload: PublishMetadata<T, Metadata>): Promise<void>;
|
|
16
|
-
}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { SpiderMesh, Encoder, randomUUID } from '@spider-mesh/core';
|
|
2
|
-
import { timer, fromEvent, firstValueFrom, BehaviorSubject, Subject, of, merge, interval } from 'rxjs';
|
|
3
|
-
import { finalize, map, filter, tap, retry, mergeMap, mergeAll, throttleTime, } from 'rxjs/operators';
|
|
4
|
-
import { WebSocketServer, WebSocket as NpmWebSocket } from 'ws';
|
|
5
|
-
const WebsocketClient = (typeof WebSocket !== 'undefined' ? WebSocket : NpmWebSocket);
|
|
6
|
-
const SPIDER_MESH_WEBSOCKET_SERVERS = process.env.SPIDER_MESH_WEBSOCKET_SERVERS;
|
|
7
|
-
const SPIDER_MESH_WEBSOCKET_SERVER_PORT = process.env.SPIDER_MESH_WEBSOCKET_SERVER_PORT;
|
|
8
|
-
export class SpiderMeshWebsocketTransporter {
|
|
9
|
-
transporter_id = randomUUID();
|
|
10
|
-
$nodes_status = new Subject;
|
|
11
|
-
$status = new BehaviorSubject({});
|
|
12
|
-
#listening_topics = new Map();
|
|
13
|
-
#remote_topics = new Map();
|
|
14
|
-
#nodes = new Map;
|
|
15
|
-
#$version = new BehaviorSubject(1);
|
|
16
|
-
constructor(options = {}) {
|
|
17
|
-
this.#start_client(options.urls || SPIDER_MESH_WEBSOCKET_SERVERS);
|
|
18
|
-
this.#start_server(options.port || SPIDER_MESH_WEBSOCKET_SERVER_PORT);
|
|
19
|
-
this.#sync_peers();
|
|
20
|
-
SpiderMesh.$transporters.next(this);
|
|
21
|
-
}
|
|
22
|
-
async #start_client(urls) {
|
|
23
|
-
urls && of(urls).pipe(map(urls => urls.split(',')), mergeAll(), map(url => url.trim()), mergeMap(url => of(1).pipe(mergeMap(async () => {
|
|
24
|
-
this.$status.next({
|
|
25
|
-
...this.$status.getValue(),
|
|
26
|
-
[url]: 'connecting'
|
|
27
|
-
});
|
|
28
|
-
await firstValueFrom(timer(1000));
|
|
29
|
-
const ws = new WebsocketClient(url);
|
|
30
|
-
ws.binaryType = "arraybuffer";
|
|
31
|
-
const error = await firstValueFrom(merge(fromEvent(ws, 'close').pipe(map(e => { throw new Error('Connection closed'); })), fromEvent(ws, 'error').pipe(map(e => e)), fromEvent(ws, 'open').pipe(map(() => null))));
|
|
32
|
-
if (error) {
|
|
33
|
-
this.$status.next({
|
|
34
|
-
...this.$status.getValue(),
|
|
35
|
-
[url]: 'disconnected'
|
|
36
|
-
});
|
|
37
|
-
await firstValueFrom(timer(1000));
|
|
38
|
-
throw error;
|
|
39
|
-
}
|
|
40
|
-
this.$status.next({
|
|
41
|
-
...this.$status.getValue(),
|
|
42
|
-
[url]: 'connected'
|
|
43
|
-
});
|
|
44
|
-
this.#say_hello(ws);
|
|
45
|
-
const error2 = await firstValueFrom(merge(interval(10000).pipe(tap(() => this.#ping(ws)), filter(() => false)), fromEvent(ws, 'close'), fromEvent(ws, 'error'), fromEvent(ws, 'message').pipe(map(e => e), tap(e => this.#on_message(ws, e)), filter(() => false))));
|
|
46
|
-
ws.close();
|
|
47
|
-
throw error2;
|
|
48
|
-
}), retry()))).subscribe();
|
|
49
|
-
}
|
|
50
|
-
async #start_server(port) {
|
|
51
|
-
if (!port)
|
|
52
|
-
return;
|
|
53
|
-
const wss = new WebSocketServer({ port: Number(port) });
|
|
54
|
-
wss.on('connection', (connetion) => {
|
|
55
|
-
connetion.addEventListener('message', e => this.#on_message(connetion, e));
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
#sync_peers() {
|
|
59
|
-
this.#$version.pipe(throttleTime(2000, undefined, { leading: true, trailing: true }), map(() => this.#nodes.values()), mergeAll(), tap(peer => this.#say_hello(peer.ws))).subscribe();
|
|
60
|
-
}
|
|
61
|
-
#on_message(ws, e) {
|
|
62
|
-
const data = e.data instanceof ArrayBuffer ? Buffer.from(e.data) : e.data;
|
|
63
|
-
const msg = Encoder.decode(data);
|
|
64
|
-
if (!msg)
|
|
65
|
-
return;
|
|
66
|
-
msg.received_at = Date.now();
|
|
67
|
-
if (msg.topic == '#hello')
|
|
68
|
-
return this.#sync_peer(ws, msg.payload);
|
|
69
|
-
if (msg.topic == '#ping')
|
|
70
|
-
return;
|
|
71
|
-
const map = this.#listening_topics.get(msg.topic);
|
|
72
|
-
map?.forEach(subject => subject.next(msg));
|
|
73
|
-
}
|
|
74
|
-
#sync_peer(ws, info) {
|
|
75
|
-
const is_new_peer = !this.#nodes.has(info.transporter_id);
|
|
76
|
-
this.#nodes.set(info.transporter_id, { ...info, ws });
|
|
77
|
-
for (const topic of info.listening) {
|
|
78
|
-
const set = this.#remote_topics.get(topic) || new Set();
|
|
79
|
-
set.add(info.transporter_id);
|
|
80
|
-
!this.#remote_topics.has(topic) && this.#remote_topics.set(topic, set);
|
|
81
|
-
}
|
|
82
|
-
if (!is_new_peer)
|
|
83
|
-
return;
|
|
84
|
-
this.#say_hello(ws);
|
|
85
|
-
this.$nodes_status.next({
|
|
86
|
-
online: true,
|
|
87
|
-
remote_transporter_id: info.transporter_id
|
|
88
|
-
});
|
|
89
|
-
merge(fromEvent(ws, 'close'), fromEvent(ws, 'error')).subscribe(() => {
|
|
90
|
-
this.#nodes.delete(info.transporter_id);
|
|
91
|
-
this.$nodes_status.next({
|
|
92
|
-
online: false,
|
|
93
|
-
remote_transporter_id: info.transporter_id
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
#ping(ws) {
|
|
98
|
-
const hello = {
|
|
99
|
-
created_at: Date.now(),
|
|
100
|
-
id: randomUUID(),
|
|
101
|
-
metadata: {},
|
|
102
|
-
payload: {},
|
|
103
|
-
received_at: 0,
|
|
104
|
-
sti: this.transporter_id,
|
|
105
|
-
topic: '#ping'
|
|
106
|
-
};
|
|
107
|
-
ws.send(Encoder.encode(hello));
|
|
108
|
-
}
|
|
109
|
-
#say_hello(ws) {
|
|
110
|
-
const hello = {
|
|
111
|
-
created_at: Date.now(),
|
|
112
|
-
id: randomUUID(),
|
|
113
|
-
metadata: {},
|
|
114
|
-
payload: {
|
|
115
|
-
listening: ['#hello', ...this.#listening_topics.keys()],
|
|
116
|
-
peers: [],
|
|
117
|
-
transporter_id: this.transporter_id,
|
|
118
|
-
version: this.#$version.value
|
|
119
|
-
},
|
|
120
|
-
received_at: 0,
|
|
121
|
-
sti: this.transporter_id,
|
|
122
|
-
topic: '#hello'
|
|
123
|
-
};
|
|
124
|
-
ws.send(Encoder.encode(hello));
|
|
125
|
-
}
|
|
126
|
-
listen(topic) {
|
|
127
|
-
const id = randomUUID();
|
|
128
|
-
const subject = new Subject();
|
|
129
|
-
const map = this.#listening_topics.get(topic) || new Map();
|
|
130
|
-
map.set(id, subject);
|
|
131
|
-
!this.#listening_topics.has(topic) && this.#listening_topics.set(topic, map);
|
|
132
|
-
this.#$version.next(this.#$version.value + 1);
|
|
133
|
-
return subject.pipe(finalize(() => this.#listening_topics.get(topic)?.delete(id)));
|
|
134
|
-
}
|
|
135
|
-
async publish(payload) {
|
|
136
|
-
const p = {
|
|
137
|
-
created_at: Date.now(),
|
|
138
|
-
id: randomUUID(),
|
|
139
|
-
metadata: payload.metadata,
|
|
140
|
-
payload: payload.payload,
|
|
141
|
-
received_at: Date.now(),
|
|
142
|
-
sti: this.transporter_id,
|
|
143
|
-
topic: payload.event
|
|
144
|
-
};
|
|
145
|
-
const buffer = Encoder.encode(p);
|
|
146
|
-
const rti = payload.rti;
|
|
147
|
-
if (rti) {
|
|
148
|
-
await this.#nodes.get(rti)?.ws?.send(buffer);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
for (const node_id of this.#remote_topics.get(payload.event) || []) {
|
|
152
|
-
const node = this.#nodes.get(node_id);
|
|
153
|
-
await node?.ws?.send(buffer);
|
|
154
|
-
}
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=SpiderMeshWebsocketTransporter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SpiderMeshWebsocketTransporter.js","sourceRoot":"","sources":["../../src/SpiderMeshWebsocketTransporter.ts"],"names":[],"mappings":"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"}
|