@orderly.network/net 1.0.66 → 1.0.68

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @orderly.network/net@1.0.65 build /Users/leo/orderly/orderly-web/packages/net
2
+ > @orderly.network/net@1.0.67 build /Users/leo/orderly/orderly-web/packages/net
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@ CLI Target: es6
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
12
  ESM Build start
13
- CJS dist/index.js 19.33 KB
14
- CJS dist/index.js.map 32.68 KB
15
- CJS ⚡️ Build success in 15ms
16
- ESM dist/index.mjs 18.29 KB
17
- ESM dist/index.mjs.map 32.44 KB
18
- ESM ⚡️ Build success in 16ms
13
+ CJS dist/index.js 18.26 KB
14
+ CJS dist/index.js.map 30.66 KB
15
+ CJS ⚡️ Build success in 17ms
16
+ ESM dist/index.mjs 17.22 KB
17
+ ESM dist/index.mjs.map 30.42 KB
18
+ ESM ⚡️ Build success in 17ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 873ms
20
+ DTS ⚡️ Build success in 959ms
21
21
  DTS dist/index.d.ts 2.89 KB
22
22
  DTS dist/index.d.mts 2.89 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @orderly.network/net
2
2
 
3
+ ## 1.0.68
4
+
5
+ ### Patch Changes
6
+
7
+ - update
8
+
9
+ ## 1.0.67
10
+
11
+ ### Patch Changes
12
+
13
+ - update
14
+
3
15
  ## 1.0.66
4
16
 
5
17
  ### Patch Changes
@@ -3,7 +3,7 @@ import { get } from "../src";
3
3
  test("get function", async () => {
4
4
  const res = await get("https://testnet-api.orderly.org/v1/public/info");
5
5
  const data = await res.json();
6
- console.log(data)
6
+
7
7
  // expect(res).toEqual({
8
8
  // completed: false,
9
9
  // id: 1,
package/dist/index.js CHANGED
@@ -218,13 +218,11 @@ var WS = class {
218
218
  }
219
219
  }
220
220
  onVisibilityChange() {
221
- console.log("\u{1F440}\u{1F440} document visibility \u{1F440}\u{1F440}", document.visibilityState);
222
221
  if (document.visibilityState === "visible") {
223
222
  this.checkSocketStatus();
224
223
  }
225
224
  }
226
225
  onNetworkStatusChange() {
227
- console.log("\u{1F440}\u{1F440} network status \u{1F440}\u{1F440}", navigator.onLine);
228
226
  if (navigator.onLine) {
229
227
  this.checkSocketStatus();
230
228
  }
@@ -278,7 +276,6 @@ var WS = class {
278
276
  (_a = this.privateSocket) == null ? void 0 : _a.close();
279
277
  }
280
278
  createPublicSC(options) {
281
- console.log("open public webSocket ---->>>>");
282
279
  if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)
283
280
  return;
284
281
  this.publicSocket = new WebSocket(
@@ -290,7 +287,6 @@ var WS = class {
290
287
  this.publicSocket.onerror = this.onPublicError.bind(this);
291
288
  }
292
289
  createPrivateSC(options) {
293
- console.log("open private webSocket ---->>>>");
294
290
  if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)
295
291
  return;
296
292
  this.options = options;
@@ -303,7 +299,6 @@ var WS = class {
303
299
  this.privateSocket.onerror = this.onPrivateError.bind(this);
304
300
  }
305
301
  onOpen(event) {
306
- console.log("Public WebSocket connection opened");
307
302
  if (this._pendingPublicSubscribe.length > 0) {
308
303
  this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {
309
304
  this.subscribe(params, cb, isOnce);
@@ -314,7 +309,6 @@ var WS = class {
314
309
  this._publicRetryCount = 0;
315
310
  }
316
311
  onPrivateOpen(event) {
317
- console.log("Private WebSocket connection opened");
318
312
  this.authenticate(this.options.accountId);
319
313
  this.privateIsReconnecting = false;
320
314
  this._privateRetryCount = 0;
@@ -343,7 +337,6 @@ var WS = class {
343
337
  }
344
338
  }
345
339
  } catch (e) {
346
- console.log("WebSocket message received:", e, event.data);
347
340
  }
348
341
  }
349
342
  onPublicMessage(event) {
@@ -363,7 +356,6 @@ var WS = class {
363
356
  }
364
357
  }
365
358
  onPublicClose(event) {
366
- console.log("public socket is closed");
367
359
  this._eventHandlers.forEach((value, key) => {
368
360
  value.callback.forEach((cb) => {
369
361
  this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);
@@ -373,7 +365,6 @@ var WS = class {
373
365
  setTimeout(() => this.checkSocketStatus(), 0);
374
366
  }
375
367
  onPrivateClose(event) {
376
- console.log("private socket is closed");
377
368
  if (this.privateIsReconnecting)
378
369
  return;
379
370
  this._eventPrivateHandlers.forEach((value, key) => {
@@ -394,7 +385,6 @@ var WS = class {
394
385
  if (this._publicRetryCount > CONNECT_LIMIT)
395
386
  return;
396
387
  setTimeout(() => {
397
- console.log("retry connect: %s", this._publicRetryCount);
398
388
  this.reconnectPublic();
399
389
  this._publicRetryCount++;
400
390
  }, this._publicRetryCount * 1e3);
@@ -411,7 +401,6 @@ var WS = class {
411
401
  if (this._privateRetryCount > CONNECT_LIMIT)
412
402
  return;
413
403
  setTimeout(() => {
414
- console.log("retry connect: %s", this._privateRetryCount);
415
404
  this.reconnectPrivate();
416
405
  this._privateRetryCount++;
417
406
  }, this._privateRetryCount * 1e3);
@@ -562,7 +551,6 @@ var WS = class {
562
551
  unsubscribe(parmas, webSocket, handlerMap) {
563
552
  const topic = parmas.topic || parmas.event;
564
553
  const handler = handlerMap.get(topic);
565
- console.log("\u{1F91C} unsubscribe", parmas, topic, handler);
566
554
  if (!!handler && Array.isArray(handler == null ? void 0 : handler.callback)) {
567
555
  if (handler.callback.length === 1) {
568
556
  const unsubscribeMessage = handler.callback[0].onUnsubscribe(topic);
@@ -590,7 +578,6 @@ var WS = class {
590
578
  }
591
579
  if (typeof onUnsubscribe !== "function") {
592
580
  if (typeof params === "string") {
593
- console.log("\u{1F449}", params);
594
581
  onUnsubscribe = () => ({ event: "unsubscribe", topic: params });
595
582
  } else {
596
583
  onUnsubscribe = () => ({ event: "unsubscribe", topic: params.topic });
@@ -602,11 +589,7 @@ var WS = class {
602
589
  if (this.publicIsReconnecting)
603
590
  return;
604
591
  this.publicIsReconnecting = true;
605
- console.log(
606
- `Reconnecting public in ${this.reconnectInterval / 1e3} seconds...`
607
- );
608
592
  window.setTimeout(() => {
609
- console.log("Public Reconnecting...");
610
593
  this.createPublicSC(this.options);
611
594
  }, this.reconnectInterval);
612
595
  }
@@ -616,11 +599,7 @@ var WS = class {
616
599
  if (this.privateIsReconnecting)
617
600
  return;
618
601
  this.privateIsReconnecting = true;
619
- console.log(
620
- `Reconnecting private in ${this.reconnectInterval / 1e3} seconds...`
621
- );
622
602
  window.setTimeout(() => {
623
- console.log("Private Reconnecting...");
624
603
  this.createPrivateSC(this.options);
625
604
  }, this.reconnectInterval);
626
605
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del, put, mutate } from \"./fetch\";\n\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\n\nexport { WS } from \"./ws/ws\";\n","async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ event: \"pong\", ts: Date.now() }));\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n console.log(\"👀👀 document visibility 👀👀\", document.visibilityState);\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n console.log(\"👀👀 network status 👀👀\", navigator.onLine);\n\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n // console.log(\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this.publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this.publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n console.log(\"open public webSocket ---->>>>\");\n if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)\n return;\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this.publicSocket.onclose = this.onPublicClose.bind(this);\n this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n console.log(\"open private webSocket ---->>>>\");\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"Public WebSocket connection opened\");\n\n // console.log(this._pendingPublicSubscribe);\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n console.log(\"Private WebSocket connection opened\");\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n // console.log(\"event handle::\", eventhandler);\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n }\n\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", e, event.data);\n }\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this.publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n console.log(\"public socket is closed\");\n\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n console.log(\"private socket is closed\");\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n console.log(\"retry connect: %s\", this._publicRetryCount);\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n console.log(\"retry connect: %s\", this._privateRetryCount);\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n // console.log(\"WebSocket message sent:\", message);\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n // console.log(\"👉\", params, callback, this.publicSocket.readyState);\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n // console.log(\"params::\", params);\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n console.log(\"🤜 unsubscribe\", parmas, topic, handler);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n // console.log(\"unsubscribeMessage\", unsubscribeMessage);\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n handlerMap.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n console.log(\"👉\", params);\n\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(\n `Reconnecting public in ${this.reconnectInterval / 1000} seconds...`\n );\n window.setTimeout(() => {\n console.log(\"Public Reconnecting...\");\n\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n console.log(\n `Reconnecting private in ${this.reconnectInterval / 1000} seconds...`\n );\n window.setTimeout(() => {\n console.log(\"Private Reconnecting...\");\n\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del, put, mutate } from \"./fetch\";\n\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\n\nexport { WS } from \"./ws/ws\";\n","async function request(url: string, options: RequestInit) {\n //\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ event: \"pong\", ts: Date.now() }));\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n //\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this.publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this.publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)\n return;\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this.publicSocket.onclose = this.onPublicClose.bind(this);\n this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n //\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n //\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n }\n\n //\n } catch (e) {}\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this.publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n //\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n //\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n //\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n //\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n handlerMap.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -189,13 +189,11 @@ var WS = class {
189
189
  }
190
190
  }
191
191
  onVisibilityChange() {
192
- console.log("\u{1F440}\u{1F440} document visibility \u{1F440}\u{1F440}", document.visibilityState);
193
192
  if (document.visibilityState === "visible") {
194
193
  this.checkSocketStatus();
195
194
  }
196
195
  }
197
196
  onNetworkStatusChange() {
198
- console.log("\u{1F440}\u{1F440} network status \u{1F440}\u{1F440}", navigator.onLine);
199
197
  if (navigator.onLine) {
200
198
  this.checkSocketStatus();
201
199
  }
@@ -249,7 +247,6 @@ var WS = class {
249
247
  (_a = this.privateSocket) == null ? void 0 : _a.close();
250
248
  }
251
249
  createPublicSC(options) {
252
- console.log("open public webSocket ---->>>>");
253
250
  if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)
254
251
  return;
255
252
  this.publicSocket = new WebSocket(
@@ -261,7 +258,6 @@ var WS = class {
261
258
  this.publicSocket.onerror = this.onPublicError.bind(this);
262
259
  }
263
260
  createPrivateSC(options) {
264
- console.log("open private webSocket ---->>>>");
265
261
  if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)
266
262
  return;
267
263
  this.options = options;
@@ -274,7 +270,6 @@ var WS = class {
274
270
  this.privateSocket.onerror = this.onPrivateError.bind(this);
275
271
  }
276
272
  onOpen(event) {
277
- console.log("Public WebSocket connection opened");
278
273
  if (this._pendingPublicSubscribe.length > 0) {
279
274
  this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {
280
275
  this.subscribe(params, cb, isOnce);
@@ -285,7 +280,6 @@ var WS = class {
285
280
  this._publicRetryCount = 0;
286
281
  }
287
282
  onPrivateOpen(event) {
288
- console.log("Private WebSocket connection opened");
289
283
  this.authenticate(this.options.accountId);
290
284
  this.privateIsReconnecting = false;
291
285
  this._privateRetryCount = 0;
@@ -314,7 +308,6 @@ var WS = class {
314
308
  }
315
309
  }
316
310
  } catch (e) {
317
- console.log("WebSocket message received:", e, event.data);
318
311
  }
319
312
  }
320
313
  onPublicMessage(event) {
@@ -334,7 +327,6 @@ var WS = class {
334
327
  }
335
328
  }
336
329
  onPublicClose(event) {
337
- console.log("public socket is closed");
338
330
  this._eventHandlers.forEach((value, key) => {
339
331
  value.callback.forEach((cb) => {
340
332
  this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);
@@ -344,7 +336,6 @@ var WS = class {
344
336
  setTimeout(() => this.checkSocketStatus(), 0);
345
337
  }
346
338
  onPrivateClose(event) {
347
- console.log("private socket is closed");
348
339
  if (this.privateIsReconnecting)
349
340
  return;
350
341
  this._eventPrivateHandlers.forEach((value, key) => {
@@ -365,7 +356,6 @@ var WS = class {
365
356
  if (this._publicRetryCount > CONNECT_LIMIT)
366
357
  return;
367
358
  setTimeout(() => {
368
- console.log("retry connect: %s", this._publicRetryCount);
369
359
  this.reconnectPublic();
370
360
  this._publicRetryCount++;
371
361
  }, this._publicRetryCount * 1e3);
@@ -382,7 +372,6 @@ var WS = class {
382
372
  if (this._privateRetryCount > CONNECT_LIMIT)
383
373
  return;
384
374
  setTimeout(() => {
385
- console.log("retry connect: %s", this._privateRetryCount);
386
375
  this.reconnectPrivate();
387
376
  this._privateRetryCount++;
388
377
  }, this._privateRetryCount * 1e3);
@@ -533,7 +522,6 @@ var WS = class {
533
522
  unsubscribe(parmas, webSocket, handlerMap) {
534
523
  const topic = parmas.topic || parmas.event;
535
524
  const handler = handlerMap.get(topic);
536
- console.log("\u{1F91C} unsubscribe", parmas, topic, handler);
537
525
  if (!!handler && Array.isArray(handler == null ? void 0 : handler.callback)) {
538
526
  if (handler.callback.length === 1) {
539
527
  const unsubscribeMessage = handler.callback[0].onUnsubscribe(topic);
@@ -561,7 +549,6 @@ var WS = class {
561
549
  }
562
550
  if (typeof onUnsubscribe !== "function") {
563
551
  if (typeof params === "string") {
564
- console.log("\u{1F449}", params);
565
552
  onUnsubscribe = () => ({ event: "unsubscribe", topic: params });
566
553
  } else {
567
554
  onUnsubscribe = () => ({ event: "unsubscribe", topic: params.topic });
@@ -573,11 +560,7 @@ var WS = class {
573
560
  if (this.publicIsReconnecting)
574
561
  return;
575
562
  this.publicIsReconnecting = true;
576
- console.log(
577
- `Reconnecting public in ${this.reconnectInterval / 1e3} seconds...`
578
- );
579
563
  window.setTimeout(() => {
580
- console.log("Public Reconnecting...");
581
564
  this.createPublicSC(this.options);
582
565
  }, this.reconnectInterval);
583
566
  }
@@ -587,11 +570,7 @@ var WS = class {
587
570
  if (this.privateIsReconnecting)
588
571
  return;
589
572
  this.privateIsReconnecting = true;
590
- console.log(
591
- `Reconnecting private in ${this.reconnectInterval / 1e3} seconds...`
592
- );
593
573
  window.setTimeout(() => {
594
- console.log("Private Reconnecting...");
595
574
  this.createPrivateSC(this.options);
596
575
  }, this.reconnectInterval);
597
576
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ event: \"pong\", ts: Date.now() }));\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n console.log(\"👀👀 document visibility 👀👀\", document.visibilityState);\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n console.log(\"👀👀 network status 👀👀\", navigator.onLine);\n\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n // console.log(\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this.publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this.publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n console.log(\"open public webSocket ---->>>>\");\n if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)\n return;\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this.publicSocket.onclose = this.onPublicClose.bind(this);\n this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n console.log(\"open private webSocket ---->>>>\");\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"Public WebSocket connection opened\");\n\n // console.log(this._pendingPublicSubscribe);\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n console.log(\"Private WebSocket connection opened\");\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n // console.log(\"event handle::\", eventhandler);\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n }\n\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", e, event.data);\n }\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this.publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n console.log(\"public socket is closed\");\n\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n console.log(\"private socket is closed\");\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n console.log(\"retry connect: %s\", this._publicRetryCount);\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n console.log(\"retry connect: %s\", this._privateRetryCount);\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n // console.log(\"WebSocket message sent:\", message);\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n // console.log(\"👉\", params, callback, this.publicSocket.readyState);\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n // console.log(\"params::\", params);\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n console.log(\"🤜 unsubscribe\", parmas, topic, handler);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n // console.log(\"unsubscribeMessage\", unsubscribeMessage);\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n handlerMap.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n console.log(\"👉\", params);\n\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(\n `Reconnecting public in ${this.reconnectInterval / 1000} seconds...`\n );\n window.setTimeout(() => {\n console.log(\"Public Reconnecting...\");\n\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n console.log(\n `Reconnecting private in ${this.reconnectInterval / 1000} seconds...`\n );\n window.setTimeout(() => {\n console.log(\"Private Reconnecting...\");\n\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n //\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ event: \"pong\", ts: Date.now() }));\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n //\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this.publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this.publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)\n return;\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this.publicSocket.onclose = this.onPublicClose.bind(this);\n this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n //\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n //\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n }\n\n //\n } catch (e) {}\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this.publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n //\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n //\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n //\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n //\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n handlerMap.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAe,QAAQ,KAAa,SAAsB;AAAA;AAExD,QAAI,CAAC,IAAI,WAAW,MAAM,GAAG;AAC3B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,UAAM,cAAc,IAAI,IAAI,GAAG;AAC/B,UAAM,WAAW,MAAM,MAAM,aAAa,iCACrC,UADqC;AAAA;AAAA;AAAA,MAIxC,SAAS,eAAe,QAAQ,SAAS,QAAQ,MAAM;AAAA,IACzD,EAAC;AAED,QAAI,SAAS,IAAI;AACf,YAAM,MAAM,MAAM,SAAS,KAAK;AAChC,aAAO;AAAA,IAMT;AAEA,UAAM,IAAI,MAAM,SAAS,UAAU;AAAA,EACrC;AAAA;AAEA,SAAS,eACP,UAAuB,CAAC,GACxB,QACa;AAEb,QAAM,WAAW,IAAI,QAAQ,OAAO;AAGpC,MAAI,CAAC,SAAS,IAAI,cAAc,GAAG;AACjC,QAAI,WAAW,UAAU;AACvB,eAAS,OAAO,gBAAgB,gCAAgC;AAAA,IAClE,OAAO;AACL,eAAS,OAAO,gBAAgB,mCAAmC;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAe,IACb,KACA,SACA,WACY;AAAA;AACZ,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,OACL,QACJ;AAED,QAAI,IAAI,SAAS;AACf,UAAI,OAAO,cAAc,YAAY;AACnC,eAAO,UAAU,IAAI,IAAI;AAAA,MAC3B;AAEA,UAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,CAAC,GAAG;AACnC,eAAO,IAAI,KAAK,MAAM;AAAA,MACxB;AACA,aAAO,IAAI;AAAA,IACb;AACA,UAAM,IAAI,MAAM,IAAI,OAAO;AAAA,EAC7B;AAAA;AACA,SAAe,KACb,KACA,MACA,SACc;AAAA;AACd,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,OACtB,QACJ;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,IACb,KACA,MACA,SACc;AAAA;AACd,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,OACtB,QACJ;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,IACb,KACA,SACc;AAAA;AACd,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,OACL,QACJ;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,OAAO,KAAa,MAAmB;AAAA;AACpD,UAAM,MAAM,MAAM,QAAQ,KAAK,IAAI;AAEnC,WAAO;AAAA,EACT;AAAA;;;AC/GO,IAAM,0BAAkC;;;ACE/C,IAAqB,cAArB,MAA2D;AAAA,EACzD,OAAO,SAAc,WAAsB;AACzC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACJA,IAAqB,cAArB,cAAyC,YAAY;AAAA,EACnD,OAAO,GAAQ,WAAsB;AACnC,cAAU,KAAK,KAAK,UAAU,EAAE,OAAO,QAAQ,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,EAClE;AACF;;;ACQO,IAAM,kBAAkB,oBAAI,IAAiC;AAAA,EAClE,CAAC,QAAQ,IAAI,YAAY,CAAC;AAC5B,CAAC;;;ACsBD,IAAM,0BAA0B,CAAC,YAAiB,QAAQ;AAC1D,IAAM,YAAY;AAElB,IAAM,WAAW,MAAO,KAAK;AAC7B,IAAM,gBAAgB;AAEf,IAAM,KAAN,MAAS;AAAA,EAwBd,YAAoB,SAAoB;AAApB;AApBpB,SAAQ,uBAAgC;AACxC,SAAQ,wBAAiC;AAEzC,SAAQ,oBAA4B;AAEpC,SAAQ,gBAAyB;AAEjC,SAAQ,2BAAoC,CAAC;AAC7C,SAAQ,0BAAmC,CAAC;AAG5C;AAAA,SAAQ,iBAAsC,oBAAI,IAAI;AACtD,SAAQ,wBAA6C,oBAAI,IAAI;AAK7D,SAAQ,oBAA4B;AACpC,SAAQ,qBAA6B;AA6SrC,gBAAO,CAAC,YAAiB;AACvB,UAAI,OAAO,YAAY,UAAU;AAC/B,kBAAU,KAAK,UAAU,OAAO;AAAA,MAClC;AACA,UAAI,OAAO,YAAY;AAAa;AACpC,UAAI,KAAK,aAAa,eAAe,UAAU,MAAM;AACnD,aAAK,aAAa,KAAK,OAAO;AAAA,MAEhC,OAAO;AACL,gBAAQ,KAAK,wDAAwD;AAAA,MACvE;AAAA,IACF;AArTE,SAAK,eAAe,OAAO;AAE3B,QAAI,CAAC,CAAC,QAAQ,WAAW;AACvB,WAAK,gBAAgB,OAAO;AAAA,IAC9B;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,aAAa;AACnB,QAAI,OAAO,aAAa,aAAa;AACnC,eAAS;AAAA,QACP;AAAA,QACA,KAAK,mBAAmB,KAAK,IAAI;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,iBAAiB,UAAU,KAAK,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAEzE;AAAA,EACF;AAAA,EAEQ,qBAAqB;AAC3B,QAAI,SAAS,oBAAoB,WAAW;AAC1C,WAAK,kBAAkB;AAAA,IACzB;AAAA,EAKF;AAAA,EAEQ,wBAAwB;AAC9B,QAAI,UAAU,QAAQ;AACpB,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB;AAlH9B;AAmHI,UAAM,MAAM,KAAK,IAAI;AAarB,QAAI,SAAS,oBAAoB;AAAW;AAE5C,QAAI,CAAC,UAAU;AAAQ;AAIvB,QAAI,CAAC,KAAK,sBAAsB;AAC9B,UAAI,KAAK,aAAa,eAAe,UAAU,QAAQ;AACrD,aAAK,gBAAgB;AAAA,MACvB,OAAO;AACL,YAAI,MAAM,KAAK,uBAAwB,UAAU;AAE/C,eAAK,aAAa,MAAM;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,uBAAuB;AAE/B,YAAI,UAAK,kBAAL,mBAAoB,gBAAe,UAAU,QAAQ;AACvD,aAAK,iBAAiB;AAAA,MACxB,OAAO;AACL,YACE,KAAK,yBACL,MAAM,KAAK,wBAAyB,UACpC;AAEA,qBAAK,kBAAL,mBAAoB;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,YAAY,WAAmB;AAjKxC;AAkKI,UAAI,UAAK,kBAAL,mBAAoB,gBAAe,UAAU,MAAM;AACrD;AAAA,IACF;AACA,SAAK,gBAAgB,iCAChB,KAAK,UADW;AAAA,MAEnB;AAAA,IACF,EAAC;AAAA,EACH;AAAA,EAEO,eAAe;AA3KxB;AA4KI,SAAK,gBAAgB;AACrB,SAAK,2BAA2B,CAAC;AAEjC,SAAK,sBAAsB,MAAM;AAEjC,eAAK,kBAAL,mBAAoB;AAAA,EACtB;AAAA,EAEQ,eAAe,SAAoB;AACzC,QAAI,KAAK,gBAAgB,KAAK,aAAa,eAAe,UAAU;AAClE;AACF,SAAK,eAAe,IAAI;AAAA,MACtB,GAAG,KAAK,QAAQ,SAAS,cAAc,SAAS;AAAA,IAClD;AACA,SAAK,aAAa,SAAS,KAAK,OAAO,KAAK,IAAI;AAChD,SAAK,aAAa,YAAY,KAAK,gBAAgB,KAAK,IAAI;AAC5D,SAAK,aAAa,UAAU,KAAK,cAAc,KAAK,IAAI;AACxD,SAAK,aAAa,UAAU,KAAK,cAAc,KAAK,IAAI;AAAA,EAC1D;AAAA,EAEQ,gBAAgB,SAAoB;AAC1C,QAAI,KAAK,iBAAiB,KAAK,cAAc,eAAe,UAAU;AACpE;AAEF,SAAK,UAAU;AAEf,SAAK,gBAAgB,IAAI;AAAA,MACvB,GAAG,KAAK,QAAQ,UAAU,yBAAyB,QAAQ,SAAS;AAAA,IACtE;AACA,SAAK,cAAc,SAAS,KAAK,cAAc,KAAK,IAAI;AACxD,SAAK,cAAc,YAAY,KAAK,iBAAiB,KAAK,IAAI;AAC9D,SAAK,cAAc,UAAU,KAAK,eAAe,KAAK,IAAI;AAC1D,SAAK,cAAc,UAAU,KAAK,eAAe,KAAK,IAAI;AAAA,EAC5D;AAAA,EAEQ,OAAO,OAAc;AAE3B,QAAI,KAAK,wBAAwB,SAAS,GAAG;AAC3C,WAAK,wBAAwB,QAAQ,CAAC,CAAC,QAAQ,IAAI,MAAM,MAAM;AAC7D,aAAK,UAAU,QAAQ,IAAI,MAAM;AAAA,MACnC,CAAC;AACD,WAAK,0BAA0B,CAAC;AAAA,IAClC;AAEA,SAAK,uBAAuB;AAC5B,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,cAAc,OAAc;AAElC,SAAK,aAAa,KAAK,QAAQ,SAAU;AACzC,SAAK,wBAAwB;AAC7B,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEQ,UACN,OACA,QACA,YACA;AACA,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,MAAM,IAAI;AACrC,YAAM,iBAAiB,gBAAgB,IAAI,QAAQ,KAAK;AAExD,UAAI,QAAQ,UAAU,UAAU,QAAQ,SAAS;AAC/C,aAAK,gBAAgB;AACrB,aAAK,0BAA0B;AAC/B;AAAA,MACF;AAEA,UAAI,gBAAgB;AAClB,uBAAe,OAAO,SAAS,MAAM;AAAA,MACvC,OAAO;AACL,cAAM,WAAW,KAAK,uBAAuB,OAAO;AAEpD,cAAM,eAAe,WAAW,IAAI,QAAQ;AAE5C,YAAI,6CAAc,UAAU;AAC1B,uBAAa,SAAS,QAAQ,CAAC,OAAO;AACpC,kBAAM,OAAO,GAAG,YACZ,GAAG,UAAU,OAAO,IACpB,wBAAwB,OAAO;AAEnC,gBAAI,MAAM;AACR,iBAAG,UAAU,IAAI;AAAA,YACnB;AAAA,UACF,CAAC;AAAA,QAMH;AAAA,MACF;AAAA,IAGF,SAAS,GAAG;AAAA,IAAC;AAAA,EAGf;AAAA,EAEQ,gBAAgB,OAAqB;AAC3C,SAAK,UAAU,OAAO,KAAK,cAAc,KAAK,cAAc;AAE5D,SAAK,uBAAuB,KAAK,IAAI;AAAA,EACvC;AAAA,EAEQ,iBAAiB,OAAqB;AAC5C,SAAK,UAAU,OAAO,KAAK,eAAgB,KAAK,qBAAqB;AAErE,SAAK,wBAAwB,KAAK,IAAI;AAAA,EACxC;AAAA,EAEQ,4BAA4B;AAClC,QAAI,KAAK,yBAAyB,SAAS,GAAG;AAC5C,WAAK,yBAAyB,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM;AACtD,aAAK,iBAAiB,QAAQ,EAAE;AAAA,MAClC,CAAC;AACD,WAAK,2BAA2B,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,cAAc,OAAmB;AAEvC,SAAK,eAAe,QAAQ,CAAC,OAAO,QAAQ;AAC1C,YAAM,SAAS,QAAQ,CAAC,OAAO;AAC7B,aAAK,wBAAwB,KAAK,CAAC,MAAM,QAAQ,IAAI,MAAM,MAAM,CAAC;AAAA,MACpE,CAAC;AAED,WAAK,eAAe,OAAO,GAAG;AAAA,IAChC,CAAC;AAED,eAAW,MAAM,KAAK,kBAAkB,GAAG,CAAC;AAAA,EAC9C;AAAA,EAEQ,eAAe,OAAmB;AACxC,QAAI,KAAK;AAAuB;AAChC,SAAK,sBAAsB,QAAQ,CAAC,OAAO,QAAQ;AACjD,YAAM,SAAS,QAAQ,CAAC,OAAO;AAC7B,aAAK,yBAAyB,KAAK,CAAC,MAAM,QAAQ,IAAI,MAAM,MAAM,CAAC;AAAA,MACrE,CAAC;AAED,WAAK,sBAAsB,OAAO,GAAG;AAAA,IACvC,CAAC;AACD,SAAK,gBAAgB;AAErB,eAAW,MAAM,KAAK,kBAAkB,GAAG,CAAC;AAAA,EAC9C;AAAA,EAEQ,cAAc,OAAc;AAClC,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,SAAK,uBAAuB;AAE5B,QAAI,KAAK,aAAa,eAAe,UAAU,MAAM;AACnD,WAAK,aAAa,MAAM;AAAA,IAC1B,OAAO;AAEL,UAAI,KAAK,oBAAoB;AAAe;AAC5C,iBAAW,MAAM;AAEf,aAAK,gBAAgB;AACrB,aAAK;AAAA,MACP,GAAG,KAAK,oBAAoB,GAAI;AAAA,IAClC;AAEA,SAAK,gBAAgB,OAAO,KAAK,cAAc;AAAA,EACjD;AAAA,EAEQ,eAAe,OAAc;AApVvC;AAqVI,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,SAAK,wBAAwB;AAE7B,UAAI,UAAK,kBAAL,mBAAoB,gBAAe,UAAU,MAAM;AACrD,WAAK,cAAc,MAAM;AAAA,IAC3B,OAAO;AAEL,UAAI,KAAK,qBAAqB;AAAe;AAC7C,iBAAW,MAAM;AAEf,aAAK,iBAAiB;AACtB,aAAK;AAAA,MACP,GAAG,KAAK,qBAAqB,GAAI;AAAA,IACnC;AAEA,SAAK,gBAAgB,OAAO,KAAK,qBAAqB;AAAA,EACxD;AAAA,EAEQ,gBAAgB,OAAY,eAAoC;AACtE,kBAAc,QAAQ,CAAC,UAAU;AAC/B,YAAM,SAAS,QAAQ,CAAC,OAAO;AAzWrC;AA0WQ,iBAAG,YAAH,4BAAa;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAeA,QAAQ;AA5XV;AA6XI,SAAK,aAAa,MAAM;AACxB,eAAK,kBAAL,mBAAoB;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU,WAAmB;AAAA,EAAC;AAAA,EAEpB,aAAa,WAAmB;AAAA;AAnYhD;AAoYI,UAAI,KAAK;AAAe;AACxB,UAAI,CAAC,KAAK,eAAe;AACvB,gBAAQ,MAAM,0BAA0B;AACxC;AAAA,MACF;AAEA,YAAM,UAAU,OAAM,gBAAK,SAAQ,sBAAb,4BAAiC;AAEvD,WAAK,cAAc;AAAA,QACjB,KAAK,UAAU;AAAA,UACb,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,aAAa,QAAQ;AAAA,YACrB,MAAM,QAAQ;AAAA,YACd,WAAW,QAAQ;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IAGF;AAAA;AAAA,EAEA,iBACE,QACA,UACA;AA9ZJ;AA+ZI,UAAM,CAAC,kBAAkB,aAAa,IAAI,KAAK;AAAA,MAC7C;AAAA,MACC,SAA8B;AAAA,IACjC;AAEA,UAAI,UAAK,kBAAL,mBAAoB,gBAAe,UAAU,MAAM;AACrD,WAAK,yBAAyB,KAAK,CAAC,QAAQ,QAAQ,CAAC;AACrD,aAAO,MAAM;AACX,aAAK,mBAAmB,gBAAgB;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,QAAQ,iBAAiB,SAAS,iBAAiB;AAEzD,UAAM,UAAU,KAAK,sBAAsB,IAAI,KAAK;AACpD,UAAM,YAAY,iCACb,WADa;AAAA,MAEhB;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ,WAAK,sBAAsB,IAAI,OAAO;AAAA,QACpC;AAAA,QACA,UAAU,CAAC,SAAS;AAAA,MACtB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,SAAS,KAAK,SAAS;AAAA,IACjC;AAEA,SAAK,cAAc,KAAK,KAAK,UAAU,gBAAgB,CAAC;AAExD,WAAO,MAAM;AACX,WAAK,mBAAmB,gBAAgB;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,UACE,QACA,UACA,MACyB;AAGzB,UAAM,CAAC,kBAAkB,aAAa,IAAI,KAAK;AAAA,MAC7C;AAAA,MACC,SAA8B;AAAA,IACjC;AAIA,QAAI,KAAK,aAAa,eAAe,UAAU,MAAM;AACnD,WAAK,wBAAwB,KAAK,CAAC,QAAQ,UAAU,IAAI,CAAC;AAE1D,UAAI,CAAC,MAAM;AACT,eAAO,MAAM;AACX,eAAK,kBAAkB,gBAAgB;AAAA,QACzC;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,sBAAsB,gBAAgB;AAGvD,UAAM,UAAU,KAAK,eAAe,IAAI,KAAK;AAC7C,UAAM,YAAY,iCACb,WADa;AAAA,MAEhB;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ,WAAK,eAAe,IAAI,OAAO;AAAA,QAC7B;AAAA,QACA,QAAQ;AAAA,QACR,UAAU,CAAC,SAAS;AAAA,MACtB,CAAC;AACD,WAAK,aAAa,KAAK,KAAK,UAAU,gBAAgB,CAAC;AAAA,IACzD,OAAO;AAEL,UAAI,MAAM;AACR,gBAAQ,WAAW,CAAC,SAAS;AAC7B,aAAK,aAAa,KAAK,KAAK,UAAU,gBAAgB,CAAC;AAAA,MACzD,OAAO;AACL,gBAAQ,SAAS,KAAK,SAAS;AAAA,MACjC;AAAA,IACF;AAIA,QAAI,CAAC,MAAM;AACT,aAAO,MAAM;AACX,aAAK,kBAAkB,gBAAgB;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,QAAqB;AACjD,QAAI;AAEJ,QAAI,OAAO,OAAO;AAChB,cAAQ,OAAO;AAAA,IACjB,OAAO;AACL,YAAM,YAAY,OAAO;AACzB,cAAQ,OAAO;AAEf,UAAI,OAAO,IAAI;AACb,iBAAS,IAAI,OAAO,EAAE;AAAA,MACxB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,SAAsB;AACnD,QAAI;AACJ,QAAI,QAAQ,OAAO;AACjB,cAAQ,QAAQ;AAAA,IAClB,OAAO;AACL,UAAI,QAAQ,OAAO;AACjB,gBAAQ,GAAG,QAAQ,KAAK;AAExB,YAAI,QAAQ,IAAI;AACd,mBAAS,IAAI,QAAQ,EAAE;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,cACE,QACA,UACA;AACA,SAAK,UAAU,QAAQ,UAAU,IAAI;AAAA,EACvC;AAAA,EAEQ,YACN,QACA,WACA,YACA;AACA,UAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,UAAM,UAAU,WAAW,IAAI,KAAK;AAEpC,QAAI,CAAC,CAAC,WAAW,MAAM,QAAQ,mCAAS,QAAQ,GAAG;AACjD,UAAI,QAAS,SAAS,WAAW,GAAG;AAClC,cAAM,qBAAqB,QAAS,SAAS,CAAC,EAAE,cAAc,KAAK;AAGnE,kBAAU,KAAK,KAAK,UAAU,kBAAkB,CAAC;AACjD,mBAAW,OAAO,KAAK;AAAA,MAEzB,OAAO;AACL,mBAAW,IAAI,OAAO,iCACjB,UADiB;AAAA,UAEpB,UAAU,QAAQ,SAAS,MAAM,GAAG,EAAE;AAAA,QACxC,EAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAuB;AAChD,SAAK,YAAY,QAAQ,KAAK,eAAgB,KAAK,qBAAqB;AAAA,EAC1E;AAAA,EAEQ,kBAAkB,QAAuB;AAC/C,SAAK,YAAY,QAAQ,KAAK,cAAc,KAAK,cAAc;AAAA,EACjE;AAAA,EAEQ,gBACN,QACA,eACyC;AACzC,QAAI;AAEJ,QAAI,OAAO,WAAW,UAAU;AAC9B,yBAAmB,EAAE,OAAO,aAAa,OAAO,OAAO;AAAA,IACzD,OAAO;AACL,yBAAmB;AAAA,IACrB;AAEA,QAAI,OAAO,kBAAkB,YAAY;AACvC,UAAI,OAAO,WAAW,UAAU;AAC9B,wBAAgB,OAAO,EAAE,OAAO,eAAe,OAAO,OAAO;AAAA,MAC/D,OAAO;AACL,wBAAgB,OAAO,EAAE,OAAO,eAAe,OAAO,OAAO,MAAM;AAAA,MACrE;AAAA,IACF;AAEA,WAAO,CAAC,kBAAkB,aAAa;AAAA,EACzC;AAAA,EAEQ,kBAAkB;AACxB,QAAI,KAAK;AAAsB;AAC/B,SAAK,uBAAuB;AAE5B,WAAO,WAAW,MAAM;AACtB,WAAK,eAAe,KAAK,OAAO;AAAA,IAClC,GAAG,KAAK,iBAAiB;AAAA,EAC3B;AAAA,EAEQ,mBAAmB;AACzB,QAAI,CAAC,KAAK,QAAQ;AAAW;AAC7B,QAAI,KAAK;AAAuB;AAChC,SAAK,wBAAwB;AAE7B,WAAO,WAAW,MAAM;AACtB,WAAK,gBAAgB,KAAK,OAAO;AAAA,IACnC,GAAG,KAAK,iBAAiB;AAAA,EAC3B;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/net",
3
- "version": "1.0.66",
3
+ "version": "1.0.68",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -17,7 +17,7 @@
17
17
  "rxjs": "^7.8.1",
18
18
  "tsup": "^7.1.0",
19
19
  "typescript": "^5.1.6",
20
- "tsconfig": "0.0.64"
20
+ "tsconfig": "0.0.66"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "rxjs": "^7.8.1"
@@ -1,5 +1,5 @@
1
1
  async function request(url: string, options: RequestInit) {
2
- // console.log("request", url, options);
2
+ //
3
3
  if (!url.startsWith("http")) {
4
4
  throw new Error("url must start with http(s)");
5
5
  }
@@ -28,7 +28,7 @@ function _createHeaders(
28
28
  headers: HeadersInit = {},
29
29
  method?: string
30
30
  ): HeadersInit {
31
- // console.log("headers", headers);
31
+ //
32
32
  const _headers = new Headers(headers);
33
33
  // _headers.append("Accept", "application/json");
34
34
 
package/src/ws/ws.ts CHANGED
@@ -91,7 +91,6 @@ export class WS {
91
91
  }
92
92
 
93
93
  private onVisibilityChange() {
94
- console.log("👀👀 document visibility 👀👀", document.visibilityState);
95
94
  if (document.visibilityState === "visible") {
96
95
  this.checkSocketStatus();
97
96
  }
@@ -102,8 +101,6 @@ export class WS {
102
101
  }
103
102
 
104
103
  private onNetworkStatusChange() {
105
- console.log("👀👀 network status 👀👀", navigator.onLine);
106
-
107
104
  if (navigator.onLine) {
108
105
  this.checkSocketStatus();
109
106
  }
@@ -118,7 +115,7 @@ export class WS {
118
115
  private checkSocketStatus() {
119
116
  const now = Date.now();
120
117
 
121
- // console.log(
118
+ //
122
119
  // "👀👀 checkNetworkStatus 👀👀",
123
120
  // this._publicHeartbeatTime,
124
121
  // this._privateHeartbeatTime,
@@ -182,7 +179,6 @@ export class WS {
182
179
  }
183
180
 
184
181
  private createPublicSC(options: WSOptions) {
185
- console.log("open public webSocket ---->>>>");
186
182
  if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)
187
183
  return;
188
184
  this.publicSocket = new WebSocket(
@@ -195,7 +191,6 @@ export class WS {
195
191
  }
196
192
 
197
193
  private createPrivateSC(options: WSOptions) {
198
- console.log("open private webSocket ---->>>>");
199
194
  if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)
200
195
  return;
201
196
 
@@ -211,9 +206,7 @@ export class WS {
211
206
  }
212
207
 
213
208
  private onOpen(event: Event) {
214
- console.log("Public WebSocket connection opened");
215
-
216
- // console.log(this._pendingPublicSubscribe);
209
+ //
217
210
  if (this._pendingPublicSubscribe.length > 0) {
218
211
  this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {
219
212
  this.subscribe(params, cb, isOnce);
@@ -226,7 +219,6 @@ export class WS {
226
219
  }
227
220
 
228
221
  private onPrivateOpen(event: Event) {
229
- console.log("Private WebSocket connection opened");
230
222
  //auth
231
223
  this.authenticate(this.options.accountId!);
232
224
  this.privateIsReconnecting = false;
@@ -254,7 +246,7 @@ export class WS {
254
246
  const topicKey = this.getTopicKeyFromMessage(message);
255
247
 
256
248
  const eventhandler = handlerMap.get(topicKey);
257
- // console.log("event handle::", eventhandler);
249
+ //
258
250
  if (eventhandler?.callback) {
259
251
  eventhandler.callback.forEach((cb) => {
260
252
  const data = cb.formatter
@@ -273,10 +265,8 @@ export class WS {
273
265
  }
274
266
  }
275
267
 
276
- // console.log("WebSocket message received:", message);
277
- } catch (e) {
278
- console.log("WebSocket message received:", e, event.data);
279
- }
268
+ //
269
+ } catch (e) {}
280
270
 
281
271
  // You can process the received message here
282
272
  }
@@ -303,8 +293,6 @@ export class WS {
303
293
  }
304
294
 
305
295
  private onPublicClose(event: CloseEvent) {
306
- console.log("public socket is closed");
307
-
308
296
  // move handler to pending
309
297
  this._eventHandlers.forEach((value, key) => {
310
298
  value.callback.forEach((cb) => {
@@ -318,7 +306,6 @@ export class WS {
318
306
  }
319
307
 
320
308
  private onPrivateClose(event: CloseEvent) {
321
- console.log("private socket is closed");
322
309
  if (this.privateIsReconnecting) return;
323
310
  this._eventPrivateHandlers.forEach((value, key) => {
324
311
  value.callback.forEach((cb) => {
@@ -342,7 +329,6 @@ export class WS {
342
329
  // retry connect
343
330
  if (this._publicRetryCount > CONNECT_LIMIT) return;
344
331
  setTimeout(() => {
345
- console.log("retry connect: %s", this._publicRetryCount);
346
332
  // this.createPublicSC(this.options);
347
333
  this.reconnectPublic();
348
334
  this._publicRetryCount++;
@@ -362,7 +348,6 @@ export class WS {
362
348
  // retry connect
363
349
  if (this._privateRetryCount > CONNECT_LIMIT) return;
364
350
  setTimeout(() => {
365
- console.log("retry connect: %s", this._privateRetryCount);
366
351
  // this.createPublicSC(this.options);
367
352
  this.reconnectPrivate();
368
353
  this._privateRetryCount++;
@@ -387,7 +372,7 @@ export class WS {
387
372
  if (typeof message === "undefined") return;
388
373
  if (this.publicSocket.readyState === WebSocket.OPEN) {
389
374
  this.publicSocket.send(message);
390
- // console.log("WebSocket message sent:", message);
375
+ //
391
376
  } else {
392
377
  console.warn("WebSocket connection is not open. Cannot send message.");
393
378
  }
@@ -469,14 +454,14 @@ export class WS {
469
454
  callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">,
470
455
  once?: boolean
471
456
  ): unsubscribe | undefined {
472
- // console.log("👉", params, callback, this.publicSocket.readyState);
457
+ //
473
458
 
474
459
  const [subscribeMessage, onUnsubscribe] = this.generateMessage(
475
460
  params,
476
461
  (callback as WSMessageHandler).onUnsubscribe
477
462
  );
478
463
 
479
- // console.log("params::", params);
464
+ //
480
465
 
481
466
  if (this.publicSocket.readyState !== WebSocket.OPEN) {
482
467
  this._pendingPublicSubscribe.push([params, callback, once]);
@@ -576,13 +561,12 @@ export class WS {
576
561
  ) {
577
562
  const topic = parmas.topic || parmas.event;
578
563
  const handler = handlerMap.get(topic);
579
- console.log("🤜 unsubscribe", parmas, topic, handler);
580
564
 
581
565
  if (!!handler && Array.isArray(handler?.callback)) {
582
566
  if (handler!.callback.length === 1) {
583
567
  const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);
584
568
 
585
- // console.log("unsubscribeMessage", unsubscribeMessage);
569
+ //
586
570
  webSocket.send(JSON.stringify(unsubscribeMessage));
587
571
  handlerMap.delete(topic);
588
572
  //post unsubscribe message
@@ -617,8 +601,6 @@ export class WS {
617
601
 
618
602
  if (typeof onUnsubscribe !== "function") {
619
603
  if (typeof params === "string") {
620
- console.log("👉", params);
621
-
622
604
  onUnsubscribe = () => ({ event: "unsubscribe", topic: params });
623
605
  } else {
624
606
  onUnsubscribe = () => ({ event: "unsubscribe", topic: params.topic });
@@ -631,12 +613,8 @@ export class WS {
631
613
  private reconnectPublic() {
632
614
  if (this.publicIsReconnecting) return;
633
615
  this.publicIsReconnecting = true;
634
- console.log(
635
- `Reconnecting public in ${this.reconnectInterval / 1000} seconds...`
636
- );
637
- window.setTimeout(() => {
638
- console.log("Public Reconnecting...");
639
616
 
617
+ window.setTimeout(() => {
640
618
  this.createPublicSC(this.options);
641
619
  }, this.reconnectInterval);
642
620
  }
@@ -645,12 +623,8 @@ export class WS {
645
623
  if (!this.options.accountId) return;
646
624
  if (this.privateIsReconnecting) return;
647
625
  this.privateIsReconnecting = true;
648
- console.log(
649
- `Reconnecting private in ${this.reconnectInterval / 1000} seconds...`
650
- );
651
- window.setTimeout(() => {
652
- console.log("Private Reconnecting...");
653
626
 
627
+ window.setTimeout(() => {
654
628
  this.createPrivateSC(this.options);
655
629
  }, this.reconnectInterval);
656
630
  }