@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/browser-qLiqDF2b.d.cts +56 -0
- package/dist/browser-qLiqDF2b.d.ts +56 -0
- package/dist/browser.cjs +308 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +2 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.js +9 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-63P5VUHB.js +275 -0
- package/dist/chunk-63P5VUHB.js.map +1 -0
- package/dist/index.cjs +491 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +28 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +192 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
|
|
5
|
+
// src/WebSocketClient.ts
|
|
6
|
+
import { createLogger } from "@agentxjs/common";
|
|
7
|
+
var logger = createLogger("network/WebSocketClient");
|
|
8
|
+
var isBrowser = typeof globalThis !== "undefined" && typeof globalThis.window !== "undefined" && typeof globalThis.window.WebSocket !== "undefined";
|
|
9
|
+
var WebSocketClient = class {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
__publicField(this, "ws", null);
|
|
12
|
+
__publicField(this, "serverUrl");
|
|
13
|
+
__publicField(this, "messageHandlers", /* @__PURE__ */ new Set());
|
|
14
|
+
__publicField(this, "openHandlers", /* @__PURE__ */ new Set());
|
|
15
|
+
__publicField(this, "closeHandlers", /* @__PURE__ */ new Set());
|
|
16
|
+
__publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
|
|
17
|
+
if (isBrowser) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
"Use createBrowserWebSocketClient() in browser environment for auto-reconnect support"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
this.serverUrl = options.serverUrl;
|
|
23
|
+
}
|
|
24
|
+
get readyState() {
|
|
25
|
+
if (!this.ws) return "closed";
|
|
26
|
+
const state = this.ws.readyState;
|
|
27
|
+
if (state === 0) return "connecting";
|
|
28
|
+
if (state === 1) return "open";
|
|
29
|
+
if (state === 2) return "closing";
|
|
30
|
+
return "closed";
|
|
31
|
+
}
|
|
32
|
+
async connect() {
|
|
33
|
+
if (this.ws) {
|
|
34
|
+
throw new Error("Already connected or connecting");
|
|
35
|
+
}
|
|
36
|
+
const { WebSocket: NodeWebSocket } = await import("ws");
|
|
37
|
+
this.ws = new NodeWebSocket(this.serverUrl);
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
const onOpen = () => {
|
|
40
|
+
logger.info("WebSocket connected", { serverUrl: this.serverUrl });
|
|
41
|
+
for (const handler of this.openHandlers) {
|
|
42
|
+
handler();
|
|
43
|
+
}
|
|
44
|
+
resolve();
|
|
45
|
+
};
|
|
46
|
+
const onError = (err) => {
|
|
47
|
+
logger.error("WebSocket connection failed", {
|
|
48
|
+
serverUrl: this.serverUrl,
|
|
49
|
+
error: err?.message
|
|
50
|
+
});
|
|
51
|
+
reject(err || new Error("WebSocket connection failed"));
|
|
52
|
+
};
|
|
53
|
+
this.ws.once("open", onOpen);
|
|
54
|
+
this.ws.once("error", onError);
|
|
55
|
+
this.ws.on("message", (data) => {
|
|
56
|
+
const message = data.toString();
|
|
57
|
+
for (const handler of this.messageHandlers) {
|
|
58
|
+
handler(message);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
this.ws.on("close", () => {
|
|
62
|
+
logger.warn("WebSocket closed");
|
|
63
|
+
for (const handler of this.closeHandlers) {
|
|
64
|
+
handler();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
this.ws.on("error", (err) => {
|
|
68
|
+
logger.error("WebSocket error", { error: err.message });
|
|
69
|
+
for (const handler of this.errorHandlers) {
|
|
70
|
+
handler(err);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
send(message) {
|
|
76
|
+
if (!this.ws || this.ws.readyState !== 1) {
|
|
77
|
+
throw new Error("WebSocket is not open");
|
|
78
|
+
}
|
|
79
|
+
this.ws.send(message);
|
|
80
|
+
}
|
|
81
|
+
onMessage(handler) {
|
|
82
|
+
this.messageHandlers.add(handler);
|
|
83
|
+
return () => {
|
|
84
|
+
this.messageHandlers.delete(handler);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
onOpen(handler) {
|
|
88
|
+
this.openHandlers.add(handler);
|
|
89
|
+
return () => {
|
|
90
|
+
this.openHandlers.delete(handler);
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
onClose(handler) {
|
|
94
|
+
this.closeHandlers.add(handler);
|
|
95
|
+
return () => {
|
|
96
|
+
this.closeHandlers.delete(handler);
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
onError(handler) {
|
|
100
|
+
this.errorHandlers.add(handler);
|
|
101
|
+
return () => {
|
|
102
|
+
this.errorHandlers.delete(handler);
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
close() {
|
|
106
|
+
if (this.ws) {
|
|
107
|
+
this.ws.close();
|
|
108
|
+
this.ws = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
dispose() {
|
|
112
|
+
this.close();
|
|
113
|
+
this.messageHandlers.clear();
|
|
114
|
+
this.openHandlers.clear();
|
|
115
|
+
this.closeHandlers.clear();
|
|
116
|
+
this.errorHandlers.clear();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
var BrowserWebSocketClient = class {
|
|
120
|
+
// Track if this is a reconnection
|
|
121
|
+
constructor(options) {
|
|
122
|
+
__publicField(this, "ws", null);
|
|
123
|
+
__publicField(this, "serverUrl");
|
|
124
|
+
__publicField(this, "options");
|
|
125
|
+
__publicField(this, "messageHandlers", /* @__PURE__ */ new Set());
|
|
126
|
+
__publicField(this, "openHandlers", /* @__PURE__ */ new Set());
|
|
127
|
+
__publicField(this, "closeHandlers", /* @__PURE__ */ new Set());
|
|
128
|
+
__publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
|
|
129
|
+
__publicField(this, "hasConnectedBefore", false);
|
|
130
|
+
if (!isBrowser) {
|
|
131
|
+
throw new Error("BrowserWebSocketClient can only be used in browser environment");
|
|
132
|
+
}
|
|
133
|
+
this.serverUrl = options.serverUrl;
|
|
134
|
+
this.options = {
|
|
135
|
+
autoReconnect: true,
|
|
136
|
+
minReconnectionDelay: 1e3,
|
|
137
|
+
maxReconnectionDelay: 1e4,
|
|
138
|
+
maxRetries: Infinity,
|
|
139
|
+
connectionTimeout: 4e3,
|
|
140
|
+
debug: false,
|
|
141
|
+
...options
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
get readyState() {
|
|
145
|
+
if (!this.ws) return "closed";
|
|
146
|
+
const state = this.ws.readyState;
|
|
147
|
+
if (state === 0) return "connecting";
|
|
148
|
+
if (state === 1) return "open";
|
|
149
|
+
if (state === 2) return "closing";
|
|
150
|
+
return "closed";
|
|
151
|
+
}
|
|
152
|
+
async connect() {
|
|
153
|
+
if (this.ws) {
|
|
154
|
+
throw new Error("Already connected or connecting");
|
|
155
|
+
}
|
|
156
|
+
if (this.options.autoReconnect) {
|
|
157
|
+
const ReconnectingWebSocket = (await import("reconnecting-websocket")).default;
|
|
158
|
+
this.ws = new ReconnectingWebSocket(this.serverUrl, [], {
|
|
159
|
+
maxReconnectionDelay: this.options.maxReconnectionDelay,
|
|
160
|
+
minReconnectionDelay: this.options.minReconnectionDelay,
|
|
161
|
+
reconnectionDelayGrowFactor: 1.3,
|
|
162
|
+
connectionTimeout: this.options.connectionTimeout,
|
|
163
|
+
maxRetries: this.options.maxRetries,
|
|
164
|
+
debug: this.options.debug
|
|
165
|
+
});
|
|
166
|
+
} else {
|
|
167
|
+
this.ws = new WebSocket(this.serverUrl);
|
|
168
|
+
}
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
const onOpen = () => {
|
|
171
|
+
if (this.hasConnectedBefore) {
|
|
172
|
+
logger.info("WebSocket reconnected successfully", { serverUrl: this.serverUrl });
|
|
173
|
+
} else {
|
|
174
|
+
logger.info("WebSocket connected", { serverUrl: this.serverUrl });
|
|
175
|
+
this.hasConnectedBefore = true;
|
|
176
|
+
}
|
|
177
|
+
for (const handler of this.openHandlers) {
|
|
178
|
+
handler();
|
|
179
|
+
}
|
|
180
|
+
resolve();
|
|
181
|
+
};
|
|
182
|
+
const onError = (_event) => {
|
|
183
|
+
logger.error("WebSocket connection failed", { serverUrl: this.serverUrl });
|
|
184
|
+
const error = new Error("WebSocket connection failed");
|
|
185
|
+
for (const handler of this.errorHandlers) {
|
|
186
|
+
handler(error);
|
|
187
|
+
}
|
|
188
|
+
reject(error);
|
|
189
|
+
};
|
|
190
|
+
this.ws.addEventListener("open", onOpen, { once: true });
|
|
191
|
+
this.ws.addEventListener("error", onError, { once: true });
|
|
192
|
+
this.ws.addEventListener("message", ((event) => {
|
|
193
|
+
const message = event.data;
|
|
194
|
+
for (const handler of this.messageHandlers) {
|
|
195
|
+
handler(message);
|
|
196
|
+
}
|
|
197
|
+
}));
|
|
198
|
+
this.ws.addEventListener("close", (() => {
|
|
199
|
+
logger.info("WebSocket closed, attempting to reconnect...");
|
|
200
|
+
for (const handler of this.closeHandlers) {
|
|
201
|
+
handler();
|
|
202
|
+
}
|
|
203
|
+
}));
|
|
204
|
+
this.ws.addEventListener("error", ((_event) => {
|
|
205
|
+
logger.error("WebSocket error");
|
|
206
|
+
const error = new Error("WebSocket error");
|
|
207
|
+
for (const handler of this.errorHandlers) {
|
|
208
|
+
handler(error);
|
|
209
|
+
}
|
|
210
|
+
}));
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
send(message) {
|
|
214
|
+
if (!this.ws || this.ws.readyState !== 1) {
|
|
215
|
+
throw new Error("WebSocket is not open");
|
|
216
|
+
}
|
|
217
|
+
this.ws.send(message);
|
|
218
|
+
}
|
|
219
|
+
onMessage(handler) {
|
|
220
|
+
this.messageHandlers.add(handler);
|
|
221
|
+
return () => {
|
|
222
|
+
this.messageHandlers.delete(handler);
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
onOpen(handler) {
|
|
226
|
+
this.openHandlers.add(handler);
|
|
227
|
+
return () => {
|
|
228
|
+
this.openHandlers.delete(handler);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
onClose(handler) {
|
|
232
|
+
this.closeHandlers.add(handler);
|
|
233
|
+
return () => {
|
|
234
|
+
this.closeHandlers.delete(handler);
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
onError(handler) {
|
|
238
|
+
this.errorHandlers.add(handler);
|
|
239
|
+
return () => {
|
|
240
|
+
this.errorHandlers.delete(handler);
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
close() {
|
|
244
|
+
if (this.ws) {
|
|
245
|
+
this.ws.close();
|
|
246
|
+
this.ws = null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
dispose() {
|
|
250
|
+
this.close();
|
|
251
|
+
this.messageHandlers.clear();
|
|
252
|
+
this.openHandlers.clear();
|
|
253
|
+
this.closeHandlers.clear();
|
|
254
|
+
this.errorHandlers.clear();
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
async function createWebSocketClient(options) {
|
|
258
|
+
if (isBrowser) {
|
|
259
|
+
const client = new BrowserWebSocketClient(options);
|
|
260
|
+
await client.connect();
|
|
261
|
+
return client;
|
|
262
|
+
} else {
|
|
263
|
+
const client = new WebSocketClient(options);
|
|
264
|
+
await client.connect();
|
|
265
|
+
return client;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export {
|
|
270
|
+
__publicField,
|
|
271
|
+
WebSocketClient,
|
|
272
|
+
BrowserWebSocketClient,
|
|
273
|
+
createWebSocketClient
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=chunk-63P5VUHB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/WebSocketClient.ts"],"sourcesContent":["/**\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":[]}
|