@lightconexyz/lightcone-sdk 0.4.15 → 0.4.16
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/ws/client.browser.d.ts +2 -1
- package/dist/ws/client.browser.d.ts.map +1 -1
- package/dist/ws/client.browser.js +9 -3
- package/dist/ws/client.browser.js.map +1 -1
- package/dist/ws/client.node.d.ts +2 -1
- package/dist/ws/client.node.d.ts.map +1 -1
- package/dist/ws/client.node.js +9 -3
- package/dist/ws/client.node.js.map +1 -1
- package/package.json +1 -1
|
@@ -40,7 +40,8 @@ export declare class WsClient implements IWsClient {
|
|
|
40
40
|
private backoffDelayMs;
|
|
41
41
|
private startHeartbeat;
|
|
42
42
|
private stopHeartbeat;
|
|
43
|
-
private
|
|
43
|
+
private armPongTimeout;
|
|
44
|
+
private clearPongTimeout;
|
|
44
45
|
private trackMessage;
|
|
45
46
|
private flushPendingMessages;
|
|
46
47
|
private resubscribeAll;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.browser.d.ts","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAGL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IAEpD;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAInF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;IAiBlB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxC,wBAAwB,IAAI,IAAI;IAMhC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IASlD,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,eAAe;IA2DvB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"client.browser.d.ts","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAGL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IAEpD;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAInF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;IAiBlB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxC,wBAAwB,IAAI,IAAI;IAMhC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IASlD,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,eAAe;IA2DvB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -181,7 +181,7 @@ class WsClient {
|
|
|
181
181
|
}
|
|
182
182
|
if (message.type === "pong") {
|
|
183
183
|
this.reconnectAttempts = 0;
|
|
184
|
-
this.
|
|
184
|
+
this.clearPongTimeout();
|
|
185
185
|
}
|
|
186
186
|
this.emit({ type: "Message", message });
|
|
187
187
|
}
|
|
@@ -221,7 +221,7 @@ class WsClient {
|
|
|
221
221
|
this.stopHeartbeat();
|
|
222
222
|
this.pingTimer = setInterval(() => {
|
|
223
223
|
this.send((0, index_1.ping)());
|
|
224
|
-
this.
|
|
224
|
+
this.armPongTimeout();
|
|
225
225
|
}, this.config.pingIntervalMs);
|
|
226
226
|
}
|
|
227
227
|
stopHeartbeat() {
|
|
@@ -234,7 +234,7 @@ class WsClient {
|
|
|
234
234
|
this.pongTimer = undefined;
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
|
-
|
|
237
|
+
armPongTimeout() {
|
|
238
238
|
if (this.pongTimer) {
|
|
239
239
|
clearTimeout(this.pongTimer);
|
|
240
240
|
}
|
|
@@ -244,6 +244,12 @@ class WsClient {
|
|
|
244
244
|
}
|
|
245
245
|
}, this.config.pongTimeoutMs);
|
|
246
246
|
}
|
|
247
|
+
clearPongTimeout() {
|
|
248
|
+
if (this.pongTimer) {
|
|
249
|
+
clearTimeout(this.pongTimer);
|
|
250
|
+
this.pongTimer = undefined;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
247
253
|
trackMessage(message) {
|
|
248
254
|
if (message.method === "subscribe") {
|
|
249
255
|
const key = (0, subscriptions_1.subscriptionKey)(message.params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.browser.js","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Browser WebSocket client using native `globalThis.WebSocket`.\n *\n * Selected at build time via the `\"browser\"` field in package.json.\n */\nimport {\n parseMessageIn,\n ping,\n ReadyState,\n type MessageIn,\n type MessageOut,\n type WsConfig,\n type WsEvent,\n WS_DEFAULT_CONFIG,\n} from \"./index\";\nimport {\n subscriptionKey,\n unsubscribeMatches,\n type SubscribeParams,\n type UnsubscribeParams,\n} from \"./subscriptions\";\nimport type { IWsClient } from \"./types\";\n\nexport class WsClient implements IWsClient {\n private readonly config: WsConfig;\n private socket?: WebSocket;\n private reconnectAttempts = 0;\n private userInitiatedClose = false;\n private pingTimer?: ReturnType<typeof setInterval>;\n private pongTimer?: ReturnType<typeof setTimeout>;\n private callbacks: Array<(event: WsEvent) => void> = [];\n private readonly activeSubscriptions: SubscribeParams[] = [];\n private readonly pendingMessages: MessageOut[] = [];\n\n /**\n * @param config - WebSocket configuration (url, reconnect settings, etc.)\n * @param _authTokenRef - Ignored in browser builds. The browser automatically\n * sends HTTP-only cookies with same-origin WebSocket\n * connections, so manual token injection is unnecessary.\n */\n constructor(config?: Partial<WsConfig>, _authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\n }\n\n async connect(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Open) {\n return;\n }\n\n await this.connectInternal();\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n this.stopHeartbeat();\n\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n\n await new Promise<void>((resolve) => {\n socket.addEventListener(\"close\", () => resolve(), { once: true });\n socket.close(1000, \"Client disconnect\");\n });\n }\n\n send(message: MessageOut): void {\n this.trackMessage(message);\n\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n this.pendingMessages.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n subscribe(params: SubscribeParams): void {\n this.send({ method: \"subscribe\", params });\n }\n\n unsubscribe(params: UnsubscribeParams): void {\n this.send({ method: \"unsubscribe\", params });\n }\n\n isConnected(): boolean {\n return this.readyState() === ReadyState.Open;\n }\n\n readyState(): ReadyState {\n if (!this.socket) {\n return ReadyState.Closed;\n }\n switch (this.socket.readyState) {\n case WebSocket.CONNECTING:\n return ReadyState.Connecting;\n case WebSocket.OPEN:\n return ReadyState.Open;\n case WebSocket.CLOSING:\n return ReadyState.Closing;\n case WebSocket.CLOSED:\n default:\n return ReadyState.Closed;\n }\n }\n\n async restartConnection(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Connecting) {\n return;\n }\n\n if (this.socket) {\n this.stopHeartbeat();\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n await new Promise<void>((resolve) => {\n socket.addEventListener(\"close\", () => resolve(), { once: true });\n socket.close(1000, \"Restart connection\");\n });\n }\n\n this.reconnectAttempts = 0;\n await this.connectInternal();\n }\n\n clearAuthedSubscriptions(): void {\n const next = this.activeSubscriptions.filter((params) => params.type !== \"user\");\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n\n on(callback: (event: WsEvent) => void): () => void {\n this.callbacks.push(callback);\n return () => {\n this.callbacks = this.callbacks.filter((cb) => cb !== callback);\n };\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private emit(event: WsEvent): void {\n for (const callback of this.callbacks) {\n try {\n callback(event);\n } catch (err) {\n console.warn(\"WsClient: listener threw\", err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n private connectInternal(): Promise<void> {\n // Browser WebSocket automatically includes cookies for same-origin connections.\n const socket = new WebSocket(this.config.url);\n this.socket = socket;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n cleanup();\n clearTimeout(timeoutId);\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n };\n\n const onError = (event: Event): void => {\n cleanup();\n clearTimeout(timeoutId);\n reject(new Error(`WebSocket connection error: ${(event as ErrorEvent).message ?? \"unknown\"}`));\n };\n\n const cleanup = (): void => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n\n // Persistent listeners (survive initial connection)\n socket.addEventListener(\"message\", (event: MessageEvent) => {\n this.handleIncoming(event.data as string);\n });\n\n socket.addEventListener(\"close\", (event: CloseEvent) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code: event.code, reason: event.reason });\n if (!manualClose) {\n this.handleClose(event.code);\n }\n });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n socket.close();\n reject(new Error(\"WebSocket connection timeout (30s)\"));\n }, 30_000);\n });\n\n return Promise.race([connectionPromise, timeoutPromise]);\n }\n\n private handleIncoming(raw: string): void {\n let message: MessageIn;\n\n try {\n message = parseMessageIn(raw);\n } catch (error) {\n this.emit({\n type: \"Error\",\n error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n if (message.type === \"pong\") {\n this.reconnectAttempts = 0;\n this.resetPongTimeout();\n }\n\n this.emit({ type: \"Message\", message });\n }\n\n private handleClose(code: number): void {\n if (!this.config.reconnect) {\n return;\n }\n\n if (code === 1000) {\n return;\n }\n\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.emit({ type: \"MaxReconnectReached\" });\n return;\n }\n\n this.reconnectAttempts += 1;\n const isRateLimited = code === 1008;\n const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);\n\n setTimeout(() => {\n void this.connectInternal().catch((error) => {\n this.emit({\n type: \"Error\",\n error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n this.handleClose(1011);\n });\n }, backoffMs);\n }\n\n private backoffDelayMs(attempt: number, isRateLimited: boolean): number {\n const exponent = Math.min(Math.max(0, attempt - 1), 10);\n const base = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitterMax = isRateLimited ? 1000 : 500;\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n const cap = isRateLimited ? 300_000 : 60_000;\n return Math.min(base + jitter, cap);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.resetPongTimeout();\n }, this.config.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private resetPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n }\n\n this.pongTimer = setTimeout(() => {\n if (this.socket && this.readyState() === ReadyState.Open) {\n this.socket.close(4000, \"Pong timeout\");\n }\n }, this.config.pongTimeoutMs);\n }\n\n private trackMessage(message: MessageOut): void {\n if (message.method === \"subscribe\") {\n const key = subscriptionKey(message.params);\n const existing = this.activeSubscriptions.find((params) => subscriptionKey(params) === key);\n if (!existing) {\n this.activeSubscriptions.push(message.params);\n }\n return;\n }\n\n if (message.method === \"unsubscribe\") {\n const next = this.activeSubscriptions.filter(\n (params) => !unsubscribeMatches(params, message.params)\n );\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n }\n\n private flushPendingMessages(): void {\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n return;\n }\n\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (!message) {\n continue;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n\n private resubscribeAll(): void {\n for (const params of this.activeSubscriptions) {\n this.pendingMessages.push({ method: \"subscribe\", params });\n }\n this.flushPendingMessages();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.browser.js","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,mCASiB;AACjB,mDAKyB;AAGzB,MAAa,QAAQ;IACF,MAAM,CAAW;IAC1B,MAAM,CAAa;IACnB,iBAAiB,GAAG,CAAC,CAAC;IACtB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,SAAS,CAAkC;IAC3C,SAAS,CAAiC;IAC1C,SAAS,GAAoC,EAAE,CAAC;IACvC,mBAAmB,GAAsB,EAAE,CAAC;IAC5C,eAAe,GAAiB,EAAE,CAAC;IAEpD;;;;;OAKG;IACH,YAAY,MAA0B,EAAE,aAAiD;QACvF,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,yBAAiB,EAAE,GAAG,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,kBAAU,CAAC,IAAI,EAAE,CAAC;YACzD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAE/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAmB;QACtB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,kBAAU,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,SAAS,CAAC,MAAuB;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,MAAyB;QACnC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,kBAAU,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,kBAAU,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/B,KAAK,SAAS,CAAC,UAAU;gBACvB,OAAO,kBAAU,CAAC,UAAU,CAAC;YAC/B,KAAK,SAAS,CAAC,IAAI;gBACjB,OAAO,kBAAU,CAAC,IAAI,CAAC;YACzB,KAAK,SAAS,CAAC,OAAO;gBACpB,OAAO,kBAAU,CAAC,OAAO,CAAC;YAC5B,KAAK,SAAS,CAAC,MAAM,CAAC;YACtB;gBACE,OAAO,kBAAU,CAAC,MAAM,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,kBAAU,CAAC,UAAU,EAAE,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,wBAAwB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACjF,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,QAAkC;QACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC;IAED,2EAA2E;IAEnE,IAAI,CAAC,KAAc;QACzB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,gFAAgF;QAChF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,SAAwC,CAAC;QAE7C,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9D,MAAM,MAAM,GAAG,GAAS,EAAE;gBACxB,OAAO,EAAE,CAAC;gBACV,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBACjC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;gBACrC,OAAO,EAAE,CAAC;gBACV,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAAgC,KAAoB,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YACjG,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC3C,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE1C,oDAAoD;YACpD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAmB,EAAE,EAAE;gBACzD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;gBACrD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAC5C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5E,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC1D,CAAC,EAAE,MAAM,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,cAAc,CAAC,GAAW;QAChC,IAAI,OAAkB,CAAC;QAEvB,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAC1F,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,MAAM,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAE7E,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1C,IAAI,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACtF,CAAC,CAAC;gBACH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAEO,cAAc,CAAC,OAAe,EAAE,aAAsB;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,GAAG,CAAC,IAAI,QAAQ,CAAC;QAC9D,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,IAAA,YAAI,GAAE,CAAC,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,kBAAU,CAAC,IAAI,EAAE,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,OAAmB;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAA,+BAAe,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,+BAAe,EAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5F,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAC1C,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAA,kCAAkB,EAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CACxD,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,kBAAU,CAAC,IAAI,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;CACF;AAvUD,4BAuUC","sourcesContent":["/**\n * Browser WebSocket client using native `globalThis.WebSocket`.\n *\n * Selected at build time via the `\"browser\"` field in package.json.\n */\nimport {\n parseMessageIn,\n ping,\n ReadyState,\n type MessageIn,\n type MessageOut,\n type WsConfig,\n type WsEvent,\n WS_DEFAULT_CONFIG,\n} from \"./index\";\nimport {\n subscriptionKey,\n unsubscribeMatches,\n type SubscribeParams,\n type UnsubscribeParams,\n} from \"./subscriptions\";\nimport type { IWsClient } from \"./types\";\n\nexport class WsClient implements IWsClient {\n private readonly config: WsConfig;\n private socket?: WebSocket;\n private reconnectAttempts = 0;\n private userInitiatedClose = false;\n private pingTimer?: ReturnType<typeof setInterval>;\n private pongTimer?: ReturnType<typeof setTimeout>;\n private callbacks: Array<(event: WsEvent) => void> = [];\n private readonly activeSubscriptions: SubscribeParams[] = [];\n private readonly pendingMessages: MessageOut[] = [];\n\n /**\n * @param config - WebSocket configuration (url, reconnect settings, etc.)\n * @param _authTokenRef - Ignored in browser builds. The browser automatically\n * sends HTTP-only cookies with same-origin WebSocket\n * connections, so manual token injection is unnecessary.\n */\n constructor(config?: Partial<WsConfig>, _authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\n }\n\n async connect(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Open) {\n return;\n }\n\n await this.connectInternal();\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n this.stopHeartbeat();\n\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n\n await new Promise<void>((resolve) => {\n socket.addEventListener(\"close\", () => resolve(), { once: true });\n socket.close(1000, \"Client disconnect\");\n });\n }\n\n send(message: MessageOut): void {\n this.trackMessage(message);\n\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n this.pendingMessages.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n subscribe(params: SubscribeParams): void {\n this.send({ method: \"subscribe\", params });\n }\n\n unsubscribe(params: UnsubscribeParams): void {\n this.send({ method: \"unsubscribe\", params });\n }\n\n isConnected(): boolean {\n return this.readyState() === ReadyState.Open;\n }\n\n readyState(): ReadyState {\n if (!this.socket) {\n return ReadyState.Closed;\n }\n switch (this.socket.readyState) {\n case WebSocket.CONNECTING:\n return ReadyState.Connecting;\n case WebSocket.OPEN:\n return ReadyState.Open;\n case WebSocket.CLOSING:\n return ReadyState.Closing;\n case WebSocket.CLOSED:\n default:\n return ReadyState.Closed;\n }\n }\n\n async restartConnection(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Connecting) {\n return;\n }\n\n if (this.socket) {\n this.stopHeartbeat();\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n await new Promise<void>((resolve) => {\n socket.addEventListener(\"close\", () => resolve(), { once: true });\n socket.close(1000, \"Restart connection\");\n });\n }\n\n this.reconnectAttempts = 0;\n await this.connectInternal();\n }\n\n clearAuthedSubscriptions(): void {\n const next = this.activeSubscriptions.filter((params) => params.type !== \"user\");\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n\n on(callback: (event: WsEvent) => void): () => void {\n this.callbacks.push(callback);\n return () => {\n this.callbacks = this.callbacks.filter((cb) => cb !== callback);\n };\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private emit(event: WsEvent): void {\n for (const callback of this.callbacks) {\n try {\n callback(event);\n } catch (err) {\n console.warn(\"WsClient: listener threw\", err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n private connectInternal(): Promise<void> {\n // Browser WebSocket automatically includes cookies for same-origin connections.\n const socket = new WebSocket(this.config.url);\n this.socket = socket;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n cleanup();\n clearTimeout(timeoutId);\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n };\n\n const onError = (event: Event): void => {\n cleanup();\n clearTimeout(timeoutId);\n reject(new Error(`WebSocket connection error: ${(event as ErrorEvent).message ?? \"unknown\"}`));\n };\n\n const cleanup = (): void => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n\n // Persistent listeners (survive initial connection)\n socket.addEventListener(\"message\", (event: MessageEvent) => {\n this.handleIncoming(event.data as string);\n });\n\n socket.addEventListener(\"close\", (event: CloseEvent) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code: event.code, reason: event.reason });\n if (!manualClose) {\n this.handleClose(event.code);\n }\n });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n socket.close();\n reject(new Error(\"WebSocket connection timeout (30s)\"));\n }, 30_000);\n });\n\n return Promise.race([connectionPromise, timeoutPromise]);\n }\n\n private handleIncoming(raw: string): void {\n let message: MessageIn;\n\n try {\n message = parseMessageIn(raw);\n } catch (error) {\n this.emit({\n type: \"Error\",\n error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n if (message.type === \"pong\") {\n this.reconnectAttempts = 0;\n this.clearPongTimeout();\n }\n\n this.emit({ type: \"Message\", message });\n }\n\n private handleClose(code: number): void {\n if (!this.config.reconnect) {\n return;\n }\n\n if (code === 1000) {\n return;\n }\n\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.emit({ type: \"MaxReconnectReached\" });\n return;\n }\n\n this.reconnectAttempts += 1;\n const isRateLimited = code === 1008;\n const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);\n\n setTimeout(() => {\n void this.connectInternal().catch((error) => {\n this.emit({\n type: \"Error\",\n error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n this.handleClose(1011);\n });\n }, backoffMs);\n }\n\n private backoffDelayMs(attempt: number, isRateLimited: boolean): number {\n const exponent = Math.min(Math.max(0, attempt - 1), 10);\n const base = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitterMax = isRateLimited ? 1000 : 500;\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n const cap = isRateLimited ? 300_000 : 60_000;\n return Math.min(base + jitter, cap);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.armPongTimeout();\n }, this.config.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private armPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n }\n\n this.pongTimer = setTimeout(() => {\n if (this.socket && this.readyState() === ReadyState.Open) {\n this.socket.close(4000, \"Pong timeout\");\n }\n }, this.config.pongTimeoutMs);\n }\n\n private clearPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private trackMessage(message: MessageOut): void {\n if (message.method === \"subscribe\") {\n const key = subscriptionKey(message.params);\n const existing = this.activeSubscriptions.find((params) => subscriptionKey(params) === key);\n if (!existing) {\n this.activeSubscriptions.push(message.params);\n }\n return;\n }\n\n if (message.method === \"unsubscribe\") {\n const next = this.activeSubscriptions.filter(\n (params) => !unsubscribeMatches(params, message.params)\n );\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n }\n\n private flushPendingMessages(): void {\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n return;\n }\n\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (!message) {\n continue;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n\n private resubscribeAll(): void {\n for (const params of this.activeSubscriptions) {\n this.pendingMessages.push({ method: \"subscribe\", params });\n }\n this.flushPendingMessages();\n }\n}\n"]}
|
package/dist/ws/client.node.d.ts
CHANGED
|
@@ -30,7 +30,8 @@ export declare class WsClient implements IWsClient {
|
|
|
30
30
|
private backoffDelayMs;
|
|
31
31
|
private startHeartbeat;
|
|
32
32
|
private stopHeartbeat;
|
|
33
|
-
private
|
|
33
|
+
private armPongTimeout;
|
|
34
|
+
private clearPongTimeout;
|
|
34
35
|
private trackMessage;
|
|
35
36
|
private flushPendingMessages;
|
|
36
37
|
private resubscribeAll;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.node.d.ts","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoC;IAClE,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;gBAExC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKlF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;IAOlB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxC,wBAAwB,IAAI,IAAI;IAMhC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlD,OAAO,CAAC,IAAI;YAUE,eAAe;IAqD7B,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"client.node.d.ts","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoC;IAClE,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;gBAExC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKlF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;IAOlB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxC,wBAAwB,IAAI,IAAI;IAMhC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlD,OAAO,CAAC,IAAI;YAUE,eAAe;IAqD7B,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,cAAc;CAMvB"}
|
package/dist/ws/client.node.js
CHANGED
|
@@ -162,7 +162,7 @@ class WsClient {
|
|
|
162
162
|
}
|
|
163
163
|
if (message.type === "pong") {
|
|
164
164
|
this.reconnectAttempts = 0;
|
|
165
|
-
this.
|
|
165
|
+
this.clearPongTimeout();
|
|
166
166
|
}
|
|
167
167
|
this.emit({ type: "Message", message });
|
|
168
168
|
}
|
|
@@ -202,7 +202,7 @@ class WsClient {
|
|
|
202
202
|
this.stopHeartbeat();
|
|
203
203
|
this.pingTimer = setInterval(() => {
|
|
204
204
|
this.send((0, index_1.ping)());
|
|
205
|
-
this.
|
|
205
|
+
this.armPongTimeout();
|
|
206
206
|
}, this.config.pingIntervalMs);
|
|
207
207
|
}
|
|
208
208
|
stopHeartbeat() {
|
|
@@ -215,7 +215,7 @@ class WsClient {
|
|
|
215
215
|
this.pongTimer = undefined;
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
|
-
|
|
218
|
+
armPongTimeout() {
|
|
219
219
|
if (this.pongTimer) {
|
|
220
220
|
clearTimeout(this.pongTimer);
|
|
221
221
|
}
|
|
@@ -225,6 +225,12 @@ class WsClient {
|
|
|
225
225
|
}
|
|
226
226
|
}, this.config.pongTimeoutMs);
|
|
227
227
|
}
|
|
228
|
+
clearPongTimeout() {
|
|
229
|
+
if (this.pongTimer) {
|
|
230
|
+
clearTimeout(this.pongTimer);
|
|
231
|
+
this.pongTimer = undefined;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
228
234
|
trackMessage(message) {
|
|
229
235
|
if (message.method === "subscribe") {
|
|
230
236
|
const key = (0, subscriptions_1.subscriptionKey)(message.params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.node.js","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"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","sourcesContent":["import WebSocket from \"ws\";\nimport {\n parseMessageIn,\n ping,\n readyStateFrom,\n ReadyState,\n type MessageIn,\n type MessageOut,\n type WsConfig,\n type WsEvent,\n WS_DEFAULT_CONFIG,\n} from \"./index\";\nimport {\n subscriptionKey,\n unsubscribeMatches,\n type SubscribeParams,\n type UnsubscribeParams,\n} from \"./subscriptions\";\nimport type { IWsClient } from \"./types\";\n\nexport class WsClient implements IWsClient {\n private readonly config: WsConfig;\n private readonly authTokenRef?: () => Promise<string | undefined>;\n private socket?: WebSocket;\n private reconnectAttempts = 0;\n private userInitiatedClose = false;\n private pingTimer?: ReturnType<typeof setInterval>;\n private pongTimer?: ReturnType<typeof setTimeout>;\n private callbacks: Array<(event: WsEvent) => void> = [];\n private readonly activeSubscriptions: SubscribeParams[] = [];\n private readonly pendingMessages: MessageOut[] = [];\n\n constructor(config?: Partial<WsConfig>, authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\n this.authTokenRef = authTokenRef;\n }\n\n async connect(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Open) {\n return;\n }\n\n await this.connectInternal();\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n this.stopHeartbeat();\n\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => {\n resolve();\n });\n socket.close(1000, \"Client disconnect\");\n });\n }\n\n send(message: MessageOut): void {\n this.trackMessage(message);\n\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n this.pendingMessages.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n subscribe(params: SubscribeParams): void {\n this.send({ method: \"subscribe\", params });\n }\n\n unsubscribe(params: UnsubscribeParams): void {\n this.send({ method: \"unsubscribe\", params });\n }\n\n isConnected(): boolean {\n return this.readyState() === ReadyState.Open;\n }\n\n readyState(): ReadyState {\n if (!this.socket) {\n return ReadyState.Closed;\n }\n return readyStateFrom(this.socket.readyState);\n }\n\n async restartConnection(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Connecting) {\n return;\n }\n\n if (this.socket) {\n this.stopHeartbeat();\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => resolve());\n socket.close(1000, \"Restart connection\");\n });\n }\n\n this.reconnectAttempts = 0;\n await this.connectInternal();\n }\n\n clearAuthedSubscriptions(): void {\n const next = this.activeSubscriptions.filter((params) => params.type !== \"user\");\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n\n on(callback: (event: WsEvent) => void): () => void {\n this.callbacks.push(callback);\n return () => {\n this.callbacks = this.callbacks.filter((cb) => cb !== callback);\n };\n }\n\n private emit(event: WsEvent): void {\n for (const callback of this.callbacks) {\n try {\n callback(event);\n } catch (err) {\n console.warn(\"WsClient: listener threw\", err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n private async connectInternal(): Promise<void> {\n const headers: Record<string, string> = {};\n const token = this.authTokenRef ? await this.authTokenRef() : undefined;\n if (token) {\n headers.Cookie = `auth_token=${token}`;\n }\n\n const socket = new WebSocket(this.config.url, { headers });\n this.socket = socket;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => {\n clearTimeout(timeoutId);\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n });\n\n socket.once(\"error\", (error) => {\n clearTimeout(timeoutId);\n reject(error);\n });\n\n socket.on(\"message\", (raw) => {\n this.handleIncoming(raw.toString());\n });\n\n socket.on(\"close\", (code, reason) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code, reason: reason.toString() });\n if (!manualClose) {\n this.handleClose(code);\n }\n });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n socket.close();\n reject(new Error(\"WebSocket connection timeout (30s)\"));\n }, 30_000);\n });\n\n await Promise.race([connectionPromise, timeoutPromise]);\n }\n\n private handleIncoming(raw: string): void {\n let message: MessageIn;\n\n try {\n message = parseMessageIn(raw);\n } catch (error) {\n this.emit({\n type: \"Error\",\n error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n if (message.type === \"pong\") {\n this.reconnectAttempts = 0;\n this.resetPongTimeout();\n }\n\n this.emit({ type: \"Message\", message });\n }\n\n private handleClose(code: number): void {\n if (!this.config.reconnect) {\n return;\n }\n\n if (code === 1000) {\n return;\n }\n\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.emit({ type: \"MaxReconnectReached\" });\n return;\n }\n\n this.reconnectAttempts += 1;\n const isRateLimited = code === 1008;\n const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);\n\n setTimeout(() => {\n void this.connectInternal().catch((error) => {\n this.emit({\n type: \"Error\",\n error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n this.handleClose(1011);\n });\n }, backoffMs);\n }\n\n private backoffDelayMs(attempt: number, isRateLimited: boolean): number {\n const exponent = Math.min(Math.max(0, attempt - 1), 10);\n const base = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitterMax = isRateLimited ? 1000 : 500;\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n const cap = isRateLimited ? 300_000 : 60_000;\n return Math.min(base + jitter, cap);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.resetPongTimeout();\n }, this.config.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private resetPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n }\n\n this.pongTimer = setTimeout(() => {\n if (this.socket && this.readyState() === ReadyState.Open) {\n this.socket.close(4000, \"Pong timeout\");\n }\n }, this.config.pongTimeoutMs);\n }\n\n private trackMessage(message: MessageOut): void {\n if (message.method === \"subscribe\") {\n const key = subscriptionKey(message.params);\n const existing = this.activeSubscriptions.find((params) => subscriptionKey(params) === key);\n if (!existing) {\n this.activeSubscriptions.push(message.params);\n }\n return;\n }\n\n if (message.method === \"unsubscribe\") {\n const next = this.activeSubscriptions.filter(\n (params) => !unsubscribeMatches(params, message.params)\n );\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n }\n\n private flushPendingMessages(): void {\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n return;\n }\n\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (!message) {\n continue;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n\n private resubscribeAll(): void {\n for (const params of this.activeSubscriptions) {\n this.pendingMessages.push({ method: \"subscribe\", params });\n }\n this.flushPendingMessages();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.node.js","sourceRoot":"","sources":["../../src/ws/client.node.ts"],"names":[],"mappings":"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","sourcesContent":["import WebSocket from \"ws\";\nimport {\n parseMessageIn,\n ping,\n readyStateFrom,\n ReadyState,\n type MessageIn,\n type MessageOut,\n type WsConfig,\n type WsEvent,\n WS_DEFAULT_CONFIG,\n} from \"./index\";\nimport {\n subscriptionKey,\n unsubscribeMatches,\n type SubscribeParams,\n type UnsubscribeParams,\n} from \"./subscriptions\";\nimport type { IWsClient } from \"./types\";\n\nexport class WsClient implements IWsClient {\n private readonly config: WsConfig;\n private readonly authTokenRef?: () => Promise<string | undefined>;\n private socket?: WebSocket;\n private reconnectAttempts = 0;\n private userInitiatedClose = false;\n private pingTimer?: ReturnType<typeof setInterval>;\n private pongTimer?: ReturnType<typeof setTimeout>;\n private callbacks: Array<(event: WsEvent) => void> = [];\n private readonly activeSubscriptions: SubscribeParams[] = [];\n private readonly pendingMessages: MessageOut[] = [];\n\n constructor(config?: Partial<WsConfig>, authTokenRef?: () => Promise<string | undefined>) {\n this.config = { ...WS_DEFAULT_CONFIG, ...config };\n this.authTokenRef = authTokenRef;\n }\n\n async connect(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Open) {\n return;\n }\n\n await this.connectInternal();\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) {\n return;\n }\n\n this.stopHeartbeat();\n\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => {\n resolve();\n });\n socket.close(1000, \"Client disconnect\");\n });\n }\n\n send(message: MessageOut): void {\n this.trackMessage(message);\n\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n this.pendingMessages.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n subscribe(params: SubscribeParams): void {\n this.send({ method: \"subscribe\", params });\n }\n\n unsubscribe(params: UnsubscribeParams): void {\n this.send({ method: \"unsubscribe\", params });\n }\n\n isConnected(): boolean {\n return this.readyState() === ReadyState.Open;\n }\n\n readyState(): ReadyState {\n if (!this.socket) {\n return ReadyState.Closed;\n }\n return readyStateFrom(this.socket.readyState);\n }\n\n async restartConnection(): Promise<void> {\n if (this.socket && this.readyState() === ReadyState.Connecting) {\n return;\n }\n\n if (this.socket) {\n this.stopHeartbeat();\n const socket = this.socket;\n this.socket = undefined;\n this.userInitiatedClose = true;\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => resolve());\n socket.close(1000, \"Restart connection\");\n });\n }\n\n this.reconnectAttempts = 0;\n await this.connectInternal();\n }\n\n clearAuthedSubscriptions(): void {\n const next = this.activeSubscriptions.filter((params) => params.type !== \"user\");\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n\n on(callback: (event: WsEvent) => void): () => void {\n this.callbacks.push(callback);\n return () => {\n this.callbacks = this.callbacks.filter((cb) => cb !== callback);\n };\n }\n\n private emit(event: WsEvent): void {\n for (const callback of this.callbacks) {\n try {\n callback(event);\n } catch (err) {\n console.warn(\"WsClient: listener threw\", err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n private async connectInternal(): Promise<void> {\n const headers: Record<string, string> = {};\n const token = this.authTokenRef ? await this.authTokenRef() : undefined;\n if (token) {\n headers.Cookie = `auth_token=${token}`;\n }\n\n const socket = new WebSocket(this.config.url, { headers });\n this.socket = socket;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const connectionPromise = new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => {\n clearTimeout(timeoutId);\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.resubscribeAll();\n this.emit({ type: \"Connected\" });\n resolve();\n });\n\n socket.once(\"error\", (error) => {\n clearTimeout(timeoutId);\n reject(error);\n });\n\n socket.on(\"message\", (raw) => {\n this.handleIncoming(raw.toString());\n });\n\n socket.on(\"close\", (code, reason) => {\n const manualClose = this.userInitiatedClose;\n this.userInitiatedClose = false;\n this.stopHeartbeat();\n this.emit({ type: \"Disconnected\", code, reason: reason.toString() });\n if (!manualClose) {\n this.handleClose(code);\n }\n });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n socket.close();\n reject(new Error(\"WebSocket connection timeout (30s)\"));\n }, 30_000);\n });\n\n await Promise.race([connectionPromise, timeoutPromise]);\n }\n\n private handleIncoming(raw: string): void {\n let message: MessageIn;\n\n try {\n message = parseMessageIn(raw);\n } catch (error) {\n this.emit({\n type: \"Error\",\n error: `Deserialization error: ${error instanceof Error ? error.message : String(error)}`,\n });\n return;\n }\n\n if (message.type === \"pong\") {\n this.reconnectAttempts = 0;\n this.clearPongTimeout();\n }\n\n this.emit({ type: \"Message\", message });\n }\n\n private handleClose(code: number): void {\n if (!this.config.reconnect) {\n return;\n }\n\n if (code === 1000) {\n return;\n }\n\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.emit({ type: \"MaxReconnectReached\" });\n return;\n }\n\n this.reconnectAttempts += 1;\n const isRateLimited = code === 1008;\n const backoffMs = this.backoffDelayMs(this.reconnectAttempts, isRateLimited);\n\n setTimeout(() => {\n void this.connectInternal().catch((error) => {\n this.emit({\n type: \"Error\",\n error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n this.handleClose(1011);\n });\n }, backoffMs);\n }\n\n private backoffDelayMs(attempt: number, isRateLimited: boolean): number {\n const exponent = Math.min(Math.max(0, attempt - 1), 10);\n const base = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitterMax = isRateLimited ? 1000 : 500;\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n const cap = isRateLimited ? 300_000 : 60_000;\n return Math.min(base + jitter, cap);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n\n this.pingTimer = setInterval(() => {\n this.send(ping());\n this.armPongTimeout();\n }, this.config.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private armPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n }\n\n this.pongTimer = setTimeout(() => {\n if (this.socket && this.readyState() === ReadyState.Open) {\n this.socket.close(4000, \"Pong timeout\");\n }\n }, this.config.pongTimeoutMs);\n }\n\n private clearPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = undefined;\n }\n }\n\n private trackMessage(message: MessageOut): void {\n if (message.method === \"subscribe\") {\n const key = subscriptionKey(message.params);\n const existing = this.activeSubscriptions.find((params) => subscriptionKey(params) === key);\n if (!existing) {\n this.activeSubscriptions.push(message.params);\n }\n return;\n }\n\n if (message.method === \"unsubscribe\") {\n const next = this.activeSubscriptions.filter(\n (params) => !unsubscribeMatches(params, message.params)\n );\n this.activeSubscriptions.length = 0;\n this.activeSubscriptions.push(...next);\n }\n }\n\n private flushPendingMessages(): void {\n if (!this.socket || this.readyState() !== ReadyState.Open) {\n return;\n }\n\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (!message) {\n continue;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n\n private resubscribeAll(): void {\n for (const params of this.activeSubscriptions) {\n this.pendingMessages.push({ method: \"subscribe\", params });\n }\n this.flushPendingMessages();\n }\n}\n"]}
|