@orderly.network/net 1.0.6 → 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,11 @@
1
1
  # @orderly.network/net
2
2
 
3
+ ## 1.0.7
4
+
5
+ ### Patch Changes
6
+
7
+ - update
8
+
3
9
  ## 1.0.6
4
10
 
5
11
  ### 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") {
@@ -446,7 +459,7 @@ var WS = class {
446
459
  } else {
447
460
  url = WS_URL[options.networkId || "testnet"].public;
448
461
  }
449
- this.publicSocket = new WebSocket(`${url}${options.accountId}`);
462
+ this.publicSocket = new WebSocket(`${url}${COMMON_ID}`);
450
463
  this.publicSocket.onopen = this.onOpen.bind(this);
451
464
  this.publicSocket.onmessage = this.onMessage.bind(this);
452
465
  this.publicSocket.onclose = this.onClose.bind(this);
@@ -464,7 +477,7 @@ var WS = class {
464
477
  console.log(this._pendingPublicSubscribe);
465
478
  if (this._pendingPublicSubscribe.length > 0) {
466
479
  this._pendingPublicSubscribe.forEach(([params, cb]) => {
467
- this.subscription(params, cb);
480
+ this.subscribe(params, cb);
468
481
  });
469
482
  this._pendingPublicSubscribe = [];
470
483
  }
@@ -474,7 +487,7 @@ var WS = class {
474
487
  console.log("Private WebSocket connection opened:");
475
488
  if (this._pendingPrivateSubscribe.length > 0) {
476
489
  this._pendingPrivateSubscribe.forEach(([params, cb]) => {
477
- this.subscription(params, cb);
490
+ this.subscribe(params, cb);
478
491
  });
479
492
  this._pendingPrivateSubscribe = [];
480
493
  }
@@ -487,11 +500,15 @@ var WS = class {
487
500
  if (commoneHandler) {
488
501
  commoneHandler.handle(message, this.send);
489
502
  } else {
490
- const eventhandler = this._eventHandlers.get(message.topic);
491
- if (eventhandler == null ? void 0 : eventhandler.cb) {
492
- 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) => {
493
508
  const data = cb.formatter ? cb.formatter(message) : defaultMessageFormatter(message);
494
- cb.onMessage(data);
509
+ if (data) {
510
+ cb.onMessage(data);
511
+ }
495
512
  });
496
513
  }
497
514
  }
@@ -506,7 +523,7 @@ var WS = class {
506
523
  console.error("WebSocket error:", event);
507
524
  this._eventHandlers.forEach((value, key) => {
508
525
  if (!value.isPrivate) {
509
- this._pendingPublicSubscribe.push([value.params, value.cb]);
526
+ this._pendingPublicSubscribe.push([value.params, value.callback]);
510
527
  this._eventHandlers.delete(key);
511
528
  }
512
529
  });
@@ -516,7 +533,7 @@ var WS = class {
516
533
  console.error("Private WebSocket error:", event);
517
534
  this._eventHandlers.forEach((value, key) => {
518
535
  if (value.isPrivate) {
519
- this._pendingPrivateSubscribe.push([value.params, value.cb]);
536
+ this._pendingPrivateSubscribe.push([value.params, value.callback]);
520
537
  this._eventHandlers.delete(key);
521
538
  }
522
539
  });
@@ -526,70 +543,112 @@ var WS = class {
526
543
  this.publicSocket.close();
527
544
  (_a = this.privateSocket) == null ? void 0 : _a.close();
528
545
  }
529
- authenticate(accountId, message) {
530
- if (this.authenticated)
531
- return;
532
- if (!this.privateSocket) {
533
- console.error("private ws not connected");
534
- return;
535
- }
536
- console.log("push auth message:", message);
537
- this.privateSocket.send(
538
- JSON.stringify({
539
- id: "auth",
540
- event: "auth",
541
- params: {
542
- orderly_key: message.publicKey,
543
- sign: message.signature,
544
- timestamp: message.timestamp
545
- }
546
- })
547
- );
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
+ });
548
571
  }
549
- privateSubscription(params, cb) {
572
+ privateSubscribe(params, callback) {
550
573
  }
551
- subscription(params, cb) {
552
- const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] = this.generateMessage(params);
553
- const unsubscribe = () => {
554
- console.log("unsubscribeMessage", unsubscribeMessage);
555
- this.publicSocket.send(JSON.stringify(unsubscribeMessage));
556
- };
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
+ );
557
580
  if (this.publicSocket.readyState !== WebSocket.OPEN) {
558
- this._pendingPublicSubscribe.push([params, cb]);
559
- return unsubscribe;
581
+ this._pendingPublicSubscribe.push([params, callback]);
582
+ if (!once) {
583
+ return () => {
584
+ this.unsubscribe(subscribeMessage);
585
+ };
586
+ }
587
+ return;
560
588
  }
561
- 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
+ });
562
594
  if (!handler) {
563
- this._eventHandlers.set(subscribeMessage.topic, {
595
+ this._eventHandlers.set(topic, {
564
596
  params,
565
- cb: [cb]
597
+ callback: [callbacks]
566
598
  });
567
599
  } else {
568
- handler.cb.push(cb);
600
+ handler.callback.push(callbacks);
569
601
  }
570
602
  this.publicSocket.send(JSON.stringify(subscribeMessage));
571
- return unsubscribe;
603
+ if (!once) {
604
+ return () => {
605
+ this.unsubscribe(subscribeMessage);
606
+ };
607
+ }
572
608
  }
573
- generateMessage(params, unsubscribe, messageFilter) {
574
- let subscribeMessage, unsubscribeMessage;
575
- 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;
576
631
  if (typeof params === "string") {
577
632
  subscribeMessage = { event: "subscribe", topic: params };
578
- unsubscribeMessage = { event: "unsubscribe", topic: params };
579
- filter = (message) => message.topic === params;
580
633
  } else {
581
634
  subscribeMessage = params;
582
- unsubscribeMessage = typeof unsubscribe === "function" ? unsubscribe() : unsubscribe;
583
- filter = messageFilter || ((message) => true);
584
635
  }
585
- 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];
586
645
  }
587
646
  reconnectPublic() {
588
647
  if (this.publicIsReconnecting)
589
648
  return;
590
649
  this.publicIsReconnecting = true;
591
650
  console.log(`Reconnecting in ${this.reconnectInterval / 1e3} seconds...`);
592
- this.publicReconnectTimeout = window.setTimeout(() => {
651
+ window.setTimeout(() => {
593
652
  console.log("Reconnecting...");
594
653
  this.createPublicSC(this.options);
595
654
  }, this.reconnectInterval);
@@ -600,6 +659,7 @@ var WS = class {
600
659
  WS,
601
660
  WebSocketClient,
602
661
  __ORDERLY_API_URL_KEY__,
662
+ del,
603
663
  get,
604
664
  post
605
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":[]}