@lightconexyz/lightcone-sdk 0.2.2 → 0.2.4
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/README.md +25 -14
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/client.js +3 -7
- package/dist/auth/client.js.map +1 -1
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +17 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +36 -10
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +14 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +10 -0
- package/dist/context.js.map +1 -0
- package/dist/domain/admin/client.d.ts +15 -5
- package/dist/domain/admin/client.d.ts.map +1 -1
- package/dist/domain/admin/client.js +39 -0
- package/dist/domain/admin/client.js.map +1 -1
- package/dist/domain/index.d.ts +0 -1
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +1 -2
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/market/client.d.ts +11 -5
- package/dist/domain/market/client.d.ts.map +1 -1
- package/dist/domain/market/client.js +76 -0
- package/dist/domain/market/client.js.map +1 -1
- package/dist/domain/order/client.d.ts +21 -5
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +89 -0
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/order/index.d.ts +8 -2
- package/dist/domain/order/index.d.ts.map +1 -1
- package/dist/domain/order/index.js +23 -0
- package/dist/domain/order/index.js.map +1 -1
- package/dist/domain/orderbook/client.d.ts +7 -12
- package/dist/domain/orderbook/client.d.ts.map +1 -1
- package/dist/domain/orderbook/client.js +24 -4
- package/dist/domain/orderbook/client.js.map +1 -1
- package/dist/domain/orderbook/state.d.ts +2 -0
- package/dist/domain/orderbook/state.d.ts.map +1 -1
- package/dist/domain/orderbook/state.js +25 -2
- package/dist/domain/orderbook/state.js.map +1 -1
- package/dist/domain/position/client.d.ts +11 -5
- package/dist/domain/position/client.d.ts.map +1 -1
- package/dist/domain/position/client.js +38 -0
- package/dist/domain/position/client.js.map +1 -1
- package/dist/domain/position/index.d.ts +4 -1
- package/dist/domain/position/index.d.ts.map +1 -1
- package/dist/domain/position/index.js +20 -0
- package/dist/domain/position/index.js.map +1 -1
- package/dist/domain/position/wire.d.ts +6 -0
- package/dist/domain/position/wire.d.ts.map +1 -1
- package/dist/domain/position/wire.js.map +1 -1
- package/dist/domain/price_history/client.d.ts +25 -3
- package/dist/domain/price_history/client.d.ts.map +1 -1
- package/dist/domain/price_history/client.js +95 -6
- package/dist/domain/price_history/client.js.map +1 -1
- package/dist/domain/price_history/index.d.ts +4 -0
- package/dist/domain/price_history/index.d.ts.map +1 -1
- package/dist/domain/price_history/index.js.map +1 -1
- package/dist/domain/price_history/state.d.ts +16 -0
- package/dist/domain/price_history/state.d.ts.map +1 -1
- package/dist/domain/price_history/state.js +42 -1
- package/dist/domain/price_history/state.js.map +1 -1
- package/dist/domain/price_history/wire.d.ts +51 -21
- package/dist/domain/price_history/wire.d.ts.map +1 -1
- package/dist/domain/price_history/wire.js.map +1 -1
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +17 -36
- package/dist/http/client.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/prelude.d.ts +5 -6
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +4 -5
- package/dist/prelude.js.map +1 -1
- package/dist/privy/client.d.ts +1 -0
- package/dist/privy/client.d.ts.map +1 -1
- package/dist/privy/client.js +10 -0
- package/dist/privy/client.js.map +1 -1
- package/dist/program/accounts.d.ts +2 -1
- package/dist/program/accounts.d.ts.map +1 -1
- package/dist/program/accounts.js +2 -1
- package/dist/program/accounts.js.map +1 -1
- package/dist/program/index.d.ts +1 -2
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +8 -6
- package/dist/program/index.js.map +1 -1
- package/dist/program/instructions.d.ts +1 -1
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +3 -3
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/orders.d.ts +13 -1
- package/dist/program/orders.d.ts.map +1 -1
- package/dist/program/orders.js +53 -3
- package/dist/program/orders.js.map +1 -1
- package/dist/rpc.d.ts +19 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +51 -0
- package/dist/rpc.js.map +1 -0
- package/dist/shared/fmt/decimal.d.ts +1 -1
- package/dist/shared/fmt/decimal.d.ts.map +1 -1
- package/dist/shared/fmt/decimal.js +2 -2
- package/dist/shared/fmt/decimal.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +2 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/scaling.d.ts.map +1 -1
- package/dist/shared/scaling.js +7 -3
- package/dist/shared/scaling.js.map +1 -1
- package/dist/shared/types.d.ts +1 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +9 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/client.browser.d.ts +2 -0
- package/dist/ws/client.browser.d.ts.map +1 -1
- package/dist/ws/client.browser.js +43 -6
- package/dist/ws/client.browser.js.map +1 -1
- package/dist/ws/client.node.d.ts +2 -0
- package/dist/ws/client.node.d.ts.map +1 -1
- package/dist/ws/client.node.js +43 -6
- package/dist/ws/client.node.js.map +1 -1
- package/dist/ws/index.d.ts +1 -2
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js.map +1 -1
- package/dist/ws/types.d.ts +2 -0
- package/dist/ws/types.d.ts.map +1 -1
- package/dist/ws/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/domain/deposit_price/client.d.ts +0 -13
- package/dist/domain/deposit_price/client.d.ts.map +0 -1
- package/dist/domain/deposit_price/client.js +0 -28
- package/dist/domain/deposit_price/client.js.map +0 -1
- package/dist/domain/deposit_price/index.d.ts +0 -9
- package/dist/domain/deposit_price/index.d.ts.map +0 -1
- package/dist/domain/deposit_price/index.js +0 -20
- package/dist/domain/deposit_price/index.js.map +0 -1
- package/dist/domain/deposit_price/state.d.ts +0 -17
- package/dist/domain/deposit_price/state.d.ts.map +0 -1
- package/dist/domain/deposit_price/state.js +0 -45
- package/dist/domain/deposit_price/state.js.map +0 -1
- package/dist/domain/deposit_price/wire.d.ts +0 -36
- package/dist/domain/deposit_price/wire.d.ts.map +0 -1
- package/dist/domain/deposit_price/wire.js +0 -3
- package/dist/domain/deposit_price/wire.js.map +0 -1
- package/dist/program/client.d.ts +0 -96
- package/dist/program/client.d.ts.map +0 -1
- package/dist/program/client.js +0 -372
- package/dist/program/client.js.map +0 -1
|
@@ -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 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 return new Promise<void>((resolve, reject) => {\n const onOpen = (): void => {\n cleanup();\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 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\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.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 (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.max(0, attempt - 1);\n const raw = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitter = Math.random() * raw;\n const rateLimitPenalty = isRateLimited ? this.config.baseReconnectDelayMs : 0;\n return Math.floor(Math.min(raw + jitter + rateLimitPenalty, 60_000));\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":"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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"]}
|
package/dist/ws/client.node.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export declare class WsClient implements IWsClient {
|
|
|
20
20
|
unsubscribe(params: UnsubscribeParams): void;
|
|
21
21
|
isConnected(): boolean;
|
|
22
22
|
readyState(): ReadyState;
|
|
23
|
+
restartConnection(): Promise<void>;
|
|
24
|
+
clearAuthedSubscriptions(): void;
|
|
23
25
|
on(callback: (event: WsEvent) => void): () => void;
|
|
24
26
|
private emit;
|
|
25
27
|
private connectInternal;
|
|
@@ -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;
|
|
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;IAYxB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,cAAc;CAMvB"}
|
package/dist/ws/client.node.js
CHANGED
|
@@ -66,6 +66,28 @@ class WsClient {
|
|
|
66
66
|
}
|
|
67
67
|
return (0, index_1.readyStateFrom)(this.socket.readyState);
|
|
68
68
|
}
|
|
69
|
+
async restartConnection() {
|
|
70
|
+
if (this.socket && this.readyState() === index_1.ReadyState.Connecting) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (this.socket) {
|
|
74
|
+
this.stopHeartbeat();
|
|
75
|
+
const socket = this.socket;
|
|
76
|
+
this.socket = undefined;
|
|
77
|
+
this.userInitiatedClose = true;
|
|
78
|
+
await new Promise((resolve) => {
|
|
79
|
+
socket.once("close", () => resolve());
|
|
80
|
+
socket.close(1000, "Restart connection");
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
this.reconnectAttempts = 0;
|
|
84
|
+
await this.connectInternal();
|
|
85
|
+
}
|
|
86
|
+
clearAuthedSubscriptions() {
|
|
87
|
+
const next = this.activeSubscriptions.filter((params) => params.type !== "user");
|
|
88
|
+
this.activeSubscriptions.length = 0;
|
|
89
|
+
this.activeSubscriptions.push(...next);
|
|
90
|
+
}
|
|
69
91
|
on(callback) {
|
|
70
92
|
this.callbacks.push(callback);
|
|
71
93
|
return () => {
|
|
@@ -90,8 +112,10 @@ class WsClient {
|
|
|
90
112
|
}
|
|
91
113
|
const socket = new ws_1.default(this.config.url, { headers });
|
|
92
114
|
this.socket = socket;
|
|
93
|
-
|
|
115
|
+
let timeoutId;
|
|
116
|
+
const connectionPromise = new Promise((resolve, reject) => {
|
|
94
117
|
socket.once("open", () => {
|
|
118
|
+
clearTimeout(timeoutId);
|
|
95
119
|
this.reconnectAttempts = 0;
|
|
96
120
|
this.startHeartbeat();
|
|
97
121
|
this.flushPendingMessages();
|
|
@@ -100,6 +124,7 @@ class WsClient {
|
|
|
100
124
|
resolve();
|
|
101
125
|
});
|
|
102
126
|
socket.once("error", (error) => {
|
|
127
|
+
clearTimeout(timeoutId);
|
|
103
128
|
reject(error);
|
|
104
129
|
});
|
|
105
130
|
socket.on("message", (raw) => {
|
|
@@ -115,6 +140,13 @@ class WsClient {
|
|
|
115
140
|
}
|
|
116
141
|
});
|
|
117
142
|
});
|
|
143
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
144
|
+
timeoutId = setTimeout(() => {
|
|
145
|
+
socket.close();
|
|
146
|
+
reject(new Error("WebSocket connection timeout (30s)"));
|
|
147
|
+
}, 30_000);
|
|
148
|
+
});
|
|
149
|
+
await Promise.race([connectionPromise, timeoutPromise]);
|
|
118
150
|
}
|
|
119
151
|
handleIncoming(raw) {
|
|
120
152
|
let message;
|
|
@@ -129,6 +161,7 @@ class WsClient {
|
|
|
129
161
|
return;
|
|
130
162
|
}
|
|
131
163
|
if (message.type === "pong") {
|
|
164
|
+
this.reconnectAttempts = 0;
|
|
132
165
|
this.resetPongTimeout();
|
|
133
166
|
}
|
|
134
167
|
this.emit({ type: "Message", message });
|
|
@@ -137,6 +170,9 @@ class WsClient {
|
|
|
137
170
|
if (!this.config.reconnect) {
|
|
138
171
|
return;
|
|
139
172
|
}
|
|
173
|
+
if (code === 1000) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
140
176
|
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
141
177
|
this.emit({ type: "MaxReconnectReached" });
|
|
142
178
|
return;
|
|
@@ -155,11 +191,12 @@ class WsClient {
|
|
|
155
191
|
}, backoffMs);
|
|
156
192
|
}
|
|
157
193
|
backoffDelayMs(attempt, isRateLimited) {
|
|
158
|
-
const exponent = Math.max(0, attempt - 1);
|
|
159
|
-
const
|
|
160
|
-
const
|
|
161
|
-
const
|
|
162
|
-
|
|
194
|
+
const exponent = Math.min(Math.max(0, attempt - 1), 10);
|
|
195
|
+
const base = this.config.baseReconnectDelayMs * 2 ** exponent;
|
|
196
|
+
const jitterMax = isRateLimited ? 1000 : 500;
|
|
197
|
+
const jitter = Math.floor(Math.random() * (jitterMax + 1));
|
|
198
|
+
const cap = isRateLimited ? 300_000 : 60_000;
|
|
199
|
+
return Math.min(base + jitter, cap);
|
|
163
200
|
}
|
|
164
201
|
startHeartbeat() {
|
|
165
202
|
this.stopHeartbeat();
|
|
@@ -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 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 await new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => {\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 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\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.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 (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.max(0, attempt - 1);\n const raw = this.config.baseReconnectDelayMs * 2 ** exponent;\n const jitter = Math.random() * raw;\n const rateLimitPenalty = isRateLimited ? this.config.baseReconnectDelayMs : 0;\n return Math.floor(Math.min(raw + jitter + rateLimitPenalty, 60_000));\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.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"]}
|
package/dist/ws/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { DepositPrice } from "../domain/deposit_price";
|
|
2
1
|
import type { MarketEvent } from "../domain/market";
|
|
3
2
|
import type { AuthUpdate, UserUpdate } from "../domain/order";
|
|
4
3
|
import type { OrderBook, WsTickerData } from "../domain/orderbook";
|
|
5
|
-
import type { PriceHistory } from "../domain/price_history";
|
|
4
|
+
import type { DepositPrice, PriceHistory } from "../domain/price_history";
|
|
6
5
|
import type { WsTrade } from "../domain/trade";
|
|
7
6
|
import type { OrderBookId, PubkeyStr, Resolution } from "../shared";
|
|
8
7
|
export * from "./client.node";
|
package/dist/ws/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ws/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepositPrice } from \"../domain/deposit_price\";\nimport type { MarketEvent } from \"../domain/market\";\nimport type { AuthUpdate, UserUpdate } from \"../domain/order\";\nimport type { OrderBook, WsTickerData } from \"../domain/orderbook\";\nimport type { PriceHistory } from \"../domain/price_history\";\nimport type { WsTrade } from \"../domain/trade\";\nimport { DEFAULT_WS_URL } from \"../network\";\nimport type { OrderBookId, PubkeyStr, Resolution } from \"../shared\";\n\nexport * from \"./client.node\";\nexport * from \"./subscriptions\";\nexport type { IWsClient } from \"./types\";\n\nexport type MessageOut =\n | { method: \"subscribe\"; params: import(\"./subscriptions\").SubscribeParams }\n | { method: \"unsubscribe\"; params: import(\"./subscriptions\").UnsubscribeParams }\n | { method: \"ping\" };\n\nexport type MessageIn =\n | { type: \"book_update\"; version: number; data: OrderBook }\n | { type: \"pong\"; version: number; data: Record<string, never> }\n | { type: \"user\"; version: number; data: UserUpdate }\n | { type: \"error\"; version: number; data: WsError }\n | { type: \"price_history\"; version: number; data: PriceHistory }\n | { type: \"trades\"; version: number; data: WsTrade }\n | { type: \"auth\"; version: number; data: AuthUpdate }\n | { type: \"ticker\"; version: number; data: WsTickerData }\n | { type: \"market\"; version: number; data: MarketEvent }\n | { type: \"deposit_price\"; version: number; data: DepositPrice };\n\nexport type Kind = MessageIn;\n\nexport interface WsError {\n error: string;\n code?: string;\n orderbook_id?: string;\n wallet_address?: string;\n deposit_asset?: string;\n hint?: string;\n details?: string;\n}\n\nexport type WsEvent =\n | { type: \"Message\"; message: MessageIn }\n | { type: \"Connected\" }\n | { type: \"Disconnected\"; code?: number; reason: string }\n | { type: \"Error\"; error: string }\n | { type: \"MaxReconnectReached\" };\n\nexport interface WsConfig {\n url: string;\n reconnect: boolean;\n maxReconnectAttempts: number;\n baseReconnectDelayMs: number;\n pingIntervalMs: number;\n pongTimeoutMs: number;\n}\n\nexport const WS_DEFAULT_CONFIG: WsConfig = {\n url: DEFAULT_WS_URL,\n reconnect: true,\n maxReconnectAttempts: 10,\n baseReconnectDelayMs: 1_000,\n pingIntervalMs: 30_000,\n pongTimeoutMs: 1_000,\n};\n\nexport enum ReadyState {\n Connecting = 0,\n Open = 1,\n Closing = 2,\n Closed = 3,\n}\n\nexport function readyStateFrom(value: number): ReadyState {\n switch (value) {\n case 0:\n return ReadyState.Connecting;\n case 1:\n return ReadyState.Open;\n case 2:\n return ReadyState.Closing;\n case 3:\n default:\n return ReadyState.Closed;\n }\n}\n\nexport function ping(): MessageOut {\n return { method: \"ping\" };\n}\n\nexport function subscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function unsubscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function subscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n include_ohlcv: false,\n },\n };\n}\n\nexport function unsubscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n },\n };\n}\n\nexport function subscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function unsubscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function subscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"deposit_price\",\n deposit_asset: depositAsset,\n resolution,\n },\n };\n}\n\nexport function unsubscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"deposit_price\",\n deposit_asset: depositAsset,\n resolution,\n },\n };\n}\n\nconst VALID_MESSAGE_TYPES = new Set([\n \"book_update\",\n \"pong\",\n \"user\",\n \"error\",\n \"price_history\",\n \"trades\",\n \"auth\",\n \"ticker\",\n \"market\",\n \"deposit_price\",\n]);\n\nexport function parseMessageIn(input: string): MessageIn {\n const parsed: unknown = JSON.parse(input);\n if (typeof parsed !== \"object\" || parsed === null || !(\"type\" in parsed)) {\n throw new Error(`Invalid WS message: missing \"type\" field`);\n }\n const obj = parsed as Record<string, unknown>;\n if (typeof obj.type !== \"string\" || !VALID_MESSAGE_TYPES.has(obj.type)) {\n throw new Error(`Invalid WS message type: \"${String(obj.type)}\"`);\n }\n if (!(\"version\" in obj) || typeof obj.version !== \"number\") {\n throw new Error(`Invalid WS message: missing or invalid \"version\" field`);\n }\n if (!(\"data\" in obj) || typeof obj.data !== \"object\" || obj.data === null) {\n throw new Error(`Invalid WS message: missing or invalid \"data\" field`);\n }\n return parsed as MessageIn;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MarketEvent } from \"../domain/market\";\nimport type { AuthUpdate, UserUpdate } from \"../domain/order\";\nimport type { OrderBook, WsTickerData } from \"../domain/orderbook\";\nimport type { DepositPrice, PriceHistory } from \"../domain/price_history\";\nimport type { WsTrade } from \"../domain/trade\";\nimport { DEFAULT_WS_URL } from \"../network\";\nimport type { OrderBookId, PubkeyStr, Resolution } from \"../shared\";\n\nexport * from \"./client.node\";\nexport * from \"./subscriptions\";\nexport type { IWsClient } from \"./types\";\n\nexport type MessageOut =\n | { method: \"subscribe\"; params: import(\"./subscriptions\").SubscribeParams }\n | { method: \"unsubscribe\"; params: import(\"./subscriptions\").UnsubscribeParams }\n | { method: \"ping\" };\n\nexport type MessageIn =\n | { type: \"book_update\"; version: number; data: OrderBook }\n | { type: \"pong\"; version: number; data: Record<string, never> }\n | { type: \"user\"; version: number; data: UserUpdate }\n | { type: \"error\"; version: number; data: WsError }\n | { type: \"price_history\"; version: number; data: PriceHistory }\n | { type: \"trades\"; version: number; data: WsTrade }\n | { type: \"auth\"; version: number; data: AuthUpdate }\n | { type: \"ticker\"; version: number; data: WsTickerData }\n | { type: \"market\"; version: number; data: MarketEvent }\n | { type: \"deposit_price\"; version: number; data: DepositPrice };\n\nexport type Kind = MessageIn;\n\nexport interface WsError {\n error: string;\n code?: string;\n orderbook_id?: string;\n wallet_address?: string;\n deposit_asset?: string;\n hint?: string;\n details?: string;\n}\n\nexport type WsEvent =\n | { type: \"Message\"; message: MessageIn }\n | { type: \"Connected\" }\n | { type: \"Disconnected\"; code?: number; reason: string }\n | { type: \"Error\"; error: string }\n | { type: \"MaxReconnectReached\" };\n\nexport interface WsConfig {\n url: string;\n reconnect: boolean;\n maxReconnectAttempts: number;\n baseReconnectDelayMs: number;\n pingIntervalMs: number;\n pongTimeoutMs: number;\n}\n\nexport const WS_DEFAULT_CONFIG: WsConfig = {\n url: DEFAULT_WS_URL,\n reconnect: true,\n maxReconnectAttempts: 10,\n baseReconnectDelayMs: 1_000,\n pingIntervalMs: 30_000,\n pongTimeoutMs: 1_000,\n};\n\nexport enum ReadyState {\n Connecting = 0,\n Open = 1,\n Closing = 2,\n Closed = 3,\n}\n\nexport function readyStateFrom(value: number): ReadyState {\n switch (value) {\n case 0:\n return ReadyState.Connecting;\n case 1:\n return ReadyState.Open;\n case 2:\n return ReadyState.Closing;\n case 3:\n default:\n return ReadyState.Closed;\n }\n}\n\nexport function ping(): MessageOut {\n return { method: \"ping\" };\n}\n\nexport function subscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeBooks(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"book_update\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTrades(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"trades\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function unsubscribeUser(walletAddress: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"user\",\n wallet_address: walletAddress,\n },\n };\n}\n\nexport function subscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n include_ohlcv: false,\n },\n };\n}\n\nexport function unsubscribePriceHistory(orderbookId: OrderBookId, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"price_history\",\n orderbook_id: orderbookId,\n resolution,\n },\n };\n}\n\nexport function subscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function unsubscribeTicker(orderbookIds: OrderBookId[]): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"ticker\",\n orderbook_ids: orderbookIds,\n },\n };\n}\n\nexport function subscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function unsubscribeMarket(marketPubkey: PubkeyStr): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"market\",\n market_pubkey: marketPubkey,\n },\n };\n}\n\nexport function subscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut {\n return {\n method: \"subscribe\",\n params: {\n type: \"deposit_price\",\n deposit_asset: depositAsset,\n resolution,\n },\n };\n}\n\nexport function unsubscribeDepositPrice(depositAsset: string, resolution: Resolution): MessageOut {\n return {\n method: \"unsubscribe\",\n params: {\n type: \"deposit_price\",\n deposit_asset: depositAsset,\n resolution,\n },\n };\n}\n\nconst VALID_MESSAGE_TYPES = new Set([\n \"book_update\",\n \"pong\",\n \"user\",\n \"error\",\n \"price_history\",\n \"trades\",\n \"auth\",\n \"ticker\",\n \"market\",\n \"deposit_price\",\n]);\n\nexport function parseMessageIn(input: string): MessageIn {\n const parsed: unknown = JSON.parse(input);\n if (typeof parsed !== \"object\" || parsed === null || !(\"type\" in parsed)) {\n throw new Error(`Invalid WS message: missing \"type\" field`);\n }\n const obj = parsed as Record<string, unknown>;\n if (typeof obj.type !== \"string\" || !VALID_MESSAGE_TYPES.has(obj.type)) {\n throw new Error(`Invalid WS message type: \"${String(obj.type)}\"`);\n }\n if (!(\"version\" in obj) || typeof obj.version !== \"number\") {\n throw new Error(`Invalid WS message: missing or invalid \"version\" field`);\n }\n if (!(\"data\" in obj) || typeof obj.data !== \"object\" || obj.data === null) {\n throw new Error(`Invalid WS message: missing or invalid \"data\" field`);\n }\n return parsed as MessageIn;\n}\n"]}
|
package/dist/ws/types.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface IWsClient {
|
|
|
18
18
|
unsubscribe(params: UnsubscribeParams): void;
|
|
19
19
|
isConnected(): boolean;
|
|
20
20
|
readyState(): ReadyState;
|
|
21
|
+
restartConnection(): Promise<void>;
|
|
22
|
+
clearAuthedSubscriptions(): void;
|
|
21
23
|
on(callback: (event: WsEvent) => void): () => void;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/ws/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ws/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE1E;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,WAAW,IAAI,OAAO,CAAC;IACvB,UAAU,IAAI,UAAU,CAAC;IACzB,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACpD"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ws/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE1E;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,WAAW,IAAI,OAAO,CAAC;IACvB,UAAU,IAAI,UAAU,CAAC;IACzB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,wBAAwB,IAAI,IAAI,CAAC;IACjC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACpD"}
|
package/dist/ws/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ws/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { MessageOut, ReadyState, WsEvent } from \"./index\";\nimport type { SubscribeParams, UnsubscribeParams } from \"./subscriptions\";\n\n/**\n * Shared interface for WebSocket clients.\n *\n * Two implementations exist:\n * - `client.node.ts` — Node.js, backed by the `ws` npm module\n * - `client.browser.ts` — Browser, backed by native `globalThis.WebSocket`\n *\n * The active implementation is selected at build time via the `\"browser\"`\n * field in package.json.\n */\nexport interface IWsClient {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n send(message: MessageOut): void;\n subscribe(params: SubscribeParams): void;\n unsubscribe(params: UnsubscribeParams): void;\n isConnected(): boolean;\n readyState(): ReadyState;\n on(callback: (event: WsEvent) => void): () => void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ws/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { MessageOut, ReadyState, WsEvent } from \"./index\";\nimport type { SubscribeParams, UnsubscribeParams } from \"./subscriptions\";\n\n/**\n * Shared interface for WebSocket clients.\n *\n * Two implementations exist:\n * - `client.node.ts` — Node.js, backed by the `ws` npm module\n * - `client.browser.ts` — Browser, backed by native `globalThis.WebSocket`\n *\n * The active implementation is selected at build time via the `\"browser\"`\n * field in package.json.\n */\nexport interface IWsClient {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n send(message: MessageOut): void;\n subscribe(params: SubscribeParams): void;\n unsubscribe(params: UnsubscribeParams): void;\n isConnected(): boolean;\n readyState(): ReadyState;\n restartConnection(): Promise<void>;\n clearAuthedSubscriptions(): void;\n on(callback: (event: WsEvent) => void): () => void;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Resolution } from "../../shared";
|
|
2
|
-
import { type LightconeHttp } from "../../http";
|
|
3
|
-
import type { DepositTokenPriceHistoryResponse } from "./wire";
|
|
4
|
-
interface ClientContext {
|
|
5
|
-
http: LightconeHttp;
|
|
6
|
-
}
|
|
7
|
-
export declare class DepositPriceClient {
|
|
8
|
-
private readonly client;
|
|
9
|
-
constructor(client: ClientContext);
|
|
10
|
-
get(depositAsset: string, resolution: Resolution, from?: number, to?: number, cursor?: number, limit?: number): Promise<DepositTokenPriceHistoryResponse>;
|
|
11
|
-
}
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/deposit_price/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,QAAQ,CAAC;AAE/D,UAAU,aAAa;IACrB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,GAAG,CACP,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,IAAI,CAAC,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,gCAAgC,CAAC;CAa7C"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DepositPriceClient = void 0;
|
|
4
|
-
const http_1 = require("../../http");
|
|
5
|
-
class DepositPriceClient {
|
|
6
|
-
client;
|
|
7
|
-
constructor(client) {
|
|
8
|
-
this.client = client;
|
|
9
|
-
}
|
|
10
|
-
async get(depositAsset, resolution, from, to, cursor, limit) {
|
|
11
|
-
const params = new URLSearchParams({
|
|
12
|
-
deposit_asset: depositAsset,
|
|
13
|
-
resolution,
|
|
14
|
-
});
|
|
15
|
-
if (from !== undefined)
|
|
16
|
-
params.set("from", String(from));
|
|
17
|
-
if (to !== undefined)
|
|
18
|
-
params.set("to", String(to));
|
|
19
|
-
if (cursor !== undefined)
|
|
20
|
-
params.set("cursor", String(cursor));
|
|
21
|
-
if (limit !== undefined)
|
|
22
|
-
params.set("limit", String(limit));
|
|
23
|
-
const url = `${this.client.http.baseUrl()}/api/price-history?${params.toString()}`;
|
|
24
|
-
return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
exports.DepositPriceClient = DepositPriceClient;
|
|
28
|
-
//# sourceMappingURL=client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/deposit_price/client.ts"],"names":[],"mappings":";;;AACA,qCAA6D;AAO7D,MAAa,kBAAkB;IACA;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,KAAK,CAAC,GAAG,CACP,YAAoB,EACpB,UAAsB,EACtB,IAAa,EACb,EAAW,EACX,MAAe,EACf,KAAc;QAEd,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,aAAa,EAAE,YAAY;YAC3B,UAAU;SACX,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,EAAE,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAmC,GAAG,EAAE,kBAAW,CAAC,UAAU,CAAC,CAAC;IAC7F,CAAC;CACF;AAvBD,gDAuBC","sourcesContent":["import type { Resolution } from \"../../shared\";\nimport { RetryPolicy, type LightconeHttp } from \"../../http\";\nimport type { DepositTokenPriceHistoryResponse } from \"./wire\";\n\ninterface ClientContext {\n http: LightconeHttp;\n}\n\nexport class DepositPriceClient {\n constructor(private readonly client: ClientContext) {}\n\n async get(\n depositAsset: string,\n resolution: Resolution,\n from?: number,\n to?: number,\n cursor?: number,\n limit?: number\n ): Promise<DepositTokenPriceHistoryResponse> {\n const params = new URLSearchParams({\n deposit_asset: depositAsset,\n resolution,\n });\n if (from !== undefined) params.set(\"from\", String(from));\n if (to !== undefined) params.set(\"to\", String(to));\n if (cursor !== undefined) params.set(\"cursor\", String(cursor));\n if (limit !== undefined) params.set(\"limit\", String(limit));\n\n const url = `${this.client.http.baseUrl()}/api/price-history?${params.toString()}`;\n return this.client.http.get<DepositTokenPriceHistoryResponse>(url, RetryPolicy.Idempotent);\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/deposit_price/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AAEvB,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./client"), exports);
|
|
18
|
-
__exportStar(require("./state"), exports);
|
|
19
|
-
__exportStar(require("./wire"), exports);
|
|
20
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/deposit_price/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,2CAAyB;AACzB,0CAAwB;AACxB,yCAAuB","sourcesContent":["import type { Resolution } from \"../../shared\";\n\nexport * from \"./client\";\nexport * from \"./state\";\nexport * from \"./wire\";\n\nexport interface DepositPriceKey {\n depositAsset: string;\n resolution: Resolution;\n}\n"]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { Resolution } from "../../shared";
|
|
2
|
-
import type { DepositTokenCandle } from "./wire";
|
|
3
|
-
export declare class DepositPriceState {
|
|
4
|
-
private readonly candles;
|
|
5
|
-
private readonly latestPrice;
|
|
6
|
-
constructor();
|
|
7
|
-
applySnapshot(depositAsset: string, resolution: Resolution, prices: DepositTokenCandle[]): void;
|
|
8
|
-
applyCandleUpdate(depositAsset: string, resolution: Resolution, candle: DepositTokenCandle): void;
|
|
9
|
-
applyPriceTick(depositAsset: string, price: string, eventTime: number): void;
|
|
10
|
-
getCandles(depositAsset: string, resolution: Resolution): readonly DepositTokenCandle[] | undefined;
|
|
11
|
-
getLatestPrice(depositAsset: string): {
|
|
12
|
-
price: string;
|
|
13
|
-
eventTime: number;
|
|
14
|
-
} | undefined;
|
|
15
|
-
clear(): void;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/deposit_price/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEjD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoD;;IAOhF,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAI/F,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAgBjG,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI5E,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,kBAAkB,EAAE,GAAG,SAAS;IAInG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAItF,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DepositPriceState = void 0;
|
|
4
|
-
class DepositPriceState {
|
|
5
|
-
candles;
|
|
6
|
-
latestPrice;
|
|
7
|
-
constructor() {
|
|
8
|
-
this.candles = new Map();
|
|
9
|
-
this.latestPrice = new Map();
|
|
10
|
-
}
|
|
11
|
-
applySnapshot(depositAsset, resolution, prices) {
|
|
12
|
-
this.candles.set(keyFor(depositAsset, resolution), prices);
|
|
13
|
-
}
|
|
14
|
-
applyCandleUpdate(depositAsset, resolution, candle) {
|
|
15
|
-
const key = keyFor(depositAsset, resolution);
|
|
16
|
-
const existing = this.candles.get(key) ?? [];
|
|
17
|
-
const last = existing.at(-1);
|
|
18
|
-
if (last && last.t === candle.t) {
|
|
19
|
-
last.c = candle.c;
|
|
20
|
-
last.tc = candle.tc;
|
|
21
|
-
this.candles.set(key, existing);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
existing.push(candle);
|
|
25
|
-
this.candles.set(key, existing);
|
|
26
|
-
}
|
|
27
|
-
applyPriceTick(depositAsset, price, eventTime) {
|
|
28
|
-
this.latestPrice.set(depositAsset, { price, eventTime });
|
|
29
|
-
}
|
|
30
|
-
getCandles(depositAsset, resolution) {
|
|
31
|
-
return this.candles.get(keyFor(depositAsset, resolution));
|
|
32
|
-
}
|
|
33
|
-
getLatestPrice(depositAsset) {
|
|
34
|
-
return this.latestPrice.get(depositAsset);
|
|
35
|
-
}
|
|
36
|
-
clear() {
|
|
37
|
-
this.candles.clear();
|
|
38
|
-
this.latestPrice.clear();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
exports.DepositPriceState = DepositPriceState;
|
|
42
|
-
function keyFor(depositAsset, resolution) {
|
|
43
|
-
return `${depositAsset}:${resolution}`;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/domain/deposit_price/state.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IACX,OAAO,CAAoC;IAC3C,WAAW,CAAoD;IAEhF;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,YAAoB,EAAE,UAAsB,EAAE,MAA4B;QACtF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,iBAAiB,CAAC,YAAoB,EAAE,UAAsB,EAAE,MAA0B;QACxF,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAE7C,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,cAAc,CAAC,YAAoB,EAAE,KAAa,EAAE,SAAiB;QACnE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,UAAU,CAAC,YAAoB,EAAE,UAAsB;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,cAAc,CAAC,YAAoB;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF;AA7CD,8CA6CC;AAED,SAAS,MAAM,CAAC,YAAoB,EAAE,UAAsB;IAC1D,OAAO,GAAG,YAAY,IAAI,UAAU,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import type { Resolution } from \"../../shared\";\nimport type { DepositTokenCandle } from \"./wire\";\n\nexport class DepositPriceState {\n private readonly candles: Map<string, DepositTokenCandle[]>;\n private readonly latestPrice: Map<string, { price: string; eventTime: number }>;\n\n constructor() {\n this.candles = new Map();\n this.latestPrice = new Map();\n }\n\n applySnapshot(depositAsset: string, resolution: Resolution, prices: DepositTokenCandle[]): void {\n this.candles.set(keyFor(depositAsset, resolution), prices);\n }\n\n applyCandleUpdate(depositAsset: string, resolution: Resolution, candle: DepositTokenCandle): void {\n const key = keyFor(depositAsset, resolution);\n const existing = this.candles.get(key) ?? [];\n\n const last = existing.at(-1);\n if (last && last.t === candle.t) {\n last.c = candle.c;\n last.tc = candle.tc;\n this.candles.set(key, existing);\n return;\n }\n\n existing.push(candle);\n this.candles.set(key, existing);\n }\n\n applyPriceTick(depositAsset: string, price: string, eventTime: number): void {\n this.latestPrice.set(depositAsset, { price, eventTime });\n }\n\n getCandles(depositAsset: string, resolution: Resolution): readonly DepositTokenCandle[] | undefined {\n return this.candles.get(keyFor(depositAsset, resolution));\n }\n\n getLatestPrice(depositAsset: string): { price: string; eventTime: number } | undefined {\n return this.latestPrice.get(depositAsset);\n }\n\n clear(): void {\n this.candles.clear();\n this.latestPrice.clear();\n }\n}\n\nfunction keyFor(depositAsset: string, resolution: Resolution): string {\n return `${depositAsset}:${resolution}`;\n}\n"]}
|