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