@orderly.network/net 1.0.32 → 1.0.34

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.31 build /Users/leo/orderly/orderly-web/packages/net
2
+ > @orderly.network/net@1.0.33 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
- ESM dist/index.mjs 14.90 KB
14
- ESM dist/index.mjs.map 25.84 KB
15
- ESM ⚡️ Build success in 29ms
16
- CJS dist/index.js 15.94 KB
17
- CJS dist/index.js.map 26.09 KB
18
- CJS ⚡️ Build success in 29ms
13
+ CJS dist/index.js 19.85 KB
14
+ CJS dist/index.js.map 33.09 KB
15
+ CJS ⚡️ Build success in 10ms
16
+ ESM dist/index.mjs 18.81 KB
17
+ ESM dist/index.mjs.map 32.85 KB
18
+ ESM ⚡️ Build success in 10ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 1059ms
21
- DTS dist/index.d.ts 2.52 KB
22
- DTS dist/index.d.mts 2.52 KB
20
+ DTS ⚡️ Build success in 1158ms
21
+ DTS dist/index.d.ts 2.89 KB
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.34
4
+
5
+ ### Patch Changes
6
+
7
+ - update
8
+
9
+ ## 1.0.33
10
+
11
+ ### Patch Changes
12
+
13
+ - update
14
+
3
15
  ## 1.0.32
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -34,10 +34,21 @@ declare class WS {
34
34
  private _pendingPublicSubscribe;
35
35
  private _eventHandlers;
36
36
  private _eventPrivateHandlers;
37
+ private _publicHeartbeatTime?;
38
+ private _privateHeartbeatTime?;
39
+ private _publicRetryCount;
40
+ private _privateRetryCount;
37
41
  constructor(options: WSOptions);
38
42
  private bindEvents;
39
43
  private onVisibilityChange;
40
44
  private onNetworkStatusChange;
45
+ /**
46
+ * 判断当前连接状态,
47
+ * 1、如果已断开则重连
48
+ * 2、如果太久没有收到消息,则主动断开,并重连
49
+ * 3、从后台返回、网络状态变化时,都走以下流程
50
+ */
51
+ private checkSocketStatus;
41
52
  openPrivate(accountId: string): void;
42
53
  closePrivate(): void;
43
54
  private createPublicSC;
@@ -48,9 +59,11 @@ declare class WS {
48
59
  private onPublicMessage;
49
60
  private onPrivateMessage;
50
61
  private handlePendingPrivateTopic;
51
- private onClose;
52
- private onError;
62
+ private onPublicClose;
63
+ private onPrivateClose;
64
+ private onPublicError;
53
65
  private onPrivateError;
66
+ private errorBoardscast;
54
67
  send: (message: any) => void;
55
68
  close(): void;
56
69
  set accountId(accountId: string);
@@ -65,6 +78,7 @@ declare class WS {
65
78
  private unsubscribePublic;
66
79
  private generateMessage;
67
80
  private reconnectPublic;
81
+ private reconnectPrivate;
68
82
  }
69
83
 
70
84
  export { WS, __ORDERLY_API_URL_KEY__, del, get, mutate, post, put };
package/dist/index.d.ts CHANGED
@@ -34,10 +34,21 @@ declare class WS {
34
34
  private _pendingPublicSubscribe;
35
35
  private _eventHandlers;
36
36
  private _eventPrivateHandlers;
37
+ private _publicHeartbeatTime?;
38
+ private _privateHeartbeatTime?;
39
+ private _publicRetryCount;
40
+ private _privateRetryCount;
37
41
  constructor(options: WSOptions);
38
42
  private bindEvents;
39
43
  private onVisibilityChange;
40
44
  private onNetworkStatusChange;
45
+ /**
46
+ * 判断当前连接状态,
47
+ * 1、如果已断开则重连
48
+ * 2、如果太久没有收到消息,则主动断开,并重连
49
+ * 3、从后台返回、网络状态变化时,都走以下流程
50
+ */
51
+ private checkSocketStatus;
41
52
  openPrivate(accountId: string): void;
42
53
  closePrivate(): void;
43
54
  private createPublicSC;
@@ -48,9 +59,11 @@ declare class WS {
48
59
  private onPublicMessage;
49
60
  private onPrivateMessage;
50
61
  private handlePendingPrivateTopic;
51
- private onClose;
52
- private onError;
62
+ private onPublicClose;
63
+ private onPrivateClose;
64
+ private onPublicError;
53
65
  private onPrivateError;
66
+ private errorBoardscast;
54
67
  send: (message: any) => void;
55
68
  close(): void;
56
69
  set accountId(accountId: string);
@@ -65,6 +78,7 @@ declare class WS {
65
78
  private unsubscribePublic;
66
79
  private generateMessage;
67
80
  private reconnectPublic;
81
+ private reconnectPrivate;
68
82
  }
69
83
 
70
84
  export { WS, __ORDERLY_API_URL_KEY__, del, get, mutate, post, put };
package/dist/index.js CHANGED
@@ -176,6 +176,8 @@ var messageHandlers = /* @__PURE__ */ new Map([
176
176
  // src/ws/ws.ts
177
177
  var defaultMessageFormatter = (message) => message.data;
178
178
  var COMMON_ID = "OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY";
179
+ var TIME_OUT = 1e3 * 60 * 2;
180
+ var CONNECT_LIMIT = 5;
179
181
  var WS = class {
180
182
  constructor(options) {
181
183
  this.options = options;
@@ -188,6 +190,8 @@ var WS = class {
188
190
  // all message handlers
189
191
  this._eventHandlers = /* @__PURE__ */ new Map();
190
192
  this._eventPrivateHandlers = /* @__PURE__ */ new Map();
193
+ this._publicRetryCount = 0;
194
+ this._privateRetryCount = 0;
191
195
  this.send = (message) => {
192
196
  if (typeof message !== "string") {
193
197
  message = JSON.stringify(message);
@@ -208,20 +212,71 @@ var WS = class {
208
212
  }
209
213
  bindEvents() {
210
214
  if (typeof document !== "undefined") {
211
- document.addEventListener("visibilitychange", this.onVisibilityChange);
215
+ document.addEventListener(
216
+ "visibilitychange",
217
+ this.onVisibilityChange.bind(this)
218
+ );
212
219
  }
213
220
  if (typeof window !== "undefined") {
214
- window.addEventListener("online", this.onNetworkStatusChange);
215
- window.addEventListener("offline", this.onNetworkStatusChange);
221
+ window.addEventListener("online", this.onNetworkStatusChange.bind(this));
216
222
  }
217
223
  }
218
224
  onVisibilityChange() {
219
225
  console.log("\u{1F440}\u{1F440} document visibility \u{1F440}\u{1F440}", document.visibilityState);
220
- if (document.visibilityState) {
226
+ if (document.visibilityState === "visible") {
227
+ this.checkSocketStatus();
221
228
  }
222
229
  }
223
230
  onNetworkStatusChange() {
224
231
  console.log("\u{1F440}\u{1F440} network status \u{1F440}\u{1F440}", navigator.onLine);
232
+ if (navigator.onLine) {
233
+ this.checkSocketStatus();
234
+ }
235
+ }
236
+ /**
237
+ * 判断当前连接状态,
238
+ * 1、如果已断开则重连
239
+ * 2、如果太久没有收到消息,则主动断开,并重连
240
+ * 3、从后台返回、网络状态变化时,都走以下流程
241
+ */
242
+ checkSocketStatus() {
243
+ var _a, _b, _c;
244
+ const now = Date.now();
245
+ console.log(
246
+ "\u{1F440}\u{1F440} checkNetworkStatus \u{1F440}\u{1F440}",
247
+ this._publicHeartbeatTime,
248
+ this._privateHeartbeatTime,
249
+ now,
250
+ this.publicSocket.readyState,
251
+ (_a = this.privateSocket) == null ? void 0 : _a.readyState
252
+ );
253
+ if (document.visibilityState !== "visible")
254
+ return;
255
+ if (!navigator.onLine)
256
+ return;
257
+ if (!this.publicIsReconnecting) {
258
+ if (this.publicSocket.readyState === WebSocket.CLOSED) {
259
+ this.reconnectPublic();
260
+ } else {
261
+ console.log(
262
+ "***********************",
263
+ this.publicSocket.readyState,
264
+ now - this._publicHeartbeatTime
265
+ );
266
+ if (now - this._publicHeartbeatTime > TIME_OUT) {
267
+ this.publicSocket.close();
268
+ }
269
+ }
270
+ }
271
+ if (!this.privateIsReconnecting) {
272
+ if (((_b = this.privateSocket) == null ? void 0 : _b.readyState) === WebSocket.CLOSED) {
273
+ this.reconnectPrivate();
274
+ } else {
275
+ if (this._privateHeartbeatTime && now - this._privateHeartbeatTime > TIME_OUT) {
276
+ (_c = this.privateSocket) == null ? void 0 : _c.close();
277
+ }
278
+ }
279
+ }
225
280
  }
226
281
  openPrivate(accountId) {
227
282
  var _a;
@@ -240,26 +295,32 @@ var WS = class {
240
295
  (_a = this.privateSocket) == null ? void 0 : _a.close();
241
296
  }
242
297
  createPublicSC(options) {
298
+ console.log("open public webSocket ---->>>>");
299
+ if (this.publicSocket && this.publicSocket.readyState === WebSocket.OPEN)
300
+ return;
243
301
  this.publicSocket = new WebSocket(
244
302
  `${this.options.publicUrl}/ws/stream/${COMMON_ID}`
245
303
  );
246
304
  this.publicSocket.onopen = this.onOpen.bind(this);
247
305
  this.publicSocket.onmessage = this.onPublicMessage.bind(this);
248
- this.publicSocket.onclose = this.onClose.bind(this);
249
- this.publicSocket.onerror = this.onError.bind(this);
306
+ this.publicSocket.onclose = this.onPublicClose.bind(this);
307
+ this.publicSocket.onerror = this.onPublicError.bind(this);
250
308
  }
251
309
  createPrivateSC(options) {
252
- console.log("to open private webSocket ---->>>>");
310
+ console.log("open private webSocket ---->>>>");
311
+ if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)
312
+ return;
253
313
  this.options = options;
254
314
  this.privateSocket = new WebSocket(
255
315
  `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`
256
316
  );
257
317
  this.privateSocket.onopen = this.onPrivateOpen.bind(this);
258
318
  this.privateSocket.onmessage = this.onPrivateMessage.bind(this);
319
+ this.privateSocket.onclose = this.onPrivateClose.bind(this);
259
320
  this.privateSocket.onerror = this.onPrivateError.bind(this);
260
321
  }
261
322
  onOpen(event) {
262
- console.log("WebSocket connection opened:");
323
+ console.log("Public WebSocket connection opened");
263
324
  if (this._pendingPublicSubscribe.length > 0) {
264
325
  this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {
265
326
  this.subscribe(params, cb, isOnce);
@@ -267,11 +328,13 @@ var WS = class {
267
328
  this._pendingPublicSubscribe = [];
268
329
  }
269
330
  this.publicIsReconnecting = false;
331
+ this._publicRetryCount = 0;
270
332
  }
271
333
  onPrivateOpen(event) {
272
- console.log("Private WebSocket connection opened:");
334
+ console.log("Private WebSocket connection opened");
273
335
  this.authenticate(this.options.accountId);
274
336
  this.privateIsReconnecting = false;
337
+ this._privateRetryCount = 0;
275
338
  }
276
339
  onMessage(event, socket, handlerMap) {
277
340
  try {
@@ -294,9 +357,6 @@ var WS = class {
294
357
  cb.onMessage(data);
295
358
  }
296
359
  });
297
- if (eventhandler.isOnce) {
298
- handlerMap.delete(topicKey);
299
- }
300
360
  }
301
361
  }
302
362
  } catch (e) {
@@ -305,9 +365,11 @@ var WS = class {
305
365
  }
306
366
  onPublicMessage(event) {
307
367
  this.onMessage(event, this.publicSocket, this._eventHandlers);
368
+ this._publicHeartbeatTime = Date.now();
308
369
  }
309
370
  onPrivateMessage(event) {
310
371
  this.onMessage(event, this.privateSocket, this._eventPrivateHandlers);
372
+ this._privateHeartbeatTime = Date.now();
311
373
  }
312
374
  handlePendingPrivateTopic() {
313
375
  if (this._pendingPrivateSubscribe.length > 0) {
@@ -317,26 +379,69 @@ var WS = class {
317
379
  this._pendingPrivateSubscribe = [];
318
380
  }
319
381
  }
320
- onClose(event) {
321
- console.log("WebSocket connection closed:", event.reason);
322
- }
323
- onError(event) {
324
- console.error("WebSocket error:", event);
382
+ onPublicClose(event) {
383
+ console.log("public socket is closed");
325
384
  this._eventHandlers.forEach((value, key) => {
326
- if (!value.isPrivate) {
327
- this._pendingPublicSubscribe.push([value.params, value.callback]);
328
- this._eventHandlers.delete(key);
329
- }
385
+ value.callback.forEach((cb) => {
386
+ this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);
387
+ });
388
+ this._eventHandlers.delete(key);
389
+ });
390
+ setTimeout(() => this.checkSocketStatus(), 0);
391
+ }
392
+ onPrivateClose(event) {
393
+ console.log("private socket is closed");
394
+ if (this.privateIsReconnecting)
395
+ return;
396
+ this._eventPrivateHandlers.forEach((value, key) => {
397
+ console.log(value);
398
+ value.callback.forEach((cb) => {
399
+ this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);
400
+ });
401
+ this._eventPrivateHandlers.delete(key);
330
402
  });
331
- this.reconnectPublic();
403
+ this.authenticated = false;
404
+ setTimeout(() => this.checkSocketStatus(), 0);
405
+ }
406
+ onPublicError(event) {
407
+ console.error("public WebSocket error:", event);
408
+ this.publicIsReconnecting = false;
409
+ if (this.publicSocket.readyState === WebSocket.OPEN) {
410
+ this.publicSocket.close();
411
+ } else {
412
+ if (this._publicRetryCount > CONNECT_LIMIT)
413
+ return;
414
+ setTimeout(() => {
415
+ console.log("retry connect: %s", this._publicRetryCount);
416
+ this.reconnectPublic();
417
+ this._publicRetryCount++;
418
+ }, this._publicRetryCount * 1e3);
419
+ }
420
+ this.errorBoardscast(event, this._eventHandlers);
332
421
  }
333
422
  onPrivateError(event) {
423
+ var _a;
334
424
  console.error("Private WebSocket error:", event);
335
- this._eventHandlers.forEach((value, key) => {
336
- if (value.isPrivate) {
337
- this._pendingPrivateSubscribe.push([value.params, value.callback]);
338
- this._eventHandlers.delete(key);
339
- }
425
+ this.privateIsReconnecting = false;
426
+ if (((_a = this.privateSocket) == null ? void 0 : _a.readyState) === WebSocket.OPEN) {
427
+ this.privateSocket.close();
428
+ } else {
429
+ if (this._privateRetryCount > CONNECT_LIMIT)
430
+ return;
431
+ setTimeout(() => {
432
+ console.log("retry connect: %s", this._privateRetryCount);
433
+ this.reconnectPrivate();
434
+ this._privateRetryCount++;
435
+ }, this._privateRetryCount * 1e3);
436
+ }
437
+ this.errorBoardscast(event, this._eventPrivateHandlers);
438
+ }
439
+ errorBoardscast(error, eventHandlers) {
440
+ eventHandlers.forEach((value) => {
441
+ value.callback.forEach((cb) => {
442
+ var _a;
443
+ (_a = cb.onError) == null ? void 0 : _a.call(cb, error);
444
+ });
340
445
  });
341
446
  }
342
447
  close() {
@@ -426,7 +531,12 @@ var WS = class {
426
531
  });
427
532
  this.publicSocket.send(JSON.stringify(subscribeMessage));
428
533
  } else {
429
- handler.callback.push(callbacks);
534
+ if (once) {
535
+ handler.callback = [callbacks];
536
+ this.publicSocket.send(JSON.stringify(subscribeMessage));
537
+ } else {
538
+ handler.callback.push(callbacks);
539
+ }
430
540
  }
431
541
  if (!once) {
432
542
  return () => {
@@ -510,12 +620,28 @@ var WS = class {
510
620
  if (this.publicIsReconnecting)
511
621
  return;
512
622
  this.publicIsReconnecting = true;
513
- console.log(`Reconnecting in ${this.reconnectInterval / 1e3} seconds...`);
623
+ console.log(
624
+ `Reconnecting public in ${this.reconnectInterval / 1e3} seconds...`
625
+ );
514
626
  window.setTimeout(() => {
515
- console.log("Reconnecting...");
627
+ console.log("Public Reconnecting...");
516
628
  this.createPublicSC(this.options);
517
629
  }, this.reconnectInterval);
518
630
  }
631
+ reconnectPrivate() {
632
+ if (!this.options.accountId)
633
+ return;
634
+ if (this.privateIsReconnecting)
635
+ return;
636
+ this.privateIsReconnecting = true;
637
+ console.log(
638
+ `Reconnecting private in ${this.reconnectInterval / 1e3} seconds...`
639
+ );
640
+ window.setTimeout(() => {
641
+ console.log("Private Reconnecting...");
642
+ this.createPrivateSC(this.options);
643
+ }, this.reconnectInterval);
644
+ }
519
645
  };
520
646
  // Annotate the CommonJS export names for ESM import in node:
521
647
  0 && (module.exports = {
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 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\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 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(\"visibilitychange\", this.onVisibilityChange);\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange);\n window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n console.log(\"👀👀 document visibility 👀👀\", document.visibilityState);\n if (document.visibilityState) {\n }\n }\n\n private onNetworkStatusChange() {\n console.log(\"👀👀 network status 👀👀\", navigator.onLine);\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 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.onClose.bind(this);\n this.publicSocket.onerror = this.onError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n console.log(\"to open private webSocket ---->>>>\");\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.onClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"WebSocket connection opened:\");\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 }\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 }\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 if (eventhandler.isOnce) {\n handlerMap.delete(topicKey);\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\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\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 onClose(event: CloseEvent) {\n console.log(\"WebSocket connection closed:\", event.reason);\n }\n\n private onError(event: Event) {\n console.error(\"WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (!value.isPrivate) {\n this._pendingPublicSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n\n this.reconnectPublic();\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (value.isPrivate) {\n this._pendingPrivateSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\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 handler.callback.push(callbacks);\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(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);\n window.setTimeout(() => {\n console.log(\"Reconnecting...\");\n // this.publicIsReconnecting = false;\n\n this.createPublicSC(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 // 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 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 console.log(\n \"***********************\",\n this.publicSocket.readyState,\n now - this._publicHeartbeatTime!\n );\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 console.log(value);\n\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":[]}