@spider-mesh/ws 1.0.146 → 2.0.37

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.
Files changed (85) hide show
  1. package/README.md +232 -0
  2. package/build/examples/websocket-client.d.ts +1 -0
  3. package/build/examples/websocket-client.js +18 -0
  4. package/build/examples/websocket-client.js.map +1 -0
  5. package/build/examples/websocket-e2e-client.d.ts +1 -0
  6. package/build/examples/websocket-e2e-client.js +38 -0
  7. package/build/examples/websocket-e2e-client.js.map +1 -0
  8. package/build/examples/websocket-e2e-matrix-client.d.ts +1 -0
  9. package/build/examples/websocket-e2e-matrix-client.js +68 -0
  10. package/build/examples/websocket-e2e-matrix-client.js.map +1 -0
  11. package/build/examples/websocket-e2e-matrix-provider.d.ts +1 -0
  12. package/build/examples/websocket-e2e-matrix-provider.js +42 -0
  13. package/build/examples/websocket-e2e-matrix-provider.js.map +1 -0
  14. package/build/examples/websocket-e2e-matrix-test.d.ts +1 -0
  15. package/build/examples/websocket-e2e-matrix-test.js +85 -0
  16. package/build/examples/websocket-e2e-matrix-test.js.map +1 -0
  17. package/build/examples/websocket-e2e-provider.d.ts +1 -0
  18. package/build/examples/websocket-e2e-provider.js +23 -0
  19. package/build/examples/websocket-e2e-provider.js.map +1 -0
  20. package/build/examples/websocket-e2e-reverse-client.d.ts +1 -0
  21. package/build/examples/websocket-e2e-reverse-client.js +23 -0
  22. package/build/examples/websocket-e2e-reverse-client.js.map +1 -0
  23. package/build/examples/websocket-e2e-reverse-server.d.ts +1 -0
  24. package/build/examples/websocket-e2e-reverse-server.js +38 -0
  25. package/build/examples/websocket-e2e-reverse-server.js.map +1 -0
  26. package/build/examples/websocket-e2e-reverse-test.d.ts +1 -0
  27. package/build/examples/websocket-e2e-reverse-test.js +85 -0
  28. package/build/examples/websocket-e2e-reverse-test.js.map +1 -0
  29. package/build/examples/websocket-e2e-round-robin-client.d.ts +1 -0
  30. package/build/examples/websocket-e2e-round-robin-client.js +42 -0
  31. package/build/examples/websocket-e2e-round-robin-client.js.map +1 -0
  32. package/build/examples/websocket-e2e-round-robin-test.d.ts +1 -0
  33. package/build/examples/websocket-e2e-round-robin-test.js +93 -0
  34. package/build/examples/websocket-e2e-round-robin-test.js.map +1 -0
  35. package/build/examples/websocket-e2e-test.d.ts +1 -0
  36. package/build/examples/websocket-e2e-test.js +85 -0
  37. package/build/examples/websocket-e2e-test.js.map +1 -0
  38. package/build/examples/websocket-provider.d.ts +1 -0
  39. package/build/examples/websocket-provider.js +21 -0
  40. package/build/examples/websocket-provider.js.map +1 -0
  41. package/build/examples/websocket-server.d.ts +1 -0
  42. package/build/examples/websocket-server.js +6 -0
  43. package/build/examples/websocket-server.js.map +1 -0
  44. package/build/examples/websocket-smoke-test.d.ts +1 -0
  45. package/build/examples/websocket-smoke-test.js +170 -0
  46. package/build/examples/websocket-smoke-test.js.map +1 -0
  47. package/build/src/WebsocketRelayServer.d.ts +24 -0
  48. package/build/src/WebsocketRelayServer.js +239 -0
  49. package/build/src/WebsocketRelayServer.js.map +1 -0
  50. package/build/src/WebsocketTransporter.d.ts +26 -0
  51. package/build/src/WebsocketTransporter.js +254 -0
  52. package/build/src/WebsocketTransporter.js.map +1 -0
  53. package/build/src/index.d.ts +1 -1
  54. package/build/src/index.js +1 -1
  55. package/build/src/index.js.map +1 -1
  56. package/build/src/relay-server.d.ts +1 -0
  57. package/build/src/relay-server.js +2 -0
  58. package/build/src/relay-server.js.map +1 -0
  59. package/build/src/websocketProtocol.d.ts +52 -0
  60. package/build/src/websocketProtocol.js +39 -0
  61. package/build/src/websocketProtocol.js.map +1 -0
  62. package/build/tests/helpers/runBunScript.d.ts +6 -0
  63. package/build/tests/helpers/runBunScript.js +46 -0
  64. package/build/tests/helpers/runBunScript.js.map +1 -0
  65. package/build/tests/websocket-spidermesh-matrix.e2e.test.d.ts +1 -0
  66. package/build/tests/websocket-spidermesh-matrix.e2e.test.js +13 -0
  67. package/build/tests/websocket-spidermesh-matrix.e2e.test.js.map +1 -0
  68. package/build/tests/websocket-spidermesh-reverse.e2e.test.d.ts +1 -0
  69. package/build/tests/websocket-spidermesh-reverse.e2e.test.js +9 -0
  70. package/build/tests/websocket-spidermesh-reverse.e2e.test.js.map +1 -0
  71. package/build/tests/websocket-spidermesh-round-robin.e2e.test.d.ts +1 -0
  72. package/build/tests/websocket-spidermesh-round-robin.e2e.test.js +20 -0
  73. package/build/tests/websocket-spidermesh-round-robin.e2e.test.js.map +1 -0
  74. package/build/tests/websocket-spidermesh.e2e.test.d.ts +1 -0
  75. package/build/tests/websocket-spidermesh.e2e.test.js +9 -0
  76. package/build/tests/websocket-spidermesh.e2e.test.js.map +1 -0
  77. package/build/tests/websocket-transporter.e2e.test.d.ts +1 -0
  78. package/build/tests/websocket-transporter.e2e.test.js +9 -0
  79. package/build/tests/websocket-transporter.e2e.test.js.map +1 -0
  80. package/build/tsconfig.tsbuildinfo +1 -0
  81. package/package.json +29 -15
  82. package/tsconfig.json +7 -7
  83. package/build/src/SpiderMeshWebsocketTransporter.d.ts +0 -16
  84. package/build/src/SpiderMeshWebsocketTransporter.js +0 -159
  85. package/build/src/SpiderMeshWebsocketTransporter.js.map +0 -1
@@ -0,0 +1,239 @@
1
+ import { WebSocket, WebSocketServer as WsServer } from 'ws';
2
+ import { fromEvent, ignoreElements, merge, mergeMap, Subscription, take, tap } from 'rxjs';
3
+ import { decodeRelayFrame, encodeRelayFrame, normalizeRelayRawData } from './websocketProtocol.js';
4
+ const relaySocketState = Symbol('relaySocketState');
5
+ export class WebsocketRelayServer {
6
+ #server;
7
+ #subscription = Subscription.EMPTY;
8
+ #nodes = new Map();
9
+ #listeners = new Map();
10
+ constructor(options = {}) {
11
+ this.#server = new WsServer({
12
+ host: options.host,
13
+ path: options.path,
14
+ port: options.port || 8787,
15
+ });
16
+ this.#subscription = fromEvent(this.#server, 'connection').pipe(mergeMap(([socket, request]) => this.on_connection(socket, request, options))).subscribe();
17
+ }
18
+ get port() {
19
+ const address = this.#server.address();
20
+ return typeof address === 'object' && address ? address.port : null;
21
+ }
22
+ close() {
23
+ this.#subscription.unsubscribe();
24
+ this.#server.close();
25
+ }
26
+ on_connection(socket, request, options) {
27
+ const isServerConnection = options.isServerConnection ? options.isServerConnection(socket, request) : true;
28
+ socket[relaySocketState] = {
29
+ isServerConnection,
30
+ };
31
+ if (isServerConnection) {
32
+ queueMicrotask(() => this.#syncClientState(socket));
33
+ }
34
+ return merge(fromEvent(socket, 'message').pipe(tap(event => {
35
+ const raw = Array.isArray(event)
36
+ ? event[0]
37
+ : (event && typeof event === 'object' && 'data' in event ? event.data : event);
38
+ this.on_message(socket, raw, isServerConnection);
39
+ }), ignoreElements()), fromEvent(socket, 'close').pipe(take(1), tap(() => this.on_close(socket)), ignoreElements()));
40
+ }
41
+ on_message(socket, raw, isServerConnection) {
42
+ const frame = this.#parseFrame(raw);
43
+ if (!frame)
44
+ return;
45
+ if (frame.type === 'hello') {
46
+ const normalized = this.#normalizeHelloFrame(socket, frame);
47
+ if (!normalized)
48
+ return;
49
+ const previous = this.#getSocketMetadata(this.#nodes.get(normalized.sender_id));
50
+ this.#registerNode(socket, normalized);
51
+ if (this.#shouldSyncDiscovery(previous, normalized.me)) {
52
+ this.#syncServerConnections();
53
+ }
54
+ return;
55
+ }
56
+ const senderId = this.#resolveSenderId(socket);
57
+ if (!senderId)
58
+ return;
59
+ const normalized = { ...frame, sender_id: senderId };
60
+ if (this.#hasTargetId(normalized) && normalized.target_id) {
61
+ if (this.#requiresServerRole(normalized) && !isServerConnection) {
62
+ return;
63
+ }
64
+ const target = this.#nodes.get(normalized.target_id);
65
+ if (target?.readyState === WebSocket.OPEN) {
66
+ target.send(encodeRelayFrame(normalized), { binary: true });
67
+ }
68
+ return;
69
+ }
70
+ const handler = this[`on_${normalized.type}`];
71
+ if (!handler) {
72
+ this.on_broadcast(normalized, socket);
73
+ return;
74
+ }
75
+ handler.call(this, normalized, socket);
76
+ }
77
+ on_close(socket) {
78
+ const nodeId = this.#resolveSenderId(socket);
79
+ if (!nodeId)
80
+ return;
81
+ this.#nodes.delete(nodeId);
82
+ this.#removeTopicListeners(nodeId);
83
+ this.on_broadcast({
84
+ type: 'offline',
85
+ sender_id: nodeId,
86
+ node_id: nodeId,
87
+ }, socket);
88
+ this.#syncServerConnections();
89
+ }
90
+ #registerNode(socket, discovery) {
91
+ const nodeId = discovery.sender_id;
92
+ const previousNodeId = this.#resolveSenderId(socket);
93
+ if (previousNodeId && previousNodeId !== nodeId) {
94
+ this.#nodes.delete(previousNodeId);
95
+ this.#removeTopicListeners(previousNodeId);
96
+ this.on_broadcast({
97
+ type: 'offline',
98
+ sender_id: previousNodeId,
99
+ node_id: previousNodeId,
100
+ }, socket);
101
+ }
102
+ this.#nodes.set(nodeId, socket);
103
+ this.#setSocketMetadata(socket, discovery.me);
104
+ }
105
+ #isServerConnection(socket) {
106
+ return socket[relaySocketState]?.isServerConnection === true;
107
+ }
108
+ #setSocketMetadata(socket, metadata) {
109
+ const relaySocket = socket;
110
+ const current = relaySocket[relaySocketState];
111
+ if (!current)
112
+ return;
113
+ relaySocket[relaySocketState] = {
114
+ isServerConnection: current.isServerConnection,
115
+ metadata,
116
+ };
117
+ }
118
+ #getSocketMetadata(socket) {
119
+ return socket ? socket[relaySocketState]?.metadata : undefined;
120
+ }
121
+ #requiresServerRole(frame) {
122
+ return frame.type === 'request' || frame.type === 'cancel';
123
+ }
124
+ #hasTargetId(frame) {
125
+ return 'target_id' in frame;
126
+ }
127
+ #normalizeHelloFrame(socket, frame) {
128
+ const senderId = frame.me?.node_id;
129
+ if (!senderId)
130
+ return null;
131
+ return {
132
+ ...frame,
133
+ sender_id: senderId,
134
+ me: {
135
+ ...frame.me,
136
+ },
137
+ };
138
+ }
139
+ #shouldSyncDiscovery(previous, next) {
140
+ if (!previous)
141
+ return true;
142
+ return !this.#hasSameServiceList(previous.services || {}, next.services || {});
143
+ }
144
+ #hasSameServiceList(left, right) {
145
+ const leftKeys = Object.keys(left).sort();
146
+ const rightKeys = Object.keys(right).sort();
147
+ if (leftKeys.length !== rightKeys.length)
148
+ return false;
149
+ for (let index = 0; index < leftKeys.length; index++) {
150
+ if (leftKeys[index] !== rightKeys[index])
151
+ return false;
152
+ }
153
+ return true;
154
+ }
155
+ #removeTopicListeners(nodeId) {
156
+ for (const [topic, listeners] of this.#listeners) {
157
+ listeners.delete(nodeId);
158
+ if (listeners.size === 0) {
159
+ this.#listeners.delete(topic);
160
+ }
161
+ }
162
+ }
163
+ #resolveSenderId(socket) {
164
+ const metadata = this.#getSocketMetadata(socket);
165
+ return metadata?.node_id || null;
166
+ }
167
+ #syncClientState(socket) {
168
+ if (!this.#isServerConnection(socket))
169
+ return;
170
+ for (const [node_id, client] of this.#nodes) {
171
+ if (socket.readyState !== WebSocket.OPEN)
172
+ return;
173
+ const metadata = this.#getSocketMetadata(client);
174
+ if (!metadata)
175
+ continue;
176
+ socket.send(encodeRelayFrame({
177
+ type: 'hello',
178
+ sender_id: node_id,
179
+ me: metadata,
180
+ }), { binary: true });
181
+ }
182
+ }
183
+ #syncServerConnections() {
184
+ for (const client of this.#server.clients) {
185
+ if (client.readyState !== WebSocket.OPEN)
186
+ continue;
187
+ if (!this.#isServerConnection(client))
188
+ continue;
189
+ this.#syncClientState(client);
190
+ }
191
+ }
192
+ on_subscribe(frame) {
193
+ this.#removeTopicListeners(frame.sender_id);
194
+ for (const topic of new Set(frame.topics.filter(Boolean))) {
195
+ const listeners = this.#listeners.get(topic) || new Set();
196
+ listeners.add(frame.sender_id);
197
+ this.#listeners.set(topic, listeners);
198
+ }
199
+ }
200
+ on_unsubscribe(frame) {
201
+ for (const topic of new Set(frame.topics.filter(Boolean))) {
202
+ const listeners = this.#listeners.get(topic);
203
+ if (!listeners)
204
+ continue;
205
+ listeners.delete(frame.sender_id);
206
+ if (listeners.size === 0) {
207
+ this.#listeners.delete(topic);
208
+ }
209
+ }
210
+ }
211
+ on_publish(frame) {
212
+ const listeners = this.#listeners.get(frame.topic);
213
+ if (!listeners || listeners.size === 0)
214
+ return;
215
+ const message = encodeRelayFrame(frame);
216
+ const delivered = new Set();
217
+ for (const nodeId of listeners) {
218
+ const client = this.#nodes.get(nodeId);
219
+ if (!client || client.readyState !== WebSocket.OPEN || delivered.has(client))
220
+ continue;
221
+ client.send(message, { binary: true });
222
+ delivered.add(client);
223
+ }
224
+ }
225
+ on_broadcast(frame, sender) {
226
+ const message = encodeRelayFrame(frame);
227
+ for (const client of this.#server.clients) {
228
+ if (client === sender || client.readyState !== WebSocket.OPEN)
229
+ continue;
230
+ if (!this.#isServerConnection(client))
231
+ continue;
232
+ client.send(message, { binary: true });
233
+ }
234
+ }
235
+ #parseFrame(raw) {
236
+ return decodeRelayFrame(normalizeRelayRawData(raw));
237
+ }
238
+ }
239
+ //# sourceMappingURL=WebsocketRelayServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketRelayServer.js","sourceRoot":"","sources":["../../src/WebsocketRelayServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Observable, Subject } from 'rxjs';
2
+ import type { DiscoveryTransporter, MdnsMessage, NodeMetadata, PubsubTransporter, RpcPacket, RpcTransporter, SpiderMeshNode } from '@spider-mesh/core';
3
+ export type WebsocketTransporterOptions = {
4
+ heartbeatIntervalMs?: number;
5
+ reconnectIntervalMs?: number;
6
+ unsubscribeDelayMs?: number;
7
+ };
8
+ export declare class WebsocketTransporter extends Subject<any> implements RpcTransporter, DiscoveryTransporter, PubsubTransporter {
9
+ #private;
10
+ protected options: WebsocketTransporterOptions;
11
+ constructor(options?: WebsocketTransporterOptions);
12
+ get metadata(): {};
13
+ connect(url: string | string[]): void;
14
+ close(url?: string | string[]): void;
15
+ send(packet: RpcPacket, node: SpiderMeshNode): Promise<void>;
16
+ broadcast(data: MdnsMessage<NodeMetadata>, _ips: string[]): Promise<void>;
17
+ publish<T>(topic: string, data: T): Promise<void>;
18
+ listen<T>(topic: string): Observable<T>;
19
+ private on_request;
20
+ private on_response;
21
+ private on_cancel;
22
+ private on_rpc;
23
+ private on_hello;
24
+ private on_offline;
25
+ private on_publish;
26
+ }
@@ -0,0 +1,254 @@
1
+ import { decode, encode } from '@msgpack/msgpack';
2
+ import { defer, finalize, fromEvent, ignoreElements, map, merge, of, ReplaySubject, retry, share, Subject, switchMap, take, tap, throwError, timer } from 'rxjs';
3
+ import WebSocket from 'ws';
4
+ import { decodeRelayFrame, encodeRelayFrame, normalizeRelayRawData } from './websocketProtocol.js';
5
+ export class WebsocketTransporter extends Subject {
6
+ options;
7
+ #connections = new Map();
8
+ #topics = new Map();
9
+ #nodes = new Map();
10
+ #me$ = new ReplaySubject(1);
11
+ constructor(options = {}) {
12
+ super();
13
+ this.options = options;
14
+ }
15
+ get metadata() {
16
+ return {};
17
+ }
18
+ connect(url) {
19
+ for (const relayUrl of new Set(Array.isArray(url) ? url : [url])) {
20
+ if (this.#connections.has(relayUrl))
21
+ continue;
22
+ this.#connections.set(relayUrl, {
23
+ subscription: this.#createConnectionLoop(relayUrl).subscribe(),
24
+ });
25
+ }
26
+ }
27
+ close(url) {
28
+ const urls = url ? [...new Set(Array.isArray(url) ? url : [url])] : [...this.#connections.keys()];
29
+ for (const relayUrl of urls) {
30
+ this.#connections.get(relayUrl)?.subscription.unsubscribe();
31
+ this.#connections.delete(relayUrl);
32
+ }
33
+ }
34
+ async send(packet, node) {
35
+ const socket = this.#selectRpcSocket(node);
36
+ await this.#sendFrame(socket, {
37
+ type: packet.kind,
38
+ target_id: node.node_id,
39
+ payload: this.#encodeRpcPacket(packet),
40
+ });
41
+ }
42
+ async broadcast(data, _ips) {
43
+ const localNode = {
44
+ ...data.node,
45
+ node_id: data.sender_id,
46
+ };
47
+ this.#me$.next(localNode);
48
+ }
49
+ async publish(topic, data) {
50
+ await this.#sendFrameToAll({
51
+ type: 'publish',
52
+ topic,
53
+ payload: encode(data),
54
+ });
55
+ }
56
+ listen(topic) {
57
+ let entry = this.#topics.get(topic);
58
+ if (!entry) {
59
+ const subject = new Subject();
60
+ const stream = defer(() => {
61
+ void this.#announceSubscriptions().catch(() => undefined);
62
+ return subject.asObservable().pipe(finalize(() => {
63
+ if (this.#topics.get(topic)?.subject !== subject)
64
+ return;
65
+ this.#topics.delete(topic);
66
+ void this.#announceUnsubscribe([topic]).catch(() => undefined);
67
+ }));
68
+ }).pipe(share({
69
+ resetOnRefCountZero: () => timer(this.options.unsubscribeDelayMs || 10000),
70
+ }));
71
+ entry = { subject, stream };
72
+ this.#topics.set(topic, entry);
73
+ }
74
+ return entry.stream;
75
+ }
76
+ #createConnectionLoop(url) {
77
+ return of(1).pipe(map(() => new WebSocket(url)), switchMap(socket => {
78
+ const disconnect = () => {
79
+ const connection = this.#connections.get(url);
80
+ if (connection?.socket === socket) {
81
+ delete connection.socket;
82
+ }
83
+ };
84
+ return merge(fromEvent(socket, 'open').pipe(take(1), map(() => socket)), merge(fromEvent(socket, 'close'), fromEvent(socket, 'error')).pipe(take(1), switchMap(() => throwError(() => new Error(`WebSocket disconnected: ${url}`))))).pipe(take(1), tap(() => {
85
+ const connection = this.#connections.get(url);
86
+ if (connection) {
87
+ connection.socket = socket;
88
+ }
89
+ }), switchMap(() => merge(this.#me$.pipe(tap(localNode => {
90
+ void this.#announceLocalNode(localNode).catch(() => undefined);
91
+ void this.#announceSubscriptions().catch(() => undefined);
92
+ }), ignoreElements()), fromEvent(socket, 'message').pipe(tap(event => {
93
+ const raw = Array.isArray(event)
94
+ ? event[0]
95
+ : (event && typeof event === 'object' && 'data' in event ? event.data : event);
96
+ const frame = this.#parseFrame(raw);
97
+ if (!frame)
98
+ return;
99
+ const handler = this[`on_${frame.type}`];
100
+ if (!handler)
101
+ return;
102
+ handler.call(this, url, frame);
103
+ }), ignoreElements()), merge(fromEvent(socket, 'close'), fromEvent(socket, 'error')).pipe(take(1), switchMap(() => throwError(() => new Error(`WebSocket disconnected: ${url}`)))), timer(0, this.options.heartbeatIntervalMs || 30000).pipe(tap(() => {
104
+ if (socket.readyState === WebSocket.OPEN) {
105
+ socket.ping();
106
+ }
107
+ }), ignoreElements()))), finalize(() => {
108
+ disconnect();
109
+ if (socket.readyState === WebSocket.OPEN) {
110
+ socket.close();
111
+ }
112
+ else if (socket.readyState === WebSocket.CONNECTING) {
113
+ socket.terminate();
114
+ }
115
+ }));
116
+ })).pipe(retry({
117
+ delay: () => timer(this.options.reconnectIntervalMs || 1000),
118
+ }));
119
+ }
120
+ on_request(_url, frame) {
121
+ this.on_rpc(frame);
122
+ }
123
+ on_response(_url, frame) {
124
+ this.on_rpc(frame);
125
+ }
126
+ on_cancel(_url, frame) {
127
+ this.on_rpc(frame);
128
+ }
129
+ on_rpc(frame) {
130
+ const packet = this.#decodeRpcPacket(frame);
131
+ if (!packet)
132
+ return;
133
+ this.next({
134
+ rpc: {
135
+ node_id: frame.sender_id,
136
+ packet
137
+ }
138
+ });
139
+ }
140
+ on_hello(url, frame) {
141
+ const node = frame.me;
142
+ this.#nodes.set(node.node_id, {
143
+ node,
144
+ relayUrl: url,
145
+ });
146
+ this.next({ discovered: node });
147
+ }
148
+ on_offline(url, frame) {
149
+ const current = this.#nodes.get(frame.node_id);
150
+ if (current?.relayUrl === url) {
151
+ this.#nodes.delete(frame.node_id);
152
+ }
153
+ this.next({ offline: frame.node_id });
154
+ }
155
+ on_publish(_url, frame) {
156
+ const topic = this.#topics.get(frame.topic);
157
+ if (!topic)
158
+ return;
159
+ try {
160
+ topic.subject.next(decode(frame.payload));
161
+ }
162
+ catch {
163
+ topic.subject.next(frame.payload);
164
+ }
165
+ }
166
+ #selectRpcSocket(node) {
167
+ const relayUrl = this.#nodes.get(node.node_id)?.relayUrl;
168
+ const routedSocket = relayUrl ? this.#connections.get(relayUrl)?.socket : null;
169
+ if (routedSocket?.readyState === WebSocket.OPEN) {
170
+ return routedSocket;
171
+ }
172
+ for (const { socket } of this.#connections.values()) {
173
+ if (socket?.readyState === WebSocket.OPEN) {
174
+ return socket;
175
+ }
176
+ }
177
+ throw new Error('WebSocket is not connected');
178
+ }
179
+ #resolveNode(nodeId) {
180
+ if (nodeId) {
181
+ const knownNode = this.#nodes.get(nodeId);
182
+ if (knownNode) {
183
+ return knownNode.node;
184
+ }
185
+ }
186
+ return {
187
+ ips: [],
188
+ host: '',
189
+ namespace: '',
190
+ node_id: nodeId || '',
191
+ services: {},
192
+ transporters: {},
193
+ nodes: {},
194
+ version: 0,
195
+ };
196
+ }
197
+ async #announceLocalNode(localNode) {
198
+ await this.#sendFrameToAll({
199
+ type: 'hello',
200
+ me: {
201
+ ...localNode,
202
+ online: true,
203
+ },
204
+ });
205
+ }
206
+ async #announceSubscriptions() {
207
+ await this.#sendFrameToAll({
208
+ type: 'subscribe',
209
+ topics: [...this.#topics.keys()],
210
+ });
211
+ }
212
+ async #announceUnsubscribe(topics) {
213
+ if (topics.length === 0)
214
+ return;
215
+ await this.#sendFrameToAll({
216
+ type: 'unsubscribe',
217
+ topics,
218
+ });
219
+ }
220
+ #encodeRpcPacket(packet) {
221
+ const { kind: _, ...payload } = packet;
222
+ return encode(payload);
223
+ }
224
+ #decodeRpcPacket(frame) {
225
+ try {
226
+ return {
227
+ kind: frame.type,
228
+ ...decode(frame.payload),
229
+ };
230
+ }
231
+ catch {
232
+ return null;
233
+ }
234
+ }
235
+ async #sendFrame(socket, frame) {
236
+ if (!socket || socket.readyState !== WebSocket.OPEN) {
237
+ throw new Error('WebSocket is not connected');
238
+ }
239
+ socket.send(encodeRelayFrame(frame), { binary: true });
240
+ }
241
+ async #sendFrameToAll(frame) {
242
+ const sockets = [...this.#connections.values()]
243
+ .map(connection => connection.socket)
244
+ .filter((socket) => socket?.readyState === WebSocket.OPEN);
245
+ if (sockets.length === 0) {
246
+ return;
247
+ }
248
+ await Promise.all(sockets.map(socket => this.#sendFrame(socket, frame)));
249
+ }
250
+ #parseFrame(raw) {
251
+ return decodeRelayFrame(normalizeRelayRawData(raw));
252
+ }
253
+ }
254
+ //# sourceMappingURL=WebsocketTransporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketTransporter.js","sourceRoot":"","sources":["../../src/WebsocketTransporter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export { SpiderMeshWebsocketTransporter } from './SpiderMeshWebsocketTransporter.js';
1
+ export * from './WebsocketTransporter.js';
@@ -1,2 +1,2 @@
1
- export { SpiderMeshWebsocketTransporter } from './SpiderMeshWebsocketTransporter.js';
1
+ export * from './WebsocketTransporter.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1 @@
1
+ export * from './WebsocketRelayServer.js';
@@ -0,0 +1,2 @@
1
+ export * from './WebsocketRelayServer.js';
2
+ //# sourceMappingURL=relay-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-server.js","sourceRoot":"","sources":["../../src/relay-server.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1,52 @@
1
+ import type WebSocket from 'ws';
2
+ import type { RpcPacket, SpiderMeshNode } from '@spider-mesh/core';
3
+ export type RelayRpcFrame = {
4
+ type: RpcPacket['kind'];
5
+ payload: Uint8Array;
6
+ target_id?: string;
7
+ };
8
+ export type RelayPublishFrame = {
9
+ type: 'publish';
10
+ topic: string;
11
+ payload: Uint8Array;
12
+ };
13
+ export type RelaySubscribeFrame = {
14
+ type: 'subscribe';
15
+ topics: string[];
16
+ };
17
+ export type RelayUnsubscribeFrame = {
18
+ type: 'unsubscribe';
19
+ topics: string[];
20
+ };
21
+ export type RelayHelloFrame = {
22
+ type: 'hello';
23
+ me: SpiderMeshNode;
24
+ target_id?: string;
25
+ };
26
+ export type RelayOfflineFrame = {
27
+ type: 'offline';
28
+ node_id: string;
29
+ };
30
+ export type RelayFrame = RelayRpcFrame | RelayPublishFrame | RelaySubscribeFrame | RelayUnsubscribeFrame | RelayHelloFrame | RelayOfflineFrame;
31
+ export type ReceivedRelayRpcFrame = RelayRpcFrame & {
32
+ sender_id: string;
33
+ };
34
+ export type ReceivedRelayPublishFrame = RelayPublishFrame & {
35
+ sender_id: string;
36
+ };
37
+ export type ReceivedRelaySubscribeFrame = RelaySubscribeFrame & {
38
+ sender_id: string;
39
+ };
40
+ export type ReceivedRelayUnsubscribeFrame = RelayUnsubscribeFrame & {
41
+ sender_id: string;
42
+ };
43
+ export type ReceivedRelayHelloFrame = RelayHelloFrame & {
44
+ sender_id: string;
45
+ };
46
+ export type ReceivedRelayOfflineFrame = RelayOfflineFrame & {
47
+ sender_id: string;
48
+ };
49
+ export type ReceivedRelayFrame = ReceivedRelayRpcFrame | ReceivedRelayPublishFrame | ReceivedRelaySubscribeFrame | ReceivedRelayUnsubscribeFrame | ReceivedRelayHelloFrame | ReceivedRelayOfflineFrame;
50
+ export declare function encodeRelayFrame(frame: RelayFrame | ReceivedRelayFrame): Uint8Array<ArrayBuffer>;
51
+ export declare function decodeRelayFrame(raw: Uint8Array): RelayRpcFrame | RelayPublishFrame | RelaySubscribeFrame | RelayUnsubscribeFrame | RelayHelloFrame | RelayOfflineFrame | null;
52
+ export declare function normalizeRelayRawData(raw: WebSocket.RawData): Uint8Array;
@@ -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