@agentxjs/network 0.2.0

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/dist/index.cjs ADDED
@@ -0,0 +1,491 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
31
+
32
+ // src/index.ts
33
+ var src_exports = {};
34
+ __export(src_exports, {
35
+ WebSocketClient: () => WebSocketClient,
36
+ WebSocketServer: () => WebSocketServer,
37
+ createWebSocketClient: () => createWebSocketClient
38
+ });
39
+ module.exports = __toCommonJS(src_exports);
40
+
41
+ // src/WebSocketServer.ts
42
+ var import_common = require("@agentxjs/common");
43
+ var logger = (0, import_common.createLogger)("network/WebSocketServer");
44
+ var WebSocketConnection = class {
45
+ constructor(ws, options) {
46
+ __publicField(this, "id");
47
+ __publicField(this, "ws");
48
+ __publicField(this, "messageHandlers", /* @__PURE__ */ new Set());
49
+ __publicField(this, "closeHandlers", /* @__PURE__ */ new Set());
50
+ __publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
51
+ __publicField(this, "heartbeatInterval");
52
+ __publicField(this, "isAlive", true);
53
+ this.ws = ws;
54
+ this.id = `conn_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
55
+ if (options.heartbeat !== false) {
56
+ const interval = options.heartbeatInterval || 3e4;
57
+ ws.on("pong", () => {
58
+ this.isAlive = true;
59
+ logger.debug("Heartbeat pong received", { id: this.id });
60
+ });
61
+ this.heartbeatInterval = setInterval(() => {
62
+ if (!this.isAlive) {
63
+ logger.warn("Client heartbeat timeout, terminating connection", { id: this.id });
64
+ clearInterval(this.heartbeatInterval);
65
+ ws.terminate();
66
+ return;
67
+ }
68
+ this.isAlive = false;
69
+ ws.ping();
70
+ logger.debug("Heartbeat ping sent", { id: this.id });
71
+ }, interval);
72
+ }
73
+ ws.on("message", (data) => {
74
+ const message = data.toString();
75
+ for (const handler of this.messageHandlers) {
76
+ handler(message);
77
+ }
78
+ });
79
+ ws.on("close", () => {
80
+ if (this.heartbeatInterval) {
81
+ clearInterval(this.heartbeatInterval);
82
+ }
83
+ for (const handler of this.closeHandlers) {
84
+ handler();
85
+ }
86
+ });
87
+ ws.on("error", (err) => {
88
+ if (this.heartbeatInterval) {
89
+ clearInterval(this.heartbeatInterval);
90
+ }
91
+ for (const handler of this.errorHandlers) {
92
+ handler(err);
93
+ }
94
+ });
95
+ }
96
+ send(message) {
97
+ if (this.ws.readyState === 1) {
98
+ this.ws.send(message);
99
+ }
100
+ }
101
+ onMessage(handler) {
102
+ this.messageHandlers.add(handler);
103
+ return () => {
104
+ this.messageHandlers.delete(handler);
105
+ };
106
+ }
107
+ onClose(handler) {
108
+ this.closeHandlers.add(handler);
109
+ return () => {
110
+ this.closeHandlers.delete(handler);
111
+ };
112
+ }
113
+ onError(handler) {
114
+ this.errorHandlers.add(handler);
115
+ return () => {
116
+ this.errorHandlers.delete(handler);
117
+ };
118
+ }
119
+ close() {
120
+ if (this.heartbeatInterval) {
121
+ clearInterval(this.heartbeatInterval);
122
+ }
123
+ this.ws.close();
124
+ }
125
+ };
126
+ var WebSocketServer = class {
127
+ constructor(options = {}) {
128
+ __publicField(this, "wss", null);
129
+ __publicField(this, "connections", /* @__PURE__ */ new Set());
130
+ __publicField(this, "connectionHandlers", /* @__PURE__ */ new Set());
131
+ __publicField(this, "options");
132
+ __publicField(this, "attachedToServer", false);
133
+ this.options = options;
134
+ }
135
+ async listen(port, host = "0.0.0.0") {
136
+ if (this.wss) {
137
+ throw new Error("Server already listening");
138
+ }
139
+ if (this.attachedToServer) {
140
+ throw new Error(
141
+ "Cannot listen when attached to existing server. The server should call listen() instead."
142
+ );
143
+ }
144
+ const { WebSocketServer: WSS } = await import("ws");
145
+ this.wss = new WSS({ port, host });
146
+ this.wss.on("connection", (ws) => {
147
+ this.handleConnection(ws);
148
+ });
149
+ logger.info("WebSocket server listening", { port, host });
150
+ }
151
+ attach(server, path = "/ws") {
152
+ if (this.wss) {
153
+ throw new Error("Server already initialized");
154
+ }
155
+ import("ws").then(({ WebSocketServer: WSS }) => {
156
+ this.wss = new WSS({ noServer: true });
157
+ server.on("upgrade", (request, socket, head) => {
158
+ const url = new URL(request.url || "", `http://${request.headers.host}`);
159
+ if (url.pathname === path) {
160
+ this.wss.handleUpgrade(request, socket, head, (ws) => {
161
+ this.wss.emit("connection", ws, request);
162
+ });
163
+ } else {
164
+ socket.destroy();
165
+ }
166
+ });
167
+ this.wss.on("connection", (ws) => {
168
+ this.handleConnection(ws);
169
+ });
170
+ this.attachedToServer = true;
171
+ logger.info("WebSocket attached to existing HTTP server", { path });
172
+ });
173
+ }
174
+ handleConnection(ws) {
175
+ const connection = new WebSocketConnection(ws, this.options);
176
+ this.connections.add(connection);
177
+ logger.info("Client connected", {
178
+ connectionId: connection.id,
179
+ totalConnections: this.connections.size
180
+ });
181
+ connection.onClose(() => {
182
+ this.connections.delete(connection);
183
+ logger.info("Client disconnected", {
184
+ connectionId: connection.id,
185
+ totalConnections: this.connections.size
186
+ });
187
+ });
188
+ for (const handler of this.connectionHandlers) {
189
+ handler(connection);
190
+ }
191
+ }
192
+ onConnection(handler) {
193
+ this.connectionHandlers.add(handler);
194
+ return () => {
195
+ this.connectionHandlers.delete(handler);
196
+ };
197
+ }
198
+ broadcast(message) {
199
+ for (const connection of this.connections) {
200
+ connection.send(message);
201
+ }
202
+ }
203
+ async close() {
204
+ if (!this.wss) return;
205
+ for (const connection of this.connections) {
206
+ connection.close();
207
+ }
208
+ this.connections.clear();
209
+ if (!this.attachedToServer) {
210
+ await new Promise((resolve) => {
211
+ this.wss.close(() => resolve());
212
+ });
213
+ }
214
+ this.wss = null;
215
+ }
216
+ async dispose() {
217
+ await this.close();
218
+ this.connectionHandlers.clear();
219
+ }
220
+ };
221
+
222
+ // src/WebSocketClient.ts
223
+ var import_common2 = require("@agentxjs/common");
224
+ var logger2 = (0, import_common2.createLogger)("network/WebSocketClient");
225
+ var isBrowser = typeof globalThis !== "undefined" && typeof globalThis.window !== "undefined" && typeof globalThis.window.WebSocket !== "undefined";
226
+ var WebSocketClient = class {
227
+ constructor(options) {
228
+ __publicField(this, "ws", null);
229
+ __publicField(this, "serverUrl");
230
+ __publicField(this, "messageHandlers", /* @__PURE__ */ new Set());
231
+ __publicField(this, "openHandlers", /* @__PURE__ */ new Set());
232
+ __publicField(this, "closeHandlers", /* @__PURE__ */ new Set());
233
+ __publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
234
+ if (isBrowser) {
235
+ throw new Error(
236
+ "Use createBrowserWebSocketClient() in browser environment for auto-reconnect support"
237
+ );
238
+ }
239
+ this.serverUrl = options.serverUrl;
240
+ }
241
+ get readyState() {
242
+ if (!this.ws) return "closed";
243
+ const state = this.ws.readyState;
244
+ if (state === 0) return "connecting";
245
+ if (state === 1) return "open";
246
+ if (state === 2) return "closing";
247
+ return "closed";
248
+ }
249
+ async connect() {
250
+ if (this.ws) {
251
+ throw new Error("Already connected or connecting");
252
+ }
253
+ const { WebSocket: NodeWebSocket } = await import("ws");
254
+ this.ws = new NodeWebSocket(this.serverUrl);
255
+ return new Promise((resolve, reject) => {
256
+ const onOpen = () => {
257
+ logger2.info("WebSocket connected", { serverUrl: this.serverUrl });
258
+ for (const handler of this.openHandlers) {
259
+ handler();
260
+ }
261
+ resolve();
262
+ };
263
+ const onError = (err) => {
264
+ logger2.error("WebSocket connection failed", {
265
+ serverUrl: this.serverUrl,
266
+ error: err?.message
267
+ });
268
+ reject(err || new Error("WebSocket connection failed"));
269
+ };
270
+ this.ws.once("open", onOpen);
271
+ this.ws.once("error", onError);
272
+ this.ws.on("message", (data) => {
273
+ const message = data.toString();
274
+ for (const handler of this.messageHandlers) {
275
+ handler(message);
276
+ }
277
+ });
278
+ this.ws.on("close", () => {
279
+ logger2.warn("WebSocket closed");
280
+ for (const handler of this.closeHandlers) {
281
+ handler();
282
+ }
283
+ });
284
+ this.ws.on("error", (err) => {
285
+ logger2.error("WebSocket error", { error: err.message });
286
+ for (const handler of this.errorHandlers) {
287
+ handler(err);
288
+ }
289
+ });
290
+ });
291
+ }
292
+ send(message) {
293
+ if (!this.ws || this.ws.readyState !== 1) {
294
+ throw new Error("WebSocket is not open");
295
+ }
296
+ this.ws.send(message);
297
+ }
298
+ onMessage(handler) {
299
+ this.messageHandlers.add(handler);
300
+ return () => {
301
+ this.messageHandlers.delete(handler);
302
+ };
303
+ }
304
+ onOpen(handler) {
305
+ this.openHandlers.add(handler);
306
+ return () => {
307
+ this.openHandlers.delete(handler);
308
+ };
309
+ }
310
+ onClose(handler) {
311
+ this.closeHandlers.add(handler);
312
+ return () => {
313
+ this.closeHandlers.delete(handler);
314
+ };
315
+ }
316
+ onError(handler) {
317
+ this.errorHandlers.add(handler);
318
+ return () => {
319
+ this.errorHandlers.delete(handler);
320
+ };
321
+ }
322
+ close() {
323
+ if (this.ws) {
324
+ this.ws.close();
325
+ this.ws = null;
326
+ }
327
+ }
328
+ dispose() {
329
+ this.close();
330
+ this.messageHandlers.clear();
331
+ this.openHandlers.clear();
332
+ this.closeHandlers.clear();
333
+ this.errorHandlers.clear();
334
+ }
335
+ };
336
+ var BrowserWebSocketClient = class {
337
+ // Track if this is a reconnection
338
+ constructor(options) {
339
+ __publicField(this, "ws", null);
340
+ __publicField(this, "serverUrl");
341
+ __publicField(this, "options");
342
+ __publicField(this, "messageHandlers", /* @__PURE__ */ new Set());
343
+ __publicField(this, "openHandlers", /* @__PURE__ */ new Set());
344
+ __publicField(this, "closeHandlers", /* @__PURE__ */ new Set());
345
+ __publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
346
+ __publicField(this, "hasConnectedBefore", false);
347
+ if (!isBrowser) {
348
+ throw new Error("BrowserWebSocketClient can only be used in browser environment");
349
+ }
350
+ this.serverUrl = options.serverUrl;
351
+ this.options = {
352
+ autoReconnect: true,
353
+ minReconnectionDelay: 1e3,
354
+ maxReconnectionDelay: 1e4,
355
+ maxRetries: Infinity,
356
+ connectionTimeout: 4e3,
357
+ debug: false,
358
+ ...options
359
+ };
360
+ }
361
+ get readyState() {
362
+ if (!this.ws) return "closed";
363
+ const state = this.ws.readyState;
364
+ if (state === 0) return "connecting";
365
+ if (state === 1) return "open";
366
+ if (state === 2) return "closing";
367
+ return "closed";
368
+ }
369
+ async connect() {
370
+ if (this.ws) {
371
+ throw new Error("Already connected or connecting");
372
+ }
373
+ if (this.options.autoReconnect) {
374
+ const ReconnectingWebSocket = (await import("reconnecting-websocket")).default;
375
+ this.ws = new ReconnectingWebSocket(this.serverUrl, [], {
376
+ maxReconnectionDelay: this.options.maxReconnectionDelay,
377
+ minReconnectionDelay: this.options.minReconnectionDelay,
378
+ reconnectionDelayGrowFactor: 1.3,
379
+ connectionTimeout: this.options.connectionTimeout,
380
+ maxRetries: this.options.maxRetries,
381
+ debug: this.options.debug
382
+ });
383
+ } else {
384
+ this.ws = new WebSocket(this.serverUrl);
385
+ }
386
+ return new Promise((resolve, reject) => {
387
+ const onOpen = () => {
388
+ if (this.hasConnectedBefore) {
389
+ logger2.info("WebSocket reconnected successfully", { serverUrl: this.serverUrl });
390
+ } else {
391
+ logger2.info("WebSocket connected", { serverUrl: this.serverUrl });
392
+ this.hasConnectedBefore = true;
393
+ }
394
+ for (const handler of this.openHandlers) {
395
+ handler();
396
+ }
397
+ resolve();
398
+ };
399
+ const onError = (_event) => {
400
+ logger2.error("WebSocket connection failed", { serverUrl: this.serverUrl });
401
+ const error = new Error("WebSocket connection failed");
402
+ for (const handler of this.errorHandlers) {
403
+ handler(error);
404
+ }
405
+ reject(error);
406
+ };
407
+ this.ws.addEventListener("open", onOpen, { once: true });
408
+ this.ws.addEventListener("error", onError, { once: true });
409
+ this.ws.addEventListener("message", ((event) => {
410
+ const message = event.data;
411
+ for (const handler of this.messageHandlers) {
412
+ handler(message);
413
+ }
414
+ }));
415
+ this.ws.addEventListener("close", (() => {
416
+ logger2.info("WebSocket closed, attempting to reconnect...");
417
+ for (const handler of this.closeHandlers) {
418
+ handler();
419
+ }
420
+ }));
421
+ this.ws.addEventListener("error", ((_event) => {
422
+ logger2.error("WebSocket error");
423
+ const error = new Error("WebSocket error");
424
+ for (const handler of this.errorHandlers) {
425
+ handler(error);
426
+ }
427
+ }));
428
+ });
429
+ }
430
+ send(message) {
431
+ if (!this.ws || this.ws.readyState !== 1) {
432
+ throw new Error("WebSocket is not open");
433
+ }
434
+ this.ws.send(message);
435
+ }
436
+ onMessage(handler) {
437
+ this.messageHandlers.add(handler);
438
+ return () => {
439
+ this.messageHandlers.delete(handler);
440
+ };
441
+ }
442
+ onOpen(handler) {
443
+ this.openHandlers.add(handler);
444
+ return () => {
445
+ this.openHandlers.delete(handler);
446
+ };
447
+ }
448
+ onClose(handler) {
449
+ this.closeHandlers.add(handler);
450
+ return () => {
451
+ this.closeHandlers.delete(handler);
452
+ };
453
+ }
454
+ onError(handler) {
455
+ this.errorHandlers.add(handler);
456
+ return () => {
457
+ this.errorHandlers.delete(handler);
458
+ };
459
+ }
460
+ close() {
461
+ if (this.ws) {
462
+ this.ws.close();
463
+ this.ws = null;
464
+ }
465
+ }
466
+ dispose() {
467
+ this.close();
468
+ this.messageHandlers.clear();
469
+ this.openHandlers.clear();
470
+ this.closeHandlers.clear();
471
+ this.errorHandlers.clear();
472
+ }
473
+ };
474
+ async function createWebSocketClient(options) {
475
+ if (isBrowser) {
476
+ const client = new BrowserWebSocketClient(options);
477
+ await client.connect();
478
+ return client;
479
+ } else {
480
+ const client = new WebSocketClient(options);
481
+ await client.connect();
482
+ return client;
483
+ }
484
+ }
485
+ // Annotate the CommonJS export names for ESM import in node:
486
+ 0 && (module.exports = {
487
+ WebSocketClient,
488
+ WebSocketServer,
489
+ createWebSocketClient
490
+ });
491
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/WebSocketServer.ts","../src/WebSocketClient.ts"],"sourcesContent":["/**\n * @agentxjs/network - Network layer abstraction (Node.js)\n *\n * Provides WebSocket client/server implementations of Channel interfaces.\n */\n\nexport { WebSocketServer } from \"./WebSocketServer\";\nexport { WebSocketClient, createWebSocketClient } from \"./WebSocketClient\";\n\n// Re-export types\nexport type {\n ChannelServer,\n ChannelClient,\n ChannelConnection,\n ChannelClientOptions,\n ChannelServerOptions,\n Unsubscribe,\n} from \"@agentxjs/types/network\";\n","/**\n * WebSocket Server implementation of ChannelServer\n */\n\nimport type { WebSocket as WS, WebSocketServer as WSS } from \"ws\";\nimport type {\n ChannelServer,\n ChannelConnection,\n ChannelServerOptions,\n MinimalHTTPServer,\n Unsubscribe,\n} from \"@agentxjs/types/network\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"network/WebSocketServer\");\n\n/**\n * WebSocket connection implementation\n */\nclass WebSocketConnection implements ChannelConnection {\n public readonly id: string;\n private ws: WS;\n private messageHandlers = new Set<(message: string) => void>();\n private closeHandlers = new Set<() => void>();\n private errorHandlers = new Set<(error: Error) => void>();\n private heartbeatInterval?: ReturnType<typeof setInterval>;\n private isAlive = true;\n\n constructor(ws: WS, options: ChannelServerOptions) {\n this.ws = ws;\n this.id = `conn_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n // Setup heartbeat if enabled\n if (options.heartbeat !== false) {\n const interval = options.heartbeatInterval || 30000;\n\n ws.on(\"pong\", () => {\n this.isAlive = true;\n logger.debug(\"Heartbeat pong received\", { id: this.id });\n });\n\n this.heartbeatInterval = setInterval(() => {\n if (!this.isAlive) {\n logger.warn(\"Client heartbeat timeout, terminating connection\", { id: this.id });\n clearInterval(this.heartbeatInterval);\n ws.terminate();\n return;\n }\n this.isAlive = false;\n ws.ping();\n logger.debug(\"Heartbeat ping sent\", { id: this.id });\n }, interval);\n }\n\n // Setup message handler\n ws.on(\"message\", (data: Buffer) => {\n const message = data.toString();\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n\n // Setup close handler\n ws.on(\"close\", () => {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n for (const handler of this.closeHandlers) {\n handler();\n }\n });\n\n // Setup error handler\n ws.on(\"error\", (err: Error) => {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n for (const handler of this.errorHandlers) {\n handler(err);\n }\n });\n }\n\n send(message: string): void {\n if (this.ws.readyState === 1) {\n // WebSocket.OPEN\n this.ws.send(message);\n }\n }\n\n onMessage(handler: (message: string) => void): Unsubscribe {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n\n onClose(handler: () => void): Unsubscribe {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n\n onError(handler: (error: Error) => void): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n close(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.ws.close();\n }\n}\n\n/**\n * WebSocket Server\n */\nexport class WebSocketServer implements ChannelServer {\n private wss: WSS | null = null;\n private connections = new Set<WebSocketConnection>();\n private connectionHandlers = new Set<(connection: ChannelConnection) => void>();\n private options: ChannelServerOptions;\n private attachedToServer = false;\n\n constructor(options: ChannelServerOptions = {}) {\n this.options = options;\n }\n\n async listen(port: number, host: string = \"0.0.0.0\"): Promise<void> {\n if (this.wss) {\n throw new Error(\"Server already listening\");\n }\n if (this.attachedToServer) {\n throw new Error(\n \"Cannot listen when attached to existing server. The server should call listen() instead.\"\n );\n }\n\n const { WebSocketServer: WSS } = await import(\"ws\");\n this.wss = new WSS({ port, host });\n\n this.wss.on(\"connection\", (ws: WS) => {\n this.handleConnection(ws);\n });\n\n logger.info(\"WebSocket server listening\", { port, host });\n }\n\n attach(server: MinimalHTTPServer, path: string = \"/ws\"): void {\n if (this.wss) {\n throw new Error(\"Server already initialized\");\n }\n\n import(\"ws\").then(({ WebSocketServer: WSS }) => {\n this.wss = new WSS({ noServer: true });\n\n // Handle WebSocket upgrade on the HTTP server\n server.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url || \"\", `http://${request.headers.host}`);\n if (url.pathname === path) {\n this.wss!.handleUpgrade(request as any, socket as any, head as any, (ws: WS) => {\n this.wss!.emit(\"connection\", ws, request);\n });\n } else {\n (socket as any).destroy();\n }\n });\n\n this.wss.on(\"connection\", (ws: WS) => {\n this.handleConnection(ws);\n });\n\n this.attachedToServer = true;\n logger.info(\"WebSocket attached to existing HTTP server\", { path });\n });\n }\n\n private handleConnection(ws: WS): void {\n const connection = new WebSocketConnection(ws, this.options);\n this.connections.add(connection);\n\n logger.info(\"Client connected\", {\n connectionId: connection.id,\n totalConnections: this.connections.size,\n });\n\n connection.onClose(() => {\n this.connections.delete(connection);\n logger.info(\"Client disconnected\", {\n connectionId: connection.id,\n totalConnections: this.connections.size,\n });\n });\n\n // Notify handlers\n for (const handler of this.connectionHandlers) {\n handler(connection);\n }\n }\n\n onConnection(handler: (connection: ChannelConnection) => void): Unsubscribe {\n this.connectionHandlers.add(handler);\n return () => {\n this.connectionHandlers.delete(handler);\n };\n }\n\n broadcast(message: string): void {\n for (const connection of this.connections) {\n connection.send(message);\n }\n }\n\n async close(): Promise<void> {\n if (!this.wss) return;\n\n for (const connection of this.connections) {\n connection.close();\n }\n this.connections.clear();\n\n // Don't close the server if attached to existing HTTP server\n if (!this.attachedToServer) {\n await new Promise<void>((resolve) => {\n this.wss!.close(() => resolve());\n });\n }\n this.wss = null;\n }\n\n async dispose(): Promise<void> {\n await this.close();\n this.connectionHandlers.clear();\n }\n}\n","/**\n * WebSocket Client implementation of ChannelClient\n */\n\nimport type { ChannelClient, ChannelClientOptions, Unsubscribe } from \"@agentxjs/types/network\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"network/WebSocketClient\");\n\n// Detect browser environment\nconst isBrowser =\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).window.WebSocket !== \"undefined\";\n\n/**\n * WebSocket Client (Node.js version - no auto-reconnect)\n */\nexport class WebSocketClient implements ChannelClient {\n private ws: WebSocket | null = null;\n private serverUrl: string;\n private messageHandlers = new Set<(message: string) => void>();\n private openHandlers = new Set<() => void>();\n private closeHandlers = new Set<() => void>();\n private errorHandlers = new Set<(error: Error) => void>();\n\n constructor(options: ChannelClientOptions) {\n if (isBrowser) {\n throw new Error(\n \"Use createBrowserWebSocketClient() in browser environment for auto-reconnect support\"\n );\n }\n\n this.serverUrl = options.serverUrl;\n }\n\n get readyState(): \"connecting\" | \"open\" | \"closing\" | \"closed\" {\n if (!this.ws) return \"closed\";\n const state = this.ws.readyState;\n if (state === 0) return \"connecting\";\n if (state === 1) return \"open\";\n if (state === 2) return \"closing\";\n return \"closed\";\n }\n\n async connect(): Promise<void> {\n if (this.ws) {\n throw new Error(\"Already connected or connecting\");\n }\n\n const { WebSocket: NodeWebSocket } = await import(\"ws\");\n this.ws = new NodeWebSocket(this.serverUrl) as unknown as WebSocket;\n\n return new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n logger.info(\"WebSocket connected\", { serverUrl: this.serverUrl });\n for (const handler of this.openHandlers) {\n handler();\n }\n resolve();\n };\n\n const onError = (err?: Error) => {\n logger.error(\"WebSocket connection failed\", {\n serverUrl: this.serverUrl,\n error: err?.message,\n });\n reject(err || new Error(\"WebSocket connection failed\"));\n };\n\n (this.ws as any).once(\"open\", onOpen);\n (this.ws as any).once(\"error\", onError);\n\n // Setup permanent handlers\n (this.ws as any).on(\"message\", (data: Buffer) => {\n const message = data.toString();\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n\n (this.ws as any).on(\"close\", () => {\n logger.warn(\"WebSocket closed\");\n for (const handler of this.closeHandlers) {\n handler();\n }\n });\n\n (this.ws as any).on(\"error\", (err: Error) => {\n logger.error(\"WebSocket error\", { error: err.message });\n for (const handler of this.errorHandlers) {\n handler(err);\n }\n });\n });\n }\n\n send(message: string): void {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new Error(\"WebSocket is not open\");\n }\n this.ws.send(message);\n }\n\n onMessage(handler: (message: string) => void): Unsubscribe {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n\n onOpen(handler: () => void): Unsubscribe {\n this.openHandlers.add(handler);\n return () => {\n this.openHandlers.delete(handler);\n };\n }\n\n onClose(handler: () => void): Unsubscribe {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n\n onError(handler: (error: Error) => void): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n close(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n dispose(): void {\n this.close();\n this.messageHandlers.clear();\n this.openHandlers.clear();\n this.closeHandlers.clear();\n this.errorHandlers.clear();\n }\n}\n\n/**\n * Browser WebSocket Client with auto-reconnect\n */\nexport class BrowserWebSocketClient implements ChannelClient {\n private ws: WebSocket | null = null;\n private serverUrl: string;\n private options: ChannelClientOptions;\n private messageHandlers = new Set<(message: string) => void>();\n private openHandlers = new Set<() => void>();\n private closeHandlers = new Set<() => void>();\n private errorHandlers = new Set<(error: Error) => void>();\n private hasConnectedBefore = false; // Track if this is a reconnection\n\n constructor(options: ChannelClientOptions) {\n if (!isBrowser) {\n throw new Error(\"BrowserWebSocketClient can only be used in browser environment\");\n }\n\n this.serverUrl = options.serverUrl;\n this.options = {\n autoReconnect: true,\n minReconnectionDelay: 1000,\n maxReconnectionDelay: 10000,\n maxRetries: Infinity,\n connectionTimeout: 4000,\n debug: false,\n ...options,\n };\n }\n\n get readyState(): \"connecting\" | \"open\" | \"closing\" | \"closed\" {\n if (!this.ws) return \"closed\";\n const state = this.ws.readyState;\n if (state === 0) return \"connecting\";\n if (state === 1) return \"open\";\n if (state === 2) return \"closing\";\n return \"closed\";\n }\n\n async connect(): Promise<void> {\n if (this.ws) {\n throw new Error(\"Already connected or connecting\");\n }\n\n if (this.options.autoReconnect) {\n // Use reconnecting-websocket for auto-reconnect\n const ReconnectingWebSocket = (await import(\"reconnecting-websocket\")).default;\n this.ws = new ReconnectingWebSocket(this.serverUrl, [], {\n maxReconnectionDelay: this.options.maxReconnectionDelay,\n minReconnectionDelay: this.options.minReconnectionDelay,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: this.options.connectionTimeout,\n maxRetries: this.options.maxRetries,\n debug: this.options.debug,\n });\n } else {\n // Use native WebSocket\n this.ws = new WebSocket(this.serverUrl);\n }\n\n return new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n if (this.hasConnectedBefore) {\n logger.info(\"WebSocket reconnected successfully\", { serverUrl: this.serverUrl });\n } else {\n logger.info(\"WebSocket connected\", { serverUrl: this.serverUrl });\n this.hasConnectedBefore = true;\n }\n for (const handler of this.openHandlers) {\n handler();\n }\n resolve();\n };\n\n const onError = (_event: Event) => {\n logger.error(\"WebSocket connection failed\", { serverUrl: this.serverUrl });\n const error = new Error(\"WebSocket connection failed\");\n for (const handler of this.errorHandlers) {\n handler(error);\n }\n reject(error);\n };\n\n this.ws!.addEventListener(\"open\", onOpen as any, { once: true });\n this.ws!.addEventListener(\"error\", onError as any, { once: true });\n\n // Setup permanent handlers\n this.ws!.addEventListener(\"message\", ((event: any) => {\n const message = event.data;\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n }) as any);\n\n this.ws!.addEventListener(\"close\", (() => {\n logger.info(\"WebSocket closed, attempting to reconnect...\");\n for (const handler of this.closeHandlers) {\n handler();\n }\n }) as any);\n\n this.ws!.addEventListener(\"error\", ((_event: Event) => {\n logger.error(\"WebSocket error\");\n const error = new Error(\"WebSocket error\");\n for (const handler of this.errorHandlers) {\n handler(error);\n }\n }) as any);\n });\n }\n\n send(message: string): void {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new Error(\"WebSocket is not open\");\n }\n this.ws.send(message);\n }\n\n onMessage(handler: (message: string) => void): Unsubscribe {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n\n onOpen(handler: () => void): Unsubscribe {\n this.openHandlers.add(handler);\n return () => {\n this.openHandlers.delete(handler);\n };\n }\n\n onClose(handler: () => void): Unsubscribe {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n\n onError(handler: (error: Error) => void): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n close(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n dispose(): void {\n this.close();\n this.messageHandlers.clear();\n this.openHandlers.clear();\n this.closeHandlers.clear();\n this.errorHandlers.clear();\n }\n}\n\n/**\n * Factory function to create the appropriate WebSocket client\n */\nexport async function createWebSocketClient(options: ChannelClientOptions): Promise<ChannelClient> {\n if (isBrowser) {\n const client = new BrowserWebSocketClient(options);\n await client.connect();\n return client;\n } else {\n const client = new WebSocketClient(options);\n await client.connect();\n return client;\n }\n}\n"],"mappings":"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","names":["import_common","logger"]}
@@ -0,0 +1,28 @@
1
+ import { ChannelServer, ChannelServerOptions, MinimalHTTPServer, ChannelConnection, Unsubscribe } from '@agentxjs/types/network';
2
+ export { ChannelClient, ChannelClientOptions, ChannelConnection, ChannelServer, ChannelServerOptions, Unsubscribe } from '@agentxjs/types/network';
3
+ export { W as WebSocketClient, c as createWebSocketClient } from './browser-qLiqDF2b.cjs';
4
+
5
+ /**
6
+ * WebSocket Server implementation of ChannelServer
7
+ */
8
+
9
+ /**
10
+ * WebSocket Server
11
+ */
12
+ declare class WebSocketServer implements ChannelServer {
13
+ private wss;
14
+ private connections;
15
+ private connectionHandlers;
16
+ private options;
17
+ private attachedToServer;
18
+ constructor(options?: ChannelServerOptions);
19
+ listen(port: number, host?: string): Promise<void>;
20
+ attach(server: MinimalHTTPServer, path?: string): void;
21
+ private handleConnection;
22
+ onConnection(handler: (connection: ChannelConnection) => void): Unsubscribe;
23
+ broadcast(message: string): void;
24
+ close(): Promise<void>;
25
+ dispose(): Promise<void>;
26
+ }
27
+
28
+ export { WebSocketServer };
@@ -0,0 +1,28 @@
1
+ import { ChannelServer, ChannelServerOptions, MinimalHTTPServer, ChannelConnection, Unsubscribe } from '@agentxjs/types/network';
2
+ export { ChannelClient, ChannelClientOptions, ChannelConnection, ChannelServer, ChannelServerOptions, Unsubscribe } from '@agentxjs/types/network';
3
+ export { W as WebSocketClient, c as createWebSocketClient } from './browser-qLiqDF2b.js';
4
+
5
+ /**
6
+ * WebSocket Server implementation of ChannelServer
7
+ */
8
+
9
+ /**
10
+ * WebSocket Server
11
+ */
12
+ declare class WebSocketServer implements ChannelServer {
13
+ private wss;
14
+ private connections;
15
+ private connectionHandlers;
16
+ private options;
17
+ private attachedToServer;
18
+ constructor(options?: ChannelServerOptions);
19
+ listen(port: number, host?: string): Promise<void>;
20
+ attach(server: MinimalHTTPServer, path?: string): void;
21
+ private handleConnection;
22
+ onConnection(handler: (connection: ChannelConnection) => void): Unsubscribe;
23
+ broadcast(message: string): void;
24
+ close(): Promise<void>;
25
+ dispose(): Promise<void>;
26
+ }
27
+
28
+ export { WebSocketServer };