@orderly.network/net 1.0.5 → 1.0.7

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.4 build /Users/leo/orderly/orderly-web/packages/net
2
+ > @orderly.network/net@1.0.6 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 18.60 KB
14
- CJS dist/index.js.map 31.59 KB
15
- CJS ⚡️ Build success in 20ms
16
- ESM dist/index.mjs 17.53 KB
17
- ESM dist/index.mjs.map 31.28 KB
18
- ESM ⚡️ Build success in 20ms
13
+ CJS dist/index.js 20.17 KB
14
+ CJS dist/index.js.map 34.29 KB
15
+ CJS ⚡️ Build success in 21ms
16
+ ESM dist/index.mjs 19.08 KB
17
+ ESM dist/index.mjs.map 33.96 KB
18
+ ESM ⚡️ Build success in 21ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 716ms
21
- DTS dist/index.d.ts 2.76 KB
22
- DTS dist/index.d.mts 2.76 KB
20
+ DTS ⚡️ Build success in 884ms
21
+ DTS dist/index.d.ts 2.93 KB
22
+ DTS dist/index.d.mts 2.93 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @orderly.network/net
2
2
 
3
+ ## 1.0.7
4
+
5
+ ### Patch Changes
6
+
7
+ - update
8
+
9
+ ## 1.0.6
10
+
11
+ ### Patch Changes
12
+
13
+ - update
14
+
3
15
  ## 1.0.5
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -2,6 +2,7 @@ import { Observable } from 'rxjs';
2
2
 
3
3
  declare function get<R>(url: string, options?: RequestInit, formatter?: (data: any) => R): Promise<R>;
4
4
  declare function post(url: string, data: any, options?: Omit<RequestInit, "method">): Promise<any>;
5
+ declare function del(url: string, data: any, options?: Omit<RequestInit, "method">): Promise<any>;
5
6
 
6
7
  type NetworkId$1 = "testnet" | "mainnet";
7
8
  type WSOptions$1 = {
@@ -46,7 +47,7 @@ type WSMessageHandler = {
46
47
  onMessage: (message: any) => void;
47
48
  onError?: (error: any) => void;
48
49
  onClose?: (event: any) => void;
49
- onUnsubscribe: (event: any) => string;
50
+ onUnsubscribe: (event: any) => any;
50
51
  formatter?: (message: any) => any;
51
52
  };
52
53
  declare class WS {
@@ -55,14 +56,10 @@ declare class WS {
55
56
  private privateSocket?;
56
57
  private publicIsReconnecting;
57
58
  private privateIsReconnecting;
58
- private publicReconnectTimeout?;
59
- private privateReconnectTimeout?;
60
59
  private reconnectInterval;
61
60
  private authenticated;
62
61
  private _pendingPrivateSubscribe;
63
62
  private _pendingPublicSubscribe;
64
- private _subscriptionPublicTopics;
65
- private _subscriptionPrivateTopics;
66
63
  private _eventHandlers;
67
64
  constructor(options: WSOptions);
68
65
  private createPublicSC;
@@ -75,11 +72,14 @@ declare class WS {
75
72
  private onPrivateError;
76
73
  send: (message: any) => void;
77
74
  close(): void;
75
+ set accountId(accountId: string);
78
76
  private authenticate;
79
- privateSubscription(params: any, cb: WSMessageHandler): void;
80
- subscription(params: any, cb: WSMessageHandler): unsubscribe;
77
+ privateSubscribe(params: any, callback: WSMessageHandler): void;
78
+ subscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">, once?: boolean): unsubscribe | undefined;
79
+ onceSubscribe(params: any, callback: Omit<WSMessageHandler, "onUnsubscribe">): void;
80
+ private unsubscribe;
81
81
  private generateMessage;
82
82
  private reconnectPublic;
83
83
  }
84
84
 
85
- export { NetworkId$1 as NetworkId, WS, WSOptions$1 as WSOptions, WebSocketClient, __ORDERLY_API_URL_KEY__, get, post };
85
+ export { NetworkId$1 as NetworkId, WS, WSOptions$1 as WSOptions, WebSocketClient, __ORDERLY_API_URL_KEY__, del, get, post };
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { Observable } from 'rxjs';
2
2
 
3
3
  declare function get<R>(url: string, options?: RequestInit, formatter?: (data: any) => R): Promise<R>;
4
4
  declare function post(url: string, data: any, options?: Omit<RequestInit, "method">): Promise<any>;
5
+ declare function del(url: string, data: any, options?: Omit<RequestInit, "method">): Promise<any>;
5
6
 
6
7
  type NetworkId$1 = "testnet" | "mainnet";
7
8
  type WSOptions$1 = {
@@ -46,7 +47,7 @@ type WSMessageHandler = {
46
47
  onMessage: (message: any) => void;
47
48
  onError?: (error: any) => void;
48
49
  onClose?: (event: any) => void;
49
- onUnsubscribe: (event: any) => string;
50
+ onUnsubscribe: (event: any) => any;
50
51
  formatter?: (message: any) => any;
51
52
  };
52
53
  declare class WS {
@@ -55,14 +56,10 @@ declare class WS {
55
56
  private privateSocket?;
56
57
  private publicIsReconnecting;
57
58
  private privateIsReconnecting;
58
- private publicReconnectTimeout?;
59
- private privateReconnectTimeout?;
60
59
  private reconnectInterval;
61
60
  private authenticated;
62
61
  private _pendingPrivateSubscribe;
63
62
  private _pendingPublicSubscribe;
64
- private _subscriptionPublicTopics;
65
- private _subscriptionPrivateTopics;
66
63
  private _eventHandlers;
67
64
  constructor(options: WSOptions);
68
65
  private createPublicSC;
@@ -75,11 +72,14 @@ declare class WS {
75
72
  private onPrivateError;
76
73
  send: (message: any) => void;
77
74
  close(): void;
75
+ set accountId(accountId: string);
78
76
  private authenticate;
79
- privateSubscription(params: any, cb: WSMessageHandler): void;
80
- subscription(params: any, cb: WSMessageHandler): unsubscribe;
77
+ privateSubscribe(params: any, callback: WSMessageHandler): void;
78
+ subscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">, once?: boolean): unsubscribe | undefined;
79
+ onceSubscribe(params: any, callback: Omit<WSMessageHandler, "onUnsubscribe">): void;
80
+ private unsubscribe;
81
81
  private generateMessage;
82
82
  private reconnectPublic;
83
83
  }
84
84
 
85
- export { NetworkId$1 as NetworkId, WS, WSOptions$1 as WSOptions, WebSocketClient, __ORDERLY_API_URL_KEY__, get, post };
85
+ export { NetworkId$1 as NetworkId, WS, WSOptions$1 as WSOptions, WebSocketClient, __ORDERLY_API_URL_KEY__, del, get, post };
package/dist/index.js CHANGED
@@ -60,6 +60,7 @@ __export(src_exports, {
60
60
  WS: () => WS,
61
61
  WebSocketClient: () => ws_default,
62
62
  __ORDERLY_API_URL_KEY__: () => __ORDERLY_API_URL_KEY__,
63
+ del: () => del,
63
64
  get: () => get,
64
65
  post: () => post
65
66
  });
@@ -76,13 +77,17 @@ function request(url, options) {
76
77
  // mode: "cors",
77
78
  // credentials: "include",
78
79
  headers: _createHeaders(options.headers)
79
- })).catch((err) => {
80
- throw new Error(err);
81
- });
80
+ }));
82
81
  if (response.ok) {
83
- return response.json();
82
+ const res = yield response.json();
83
+ if (res.success) {
84
+ return res;
85
+ } else {
86
+ throw new Error(res);
87
+ }
84
88
  }
85
- throw new Error(response.statusText);
89
+ const error = yield response.json();
90
+ throw new Error(error.message || error.code || error);
86
91
  });
87
92
  }
88
93
  function _createHeaders(headers = {}) {
@@ -118,6 +123,15 @@ function post(url, data, options) {
118
123
  return res;
119
124
  });
120
125
  }
126
+ function del(url, data, options) {
127
+ return __async(this, null, function* () {
128
+ const res = yield request(url, __spreadValues({
129
+ method: "DELETE",
130
+ body: JSON.stringify(data)
131
+ }, options));
132
+ return res;
133
+ });
134
+ }
121
135
 
122
136
  // src/ws/index.ts
123
137
  var import_webSocket = require("rxjs/webSocket");
@@ -410,6 +424,7 @@ var __ORDERLY_API_URL_KEY__ = "__ORDERLY_API_URL__";
410
424
 
411
425
  // src/ws/ws.ts
412
426
  var defaultMessageFormatter = (message) => message.data;
427
+ var COMMON_ID = "OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY";
413
428
  var WS = class {
414
429
  constructor(options) {
415
430
  this.options = options;
@@ -419,8 +434,6 @@ var WS = class {
419
434
  this.authenticated = false;
420
435
  this._pendingPrivateSubscribe = [];
421
436
  this._pendingPublicSubscribe = [];
422
- this._subscriptionPublicTopics = [];
423
- this._subscriptionPrivateTopics = [];
424
437
  this._eventHandlers = /* @__PURE__ */ new Map();
425
438
  this.send = (message) => {
426
439
  if (typeof message !== "string") {
@@ -430,7 +443,6 @@ var WS = class {
430
443
  return;
431
444
  if (this.publicSocket.readyState === WebSocket.OPEN) {
432
445
  this.publicSocket.send(message);
433
- console.log("WebSocket message sent:", message);
434
446
  } else {
435
447
  console.warn("WebSocket connection is not open. Cannot send message.");
436
448
  }
@@ -447,7 +459,7 @@ var WS = class {
447
459
  } else {
448
460
  url = WS_URL[options.networkId || "testnet"].public;
449
461
  }
450
- this.publicSocket = new WebSocket(`${url}${options.accountId}`);
462
+ this.publicSocket = new WebSocket(`${url}${COMMON_ID}`);
451
463
  this.publicSocket.onopen = this.onOpen.bind(this);
452
464
  this.publicSocket.onmessage = this.onMessage.bind(this);
453
465
  this.publicSocket.onclose = this.onClose.bind(this);
@@ -465,7 +477,7 @@ var WS = class {
465
477
  console.log(this._pendingPublicSubscribe);
466
478
  if (this._pendingPublicSubscribe.length > 0) {
467
479
  this._pendingPublicSubscribe.forEach(([params, cb]) => {
468
- this.subscription(params, cb);
480
+ this.subscribe(params, cb);
469
481
  });
470
482
  this._pendingPublicSubscribe = [];
471
483
  }
@@ -475,7 +487,7 @@ var WS = class {
475
487
  console.log("Private WebSocket connection opened:");
476
488
  if (this._pendingPrivateSubscribe.length > 0) {
477
489
  this._pendingPrivateSubscribe.forEach(([params, cb]) => {
478
- this.subscription(params, cb);
490
+ this.subscribe(params, cb);
479
491
  });
480
492
  this._pendingPrivateSubscribe = [];
481
493
  }
@@ -488,11 +500,15 @@ var WS = class {
488
500
  if (commoneHandler) {
489
501
  commoneHandler.handle(message, this.send);
490
502
  } else {
491
- const eventhandler = this._eventHandlers.get(message.topic);
492
- if (eventhandler == null ? void 0 : eventhandler.cb) {
493
- eventhandler.cb.forEach((cb) => {
503
+ const eventhandler = this._eventHandlers.get(
504
+ message.topic || message.event
505
+ );
506
+ if (eventhandler == null ? void 0 : eventhandler.callback) {
507
+ eventhandler.callback.forEach((cb) => {
494
508
  const data = cb.formatter ? cb.formatter(message) : defaultMessageFormatter(message);
495
- cb.onMessage(data);
509
+ if (data) {
510
+ cb.onMessage(data);
511
+ }
496
512
  });
497
513
  }
498
514
  }
@@ -507,7 +523,7 @@ var WS = class {
507
523
  console.error("WebSocket error:", event);
508
524
  this._eventHandlers.forEach((value, key) => {
509
525
  if (!value.isPrivate) {
510
- this._pendingPublicSubscribe.push([value.params, value.cb]);
526
+ this._pendingPublicSubscribe.push([value.params, value.callback]);
511
527
  this._eventHandlers.delete(key);
512
528
  }
513
529
  });
@@ -517,7 +533,7 @@ var WS = class {
517
533
  console.error("Private WebSocket error:", event);
518
534
  this._eventHandlers.forEach((value, key) => {
519
535
  if (value.isPrivate) {
520
- this._pendingPrivateSubscribe.push([value.params, value.cb]);
536
+ this._pendingPrivateSubscribe.push([value.params, value.callback]);
521
537
  this._eventHandlers.delete(key);
522
538
  }
523
539
  });
@@ -527,70 +543,112 @@ var WS = class {
527
543
  this.publicSocket.close();
528
544
  (_a = this.privateSocket) == null ? void 0 : _a.close();
529
545
  }
530
- authenticate(accountId, message) {
531
- if (this.authenticated)
532
- return;
533
- if (!this.privateSocket) {
534
- console.error("private ws not connected");
535
- return;
536
- }
537
- console.log("push auth message:", message);
538
- this.privateSocket.send(
539
- JSON.stringify({
540
- id: "auth",
541
- event: "auth",
542
- params: {
543
- orderly_key: message.publicKey,
544
- sign: message.signature,
545
- timestamp: message.timestamp
546
- }
547
- })
548
- );
546
+ set accountId(accountId) {
547
+ }
548
+ authenticate(accountId) {
549
+ return __async(this, null, function* () {
550
+ var _a, _b;
551
+ if (this.authenticated)
552
+ return;
553
+ if (!this.privateSocket) {
554
+ console.error("private ws not connected");
555
+ return;
556
+ }
557
+ const message = yield (_b = (_a = this.options).onSigntureRequest) == null ? void 0 : _b.call(_a, accountId);
558
+ console.log("push auth message:", message);
559
+ this.privateSocket.send(
560
+ JSON.stringify({
561
+ id: "auth",
562
+ event: "auth",
563
+ params: {
564
+ orderly_key: message.publicKey,
565
+ sign: message.signature,
566
+ timestamp: message.timestamp
567
+ }
568
+ })
569
+ );
570
+ });
549
571
  }
550
- privateSubscription(params, cb) {
572
+ privateSubscribe(params, callback) {
551
573
  }
552
- subscription(params, cb) {
553
- const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] = this.generateMessage(params);
554
- const unsubscribe = () => {
555
- console.log("unsubscribeMessage", unsubscribeMessage);
556
- this.publicSocket.send(JSON.stringify(unsubscribeMessage));
557
- };
574
+ subscribe(params, callback, once) {
575
+ console.log("\u{1F449}", params, callback, this.publicSocket.readyState);
576
+ const [subscribeMessage, onUnsubscribe] = this.generateMessage(
577
+ params,
578
+ callback.onUnsubscribe
579
+ );
558
580
  if (this.publicSocket.readyState !== WebSocket.OPEN) {
559
- this._pendingPublicSubscribe.push([params, cb]);
560
- return unsubscribe;
581
+ this._pendingPublicSubscribe.push([params, callback]);
582
+ if (!once) {
583
+ return () => {
584
+ this.unsubscribe(subscribeMessage);
585
+ };
586
+ }
587
+ return;
561
588
  }
562
- const handler = this._eventHandlers.get(subscribeMessage.topic);
589
+ const topic = subscribeMessage.topic || subscribeMessage.event;
590
+ const handler = this._eventHandlers.get(topic);
591
+ const callbacks = __spreadProps(__spreadValues({}, callback), {
592
+ onUnsubscribe
593
+ });
563
594
  if (!handler) {
564
- this._eventHandlers.set(subscribeMessage.topic, {
595
+ this._eventHandlers.set(topic, {
565
596
  params,
566
- cb: [cb]
597
+ callback: [callbacks]
567
598
  });
568
599
  } else {
569
- handler.cb.push(cb);
600
+ handler.callback.push(callbacks);
570
601
  }
571
602
  this.publicSocket.send(JSON.stringify(subscribeMessage));
572
- return unsubscribe;
603
+ if (!once) {
604
+ return () => {
605
+ this.unsubscribe(subscribeMessage);
606
+ };
607
+ }
573
608
  }
574
- generateMessage(params, unsubscribe, messageFilter) {
575
- let subscribeMessage, unsubscribeMessage;
576
- let filter, messageFormatter = (message) => message.data;
609
+ onceSubscribe(params, callback) {
610
+ this.subscribe(params, callback, true);
611
+ }
612
+ unsubscribe(parmas) {
613
+ const topic = parmas.topic || parmas.event;
614
+ const handler = this._eventHandlers.get(topic);
615
+ console.log("\u{1F91C} unsubscribe", parmas, topic, handler);
616
+ if (!!handler && Array.isArray(handler == null ? void 0 : handler.callback)) {
617
+ if (handler.callback.length === 1) {
618
+ const unsubscribeMessage = handler.callback[0].onUnsubscribe(topic);
619
+ console.log("unsubscribeMessage", unsubscribeMessage);
620
+ this.publicSocket.send(JSON.stringify(unsubscribeMessage));
621
+ this._eventHandlers.delete(topic);
622
+ } else {
623
+ this._eventHandlers.set(topic, __spreadProps(__spreadValues({}, handler), {
624
+ callback: handler.callback.slice(0, -1)
625
+ }));
626
+ }
627
+ }
628
+ }
629
+ generateMessage(params, onUnsubscribe) {
630
+ let subscribeMessage;
577
631
  if (typeof params === "string") {
578
632
  subscribeMessage = { event: "subscribe", topic: params };
579
- unsubscribeMessage = { event: "unsubscribe", topic: params };
580
- filter = (message) => message.topic === params;
581
633
  } else {
582
634
  subscribeMessage = params;
583
- unsubscribeMessage = typeof unsubscribe === "function" ? unsubscribe() : unsubscribe;
584
- filter = messageFilter || ((message) => true);
585
635
  }
586
- return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];
636
+ if (typeof onUnsubscribe !== "function") {
637
+ if (typeof params === "string") {
638
+ console.log("\u{1F449}", params);
639
+ onUnsubscribe = () => ({ event: "unsubscribe", topic: params });
640
+ } else {
641
+ onUnsubscribe = () => ({ event: "unsubscribe", topic: params.topic });
642
+ }
643
+ }
644
+ return [subscribeMessage, onUnsubscribe];
587
645
  }
588
646
  reconnectPublic() {
589
647
  if (this.publicIsReconnecting)
590
648
  return;
591
649
  this.publicIsReconnecting = true;
592
650
  console.log(`Reconnecting in ${this.reconnectInterval / 1e3} seconds...`);
593
- this.publicReconnectTimeout = window.setTimeout(() => {
651
+ window.setTimeout(() => {
594
652
  console.log("Reconnecting...");
595
653
  this.createPublicSC(this.options);
596
654
  }, this.reconnectInterval);
@@ -601,6 +659,7 @@ var WS = class {
601
659
  WS,
602
660
  WebSocketClient,
603
661
  __ORDERLY_API_URL_KEY__,
662
+ del,
604
663
  get,
605
664
  post
606
665
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/ws/index.ts","../src/ws/contants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/constants.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post } from \"./fetch\";\n\nexport { default as WebSocketClient } from \"./ws\";\nexport { type NetworkId, type WSOptions } from \"./ws\";\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),\n }).catch((err) => {\n throw new Error(err);\n });\n\n if (response.ok) {\n return response.json();\n }\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(headers: HeadersInit = {}): 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 _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\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\nexport { get, post };\n","import { type WebSocketSubject, webSocket } from \"rxjs/webSocket\";\n\nimport { WS_URL } from \"./contants\";\nimport { Observable, Observer, Subject, tap } from \"rxjs\";\nimport { messageHandlers } from \"@/ws/handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n url?: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nclass WebSocketClient {\n // the topic reference count;\n private static __topicRefCountMap: Map<string, number> = new Map();\n private wsSubject: WebSocketSubject<any>;\n private privateWsSubject?: WebSocketSubject<any>;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[] = [];\n\n constructor(options: WSOptions) {\n this.wsSubject = this.createSubject(options);\n\n if (!!options.accountId) {\n this.privateWsSubject = this.createPrivateSubject(options);\n }\n\n this.bindSubscribe();\n }\n private createSubject(options: WSOptions): WebSocketSubject<any> {\n let url;\n if (typeof options.url === \"string\") {\n url = options.url;\n } else {\n url = WS_URL[options.networkId || \"testnet\"].public;\n }\n\n return webSocket({\n url: `${url}${options.accountId || \"\"}`,\n openObserver: {\n next: () => {\n console.log(\"Connection ok\");\n },\n },\n closeObserver: {\n next: () => {\n console.log(\"Connection closed\");\n },\n },\n });\n }\n\n private createPrivateSubject(options: WSOptions): WebSocketSubject<any> {\n const url = WS_URL[options.networkId || \"testnet\"].private;\n const ws = webSocket({\n url: `${url}${options.accountId}`,\n openObserver: {\n next: () => {\n console.log(\"Private connection ok\");\n if (this.authenticated || !options.accountId) return;\n\n options.onSigntureRequest?.(options.accountId).then((signature) => {\n this.authenticate(options.accountId!, signature);\n });\n },\n },\n closeObserver: {\n next: () => {\n console.log(\"Private connection closed\");\n this.authenticated = false;\n },\n },\n });\n // authenticate\n\n return ws;\n }\n\n private bindSubscribe() {\n /// 处理ping,auth等消息\n\n this.wsSubject.subscribe({\n next: (message) => {\n const handler = messageHandlers.get(message.event);\n if (handler) {\n handler.handle(message, this.send);\n }\n },\n error(err) {\n console.log(\"WS Error: \", err);\n },\n complete() {\n console.log(\"WS Connection closed\");\n },\n });\n\n if (!this.privateWsSubject) return;\n\n this.privateWsSubject.subscribe({\n next: (message) => {\n if (message.event === \"auth\") {\n this.authenticated = true;\n // 认证成功后,发送之前的订阅消息\n this._sendPendingPrivateMessage();\n return;\n }\n\n const handler = messageHandlers.get(message.event);\n\n if (handler) {\n handler.handle(message, this.privateSend);\n }\n },\n error(err) {\n console.log(\"WS Error: \", err);\n },\n complete() {\n console.log(\"WS Connection closed\");\n },\n });\n }\n\n private authenticate(\n accountId: string,\n message: {\n publicKey: string;\n signature: string;\n timestamp: number;\n }\n ) {\n if (this.authenticated) return;\n if (!this.privateWsSubject) {\n console.error(\"private ws not connected\");\n return;\n }\n\n console.log(\"push auth message:\", message);\n this.privateWsSubject?.next({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n });\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n send = (message: any) => {\n this.wsSubject.next(message);\n };\n\n privateSend = (message: any) => {\n if (!this.privateWsSubject) {\n console.warn(\"private ws not connected\");\n return;\n }\n\n this.privateWsSubject.next(message);\n };\n\n get isAuthed() {\n return this.authenticated;\n }\n\n // observe<T>(topic: string): Observable<T>;\n // observe<T>(topic: string, unsubscribe?: () => any): Observable<T>;\n // observe<T>(\n // params: {\n // event: string;\n // } & Record<string, any>,\n // unsubscribe?: () => any\n // ): Observable<T>;\n observe<T>(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ): Observable<T> {\n return this._observe(false, params, unsubscribe, messageFilter);\n }\n\n // privateObserve<T>(topic: string): Observable<T>;\n // privateObserve<T>(topic: string, unsubscribe?: () => any): Observable<T>;\n // privateObserve<T>(\n // params: {\n // event: string;\n // } & Record<string, any>,\n // unsubscribe?: () => any\n // ): Observable<T>;\n privateObserve<T>(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ): Observable<T> {\n return this._observe(true, params, unsubscribe, messageFilter);\n }\n\n private _observe<T>(\n isPrivate: boolean,\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ) {\n console.log(\n \"observe---------------------------\",\n params,\n unsubscribe,\n messageFilter\n );\n\n if (isPrivate && !this.privateWsSubject) {\n throw new Error(\"private ws not connected\");\n }\n\n const subject = isPrivate ? this.privateWsSubject : this.wsSubject;\n const sendFunc = isPrivate ? this.privateSend : this.send;\n\n const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] =\n this.generateMessage(params, unsubscribe, messageFilter);\n\n return new Observable((observer: Observer<T>) => {\n // 如果是private ws, 但是没有连接,就先缓存起来,等连接上了再订阅\n if (isPrivate && !this.authenticated) {\n this._pendingPrivateSubscribe.push(params);\n return;\n }\n\n try {\n //TODO: add ref count, only send subscribe message when ref count is 0\n // 如果已经订阅过了,就不再发送订阅消息\n const refCount =\n WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;\n if (refCount === 0) {\n // WS.__topicRefCountMap.set(subscribeMessage.topic, WS.__topicRefCountMap.get(subscribeMessage.topic) + 1);\n // this.send(subscribeMessage);\n sendFunc(subscribeMessage);\n WebSocketClient.__topicRefCountMap.set(\n subscribeMessage.topic,\n refCount + 1\n );\n }\n } catch (err) {\n observer.error(err);\n }\n\n const subscription = subject!.subscribe({\n next: (x) => {\n try {\n if (filter(x)) {\n observer.next(messageFormatter(x));\n }\n } catch (err) {\n observer.error(err);\n }\n },\n error: (err) => observer.error(err),\n complete: () => observer.complete(),\n });\n\n return () => {\n try {\n // console.log(\"******* unsubscribe\", unsubscribeMessage);\n const refCount =\n WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;\n if (refCount > 1) {\n WebSocketClient.__topicRefCountMap.set(\n subscribeMessage.topic,\n refCount - 1\n );\n return;\n }\n if (!!unsubscribeMessage) {\n this.send(unsubscribeMessage);\n }\n WebSocketClient.__topicRefCountMap.delete(subscribeMessage.topic);\n } catch (err) {\n observer.error(err);\n }\n subscription.unsubscribe();\n };\n });\n }\n\n private generateMessage(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: any) => boolean\n ): [\n Record<string, any>,\n Record<string, any>,\n (message: any) => boolean,\n (message: any) => any\n ] {\n let subscribeMessage: Record<string, any>,\n unsubscribeMessage: Record<string, any>;\n let filter: (message: any) => boolean,\n messageFormatter: (message: any) => any = (message: any) => message.data;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n unsubscribeMessage = { event: \"unsubscribe\", topic: params };\n filter = (message: any) => message.topic === params;\n } else {\n subscribeMessage = params;\n unsubscribeMessage =\n typeof unsubscribe === \"function\" ? unsubscribe() : unsubscribe;\n filter = messageFilter || ((message: any) => true);\n }\n\n return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];\n }\n\n private _sendPendingPrivateMessage() {\n if (this._pendingPrivateSubscribe.length === 0) return;\n this._pendingPrivateSubscribe.forEach((params) => {\n this.privateObserve(params).subscribe();\n });\n this._pendingPrivateSubscribe = [];\n }\n\n // 取消所有订阅\n desotry() {\n this.wsSubject.unsubscribe();\n this.privateWsSubject?.unsubscribe();\n }\n}\n\nexport default WebSocketClient;\n","export const WS_URL = {\n testnet: {\n // public: \"wss://testnet-ws.orderly.org/ws/stream/\",\n public: \"wss://dev-ws-v2.orderly.org/ws/stream/\",\n // private:\n // \"wss://dev-ws-private-v2.orderly.org/wsprivate/v2/ws/private/stream/\",\n private: \"wss://dev-ws-private-v2.orderly.org/v2/ws/private/stream/\",\n },\n mainnet: {\n public: \"wss://mainnet-ws.orderly.io\",\n private: \"wss://mainnet-ws.orderly.io\",\n },\n};\n","import { MessageHandler, SendFunc } from \"@/types/ws\";\nimport { WebSocketSubject } from \"rxjs/webSocket\";\n\nexport default class BaseHandler implements MessageHandler {\n // constructor(readonly wsSubject: WebSocketSubject<any>) {}\n handle(message: any, send: SendFunc) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\nimport { SendFunc } from \"@/types/ws\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, send: SendFunc) {\n send({ 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","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { WS_URL } from \"./contants\";\nimport { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n url?: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => string;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: any;\n isPrivate?: boolean;\n cb: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\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 publicReconnectTimeout?: number;\n private privateReconnectTimeout?: number;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n private _subscriptionPublicTopics: Topics[] = [];\n private _subscriptionPrivateTopics: Topics[] = [];\n\n private _eventHandlers: Map<string, Topics> = new Map();\n\n constructor(private readonly options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n }\n\n private createPublicSC(options: WSOptions) {\n let url;\n if (typeof options.url === \"string\") {\n url = options.url;\n } else {\n url = WS_URL[options.networkId || \"testnet\"].public;\n }\n this.publicSocket = new WebSocket(`${url}${options.accountId}`);\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onMessage.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 const url = WS_URL[options.networkId || \"testnet\"].private;\n this.privateSocket = new WebSocket(`${url}${options.accountId}`);\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onMessage.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]) => {\n this.subscription(params, cb);\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\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.subscription(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n\n this.privateIsReconnecting = false;\n }\n\n private onMessage(event: MessageEvent) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (commoneHandler) {\n commoneHandler.handle(message, this.send);\n } else {\n const eventhandler = this._eventHandlers.get(message.topic);\n if (eventhandler?.cb) {\n eventhandler.cb.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n cb.onMessage(data);\n });\n }\n }\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", event.data);\n }\n\n // You can process the received message here\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.cb]);\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.cb]);\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 private authenticate(\n accountId: string,\n message: {\n publicKey: string;\n signature: string;\n timestamp: number;\n }\n ) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n console.log(\"push auth message:\", message);\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 privateSubscription(params: any, cb: WSMessageHandler) {}\n\n subscription(params: any, cb: WSMessageHandler): unsubscribe {\n const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] =\n this.generateMessage(params);\n\n const unsubscribe = () => {\n console.log(\"unsubscribeMessage\", unsubscribeMessage);\n this.publicSocket.send(JSON.stringify(unsubscribeMessage));\n };\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, cb]);\n return unsubscribe;\n }\n\n const handler = this._eventHandlers.get(subscribeMessage.topic);\n\n if (!handler) {\n this._eventHandlers.set(subscribeMessage.topic, {\n params,\n cb: [cb],\n });\n } else {\n handler.cb.push(cb);\n }\n\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n return unsubscribe;\n }\n\n private generateMessage(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: any) => boolean\n ): [\n Record<string, any>,\n Record<string, any>,\n (message: any) => boolean,\n (message: any) => any\n ] {\n let subscribeMessage: Record<string, any>,\n unsubscribeMessage: Record<string, any>;\n let filter: (message: any) => boolean,\n messageFormatter: (message: any) => any = (message: any) => message.data;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n unsubscribeMessage = { event: \"unsubscribe\", topic: params };\n filter = (message: any) => message.topic === params;\n } else {\n subscribeMessage = params;\n unsubscribeMessage =\n typeof unsubscribe === \"function\" ? unsubscribe() : unsubscribe;\n filter = messageFilter || ((message: any) => true);\n }\n\n return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);\n this.publicReconnectTimeout = 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/ws/index.ts","../src/ws/contants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/constants.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del } from \"./fetch\";\n\nexport { default as WebSocketClient } from \"./ws\";\nexport { type NetworkId, type WSOptions } from \"./ws\";\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),\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);\n }\n }\n\n const error = await response.json();\n\n throw new Error(error.message || error.code || error);\n}\n\nfunction _createHeaders(headers: HeadersInit = {}): 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 _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\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\n// async 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 data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nexport { get, post, del };\n","import { type WebSocketSubject, webSocket } from \"rxjs/webSocket\";\n\nimport { WS_URL } from \"./contants\";\nimport { Observable, Observer, Subject, tap } from \"rxjs\";\nimport { messageHandlers } from \"@/ws/handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n url?: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nclass WebSocketClient {\n // the topic reference count;\n private static __topicRefCountMap: Map<string, number> = new Map();\n private wsSubject: WebSocketSubject<any>;\n private privateWsSubject?: WebSocketSubject<any>;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[] = [];\n\n constructor(options: WSOptions) {\n this.wsSubject = this.createSubject(options);\n\n if (!!options.accountId) {\n this.privateWsSubject = this.createPrivateSubject(options);\n }\n\n this.bindSubscribe();\n }\n private createSubject(options: WSOptions): WebSocketSubject<any> {\n let url;\n if (typeof options.url === \"string\") {\n url = options.url;\n } else {\n url = WS_URL[options.networkId || \"testnet\"].public;\n }\n\n return webSocket({\n url: `${url}${options.accountId || \"\"}`,\n openObserver: {\n next: () => {\n console.log(\"Connection ok\");\n },\n },\n closeObserver: {\n next: () => {\n console.log(\"Connection closed\");\n },\n },\n });\n }\n\n private createPrivateSubject(options: WSOptions): WebSocketSubject<any> {\n const url = WS_URL[options.networkId || \"testnet\"].private;\n const ws = webSocket({\n url: `${url}${options.accountId}`,\n openObserver: {\n next: () => {\n console.log(\"Private connection ok\");\n if (this.authenticated || !options.accountId) return;\n\n options.onSigntureRequest?.(options.accountId).then((signature) => {\n this.authenticate(options.accountId!, signature);\n });\n },\n },\n closeObserver: {\n next: () => {\n console.log(\"Private connection closed\");\n this.authenticated = false;\n },\n },\n });\n // authenticate\n\n return ws;\n }\n\n private bindSubscribe() {\n /// 处理ping,auth等消息\n\n this.wsSubject.subscribe({\n next: (message) => {\n const handler = messageHandlers.get(message.event);\n if (handler) {\n handler.handle(message, this.send);\n }\n },\n error(err) {\n console.log(\"WS Error: \", err);\n },\n complete() {\n console.log(\"WS Connection closed\");\n },\n });\n\n if (!this.privateWsSubject) return;\n\n this.privateWsSubject.subscribe({\n next: (message) => {\n if (message.event === \"auth\") {\n this.authenticated = true;\n // 认证成功后,发送之前的订阅消息\n this._sendPendingPrivateMessage();\n return;\n }\n\n const handler = messageHandlers.get(message.event);\n\n if (handler) {\n handler.handle(message, this.privateSend);\n }\n },\n error(err) {\n console.log(\"WS Error: \", err);\n },\n complete() {\n console.log(\"WS Connection closed\");\n },\n });\n }\n\n private authenticate(\n accountId: string,\n message: {\n publicKey: string;\n signature: string;\n timestamp: number;\n }\n ) {\n if (this.authenticated) return;\n if (!this.privateWsSubject) {\n console.error(\"private ws not connected\");\n return;\n }\n\n console.log(\"push auth message:\", message);\n this.privateWsSubject?.next({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n });\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n send = (message: any) => {\n this.wsSubject.next(message);\n };\n\n privateSend = (message: any) => {\n if (!this.privateWsSubject) {\n console.warn(\"private ws not connected\");\n return;\n }\n\n this.privateWsSubject.next(message);\n };\n\n get isAuthed() {\n return this.authenticated;\n }\n\n // observe<T>(topic: string): Observable<T>;\n // observe<T>(topic: string, unsubscribe?: () => any): Observable<T>;\n // observe<T>(\n // params: {\n // event: string;\n // } & Record<string, any>,\n // unsubscribe?: () => any\n // ): Observable<T>;\n observe<T>(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ): Observable<T> {\n return this._observe(false, params, unsubscribe, messageFilter);\n }\n\n // privateObserve<T>(topic: string): Observable<T>;\n // privateObserve<T>(topic: string, unsubscribe?: () => any): Observable<T>;\n // privateObserve<T>(\n // params: {\n // event: string;\n // } & Record<string, any>,\n // unsubscribe?: () => any\n // ): Observable<T>;\n privateObserve<T>(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ): Observable<T> {\n return this._observe(true, params, unsubscribe, messageFilter);\n }\n\n private _observe<T>(\n isPrivate: boolean,\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ) {\n console.log(\n \"observe---------------------------\",\n params,\n unsubscribe,\n messageFilter\n );\n\n if (isPrivate && !this.privateWsSubject) {\n throw new Error(\"private ws not connected\");\n }\n\n const subject = isPrivate ? this.privateWsSubject : this.wsSubject;\n const sendFunc = isPrivate ? this.privateSend : this.send;\n\n const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] =\n this.generateMessage(params, unsubscribe, messageFilter);\n\n return new Observable((observer: Observer<T>) => {\n // 如果是private ws, 但是没有连接,就先缓存起来,等连接上了再订阅\n if (isPrivate && !this.authenticated) {\n this._pendingPrivateSubscribe.push(params);\n return;\n }\n\n try {\n //TODO: add ref count, only send subscribe message when ref count is 0\n // 如果已经订阅过了,就不再发送订阅消息\n const refCount =\n WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;\n if (refCount === 0) {\n // WS.__topicRefCountMap.set(subscribeMessage.topic, WS.__topicRefCountMap.get(subscribeMessage.topic) + 1);\n // this.send(subscribeMessage);\n sendFunc(subscribeMessage);\n WebSocketClient.__topicRefCountMap.set(\n subscribeMessage.topic,\n refCount + 1\n );\n }\n } catch (err) {\n observer.error(err);\n }\n\n const subscription = subject!.subscribe({\n next: (x) => {\n try {\n if (filter(x)) {\n observer.next(messageFormatter(x));\n }\n } catch (err) {\n observer.error(err);\n }\n },\n error: (err) => observer.error(err),\n complete: () => observer.complete(),\n });\n\n return () => {\n try {\n // console.log(\"******* unsubscribe\", unsubscribeMessage);\n const refCount =\n WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;\n if (refCount > 1) {\n WebSocketClient.__topicRefCountMap.set(\n subscribeMessage.topic,\n refCount - 1\n );\n return;\n }\n if (!!unsubscribeMessage) {\n this.send(unsubscribeMessage);\n }\n WebSocketClient.__topicRefCountMap.delete(subscribeMessage.topic);\n } catch (err) {\n observer.error(err);\n }\n subscription.unsubscribe();\n };\n });\n }\n\n private generateMessage(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: any) => boolean\n ): [\n Record<string, any>,\n Record<string, any>,\n (message: any) => boolean,\n (message: any) => any\n ] {\n let subscribeMessage: Record<string, any>,\n unsubscribeMessage: Record<string, any>;\n let filter: (message: any) => boolean,\n messageFormatter: (message: any) => any = (message: any) => message.data;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n unsubscribeMessage = { event: \"unsubscribe\", topic: params };\n filter = (message: any) => message.topic === params;\n } else {\n subscribeMessage = params;\n unsubscribeMessage =\n typeof unsubscribe === \"function\" ? unsubscribe() : unsubscribe;\n filter = messageFilter || ((message: any) => true);\n }\n\n return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];\n }\n\n private _sendPendingPrivateMessage() {\n if (this._pendingPrivateSubscribe.length === 0) return;\n this._pendingPrivateSubscribe.forEach((params) => {\n this.privateObserve(params).subscribe();\n });\n this._pendingPrivateSubscribe = [];\n }\n\n // 取消所有订阅\n desotry() {\n this.wsSubject.unsubscribe();\n this.privateWsSubject?.unsubscribe();\n }\n}\n\nexport default WebSocketClient;\n","export const WS_URL = {\n testnet: {\n // public: \"wss://testnet-ws.orderly.org/ws/stream/\",\n public: \"wss://dev-ws-v2.orderly.org/ws/stream/\",\n // private:\n // \"wss://dev-ws-private-v2.orderly.org/wsprivate/v2/ws/private/stream/\",\n private: \"wss://dev-ws-private-v2.orderly.org/v2/ws/private/stream/\",\n },\n mainnet: {\n public: \"wss://mainnet-ws.orderly.io\",\n private: \"wss://mainnet-ws.orderly.io\",\n },\n};\n","import { MessageHandler, SendFunc } from \"@/types/ws\";\nimport { WebSocketSubject } from \"rxjs/webSocket\";\n\nexport default class BaseHandler implements MessageHandler {\n // constructor(readonly wsSubject: WebSocketSubject<any>) {}\n handle(message: any, send: SendFunc) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\nimport { SendFunc } from \"@/types/ws\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, send: SendFunc) {\n send({ 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","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { WS_URL } from \"./contants\";\nimport { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n url?: 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 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 private _eventHandlers: Map<string, Topics> = new Map();\n\n constructor(private readonly options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n }\n\n private createPublicSC(options: WSOptions) {\n let url;\n if (typeof options.url === \"string\") {\n url = options.url;\n } else {\n url = WS_URL[options.networkId || \"testnet\"].public;\n }\n this.publicSocket = new WebSocket(`${url}${COMMON_ID}`);\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onMessage.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 const url = WS_URL[options.networkId || \"testnet\"].private;\n this.privateSocket = new WebSocket(`${url}${options.accountId}`);\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onMessage.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]) => {\n this.subscribe(params, cb);\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\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.subscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n\n this.privateIsReconnecting = false;\n }\n\n private onMessage(event: MessageEvent) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (commoneHandler) {\n commoneHandler.handle(message, this.send);\n } else {\n const eventhandler = this._eventHandlers.get(\n message.topic || message.event\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 // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", event.data);\n }\n\n // You can process the received message here\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 console.log(\"push auth message:\", message);\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(params: any, callback: WSMessageHandler) {}\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 if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback]);\n\n if (!once) {\n return () => {\n this.unsubscribe(subscribeMessage);\n };\n }\n return;\n }\n\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 callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribe(subscribeMessage);\n };\n }\n }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(parmas: MessageParams) {\n const topic = parmas.topic || parmas.event;\n const handler = this._eventHandlers.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 this.publicSocket.send(JSON.stringify(unsubscribeMessage));\n this._eventHandlers.delete(topic);\n //post unsubscribe message\n } else {\n this._eventHandlers.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\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":[]}