@orderly.network/net 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
 
2
- > @orderly.network/net@1.0.0 build /Users/leo/orderly/orderly-web/packages/net
2
+ > @orderly.network/net@1.0.3 build /Users/leo/orderly/orderly-web/packages/net
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@ CLI Target: es6
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
12
  ESM Build start
13
- ESM dist/index.mjs 10.09 KB
14
- ESM dist/index.mjs.map 16.58 KB
15
- ESM ⚡️ Build success in 11ms
16
- CJS dist/index.js 11.13 KB
17
- CJS dist/index.js.map 16.80 KB
18
- CJS ⚡️ Build success in 11ms
13
+ CJS dist/index.js 18.60 KB
14
+ CJS dist/index.js.map 31.59 KB
15
+ CJS ⚡️ Build success in 39ms
16
+ ESM dist/index.mjs 17.53 KB
17
+ ESM dist/index.mjs.map 31.28 KB
18
+ ESM ⚡️ Build success in 40ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 545ms
21
- DTS dist/index.d.ts 1.16 KB
22
- DTS dist/index.d.mts 1.16 KB
20
+ DTS ⚡️ Build success in 850ms
21
+ DTS dist/index.d.ts 2.76 KB
22
+ DTS dist/index.d.mts 2.76 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @orderly.network/net
2
2
 
3
+ ## 1.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - fix bug & update
8
+
3
9
  ## 1.0.3
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -3,10 +3,10 @@ import { Observable } from 'rxjs';
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
5
 
6
- type NetworkId = "testnet" | "mainnet";
7
- type WSOptions = {
6
+ type NetworkId$1 = "testnet" | "mainnet";
7
+ type WSOptions$1 = {
8
8
  url?: string;
9
- networkId?: NetworkId;
9
+ networkId?: NetworkId$1;
10
10
  accountId?: string;
11
11
  onSigntureRequest?: (accountId: string) => Promise<any>;
12
12
  };
@@ -16,7 +16,7 @@ declare class WebSocketClient {
16
16
  private privateWsSubject?;
17
17
  private authenticated;
18
18
  private _pendingPrivateSubscribe;
19
- constructor(options: WSOptions);
19
+ constructor(options: WSOptions$1);
20
20
  private createSubject;
21
21
  private createPrivateSubject;
22
22
  private bindSubscribe;
@@ -34,4 +34,52 @@ declare class WebSocketClient {
34
34
 
35
35
  declare const __ORDERLY_API_URL_KEY__: string;
36
36
 
37
- export { WebSocketClient, __ORDERLY_API_URL_KEY__, get, post };
37
+ type NetworkId = "testnet" | "mainnet";
38
+ type WSOptions = {
39
+ url?: string;
40
+ networkId?: NetworkId;
41
+ accountId?: string;
42
+ onSigntureRequest?: (accountId: string) => Promise<any>;
43
+ };
44
+ type unsubscribe = () => void;
45
+ type WSMessageHandler = {
46
+ onMessage: (message: any) => void;
47
+ onError?: (error: any) => void;
48
+ onClose?: (event: any) => void;
49
+ onUnsubscribe: (event: any) => string;
50
+ formatter?: (message: any) => any;
51
+ };
52
+ declare class WS {
53
+ private readonly options;
54
+ private publicSocket;
55
+ private privateSocket?;
56
+ private publicIsReconnecting;
57
+ private privateIsReconnecting;
58
+ private publicReconnectTimeout?;
59
+ private privateReconnectTimeout?;
60
+ private reconnectInterval;
61
+ private authenticated;
62
+ private _pendingPrivateSubscribe;
63
+ private _pendingPublicSubscribe;
64
+ private _subscriptionPublicTopics;
65
+ private _subscriptionPrivateTopics;
66
+ private _eventHandlers;
67
+ constructor(options: WSOptions);
68
+ private createPublicSC;
69
+ private createPrivateSC;
70
+ private onOpen;
71
+ private onPrivateOpen;
72
+ private onMessage;
73
+ private onClose;
74
+ private onError;
75
+ private onPrivateError;
76
+ send: (message: any) => void;
77
+ close(): void;
78
+ private authenticate;
79
+ privateSubscription(params: any, cb: WSMessageHandler): void;
80
+ subscription(params: any, cb: WSMessageHandler): unsubscribe;
81
+ private generateMessage;
82
+ private reconnectPublic;
83
+ }
84
+
85
+ export { NetworkId$1 as NetworkId, WS, WSOptions$1 as WSOptions, WebSocketClient, __ORDERLY_API_URL_KEY__, get, post };
package/dist/index.d.ts CHANGED
@@ -3,10 +3,10 @@ import { Observable } from 'rxjs';
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
5
 
6
- type NetworkId = "testnet" | "mainnet";
7
- type WSOptions = {
6
+ type NetworkId$1 = "testnet" | "mainnet";
7
+ type WSOptions$1 = {
8
8
  url?: string;
9
- networkId?: NetworkId;
9
+ networkId?: NetworkId$1;
10
10
  accountId?: string;
11
11
  onSigntureRequest?: (accountId: string) => Promise<any>;
12
12
  };
@@ -16,7 +16,7 @@ declare class WebSocketClient {
16
16
  private privateWsSubject?;
17
17
  private authenticated;
18
18
  private _pendingPrivateSubscribe;
19
- constructor(options: WSOptions);
19
+ constructor(options: WSOptions$1);
20
20
  private createSubject;
21
21
  private createPrivateSubject;
22
22
  private bindSubscribe;
@@ -34,4 +34,52 @@ declare class WebSocketClient {
34
34
 
35
35
  declare const __ORDERLY_API_URL_KEY__: string;
36
36
 
37
- export { WebSocketClient, __ORDERLY_API_URL_KEY__, get, post };
37
+ type NetworkId = "testnet" | "mainnet";
38
+ type WSOptions = {
39
+ url?: string;
40
+ networkId?: NetworkId;
41
+ accountId?: string;
42
+ onSigntureRequest?: (accountId: string) => Promise<any>;
43
+ };
44
+ type unsubscribe = () => void;
45
+ type WSMessageHandler = {
46
+ onMessage: (message: any) => void;
47
+ onError?: (error: any) => void;
48
+ onClose?: (event: any) => void;
49
+ onUnsubscribe: (event: any) => string;
50
+ formatter?: (message: any) => any;
51
+ };
52
+ declare class WS {
53
+ private readonly options;
54
+ private publicSocket;
55
+ private privateSocket?;
56
+ private publicIsReconnecting;
57
+ private privateIsReconnecting;
58
+ private publicReconnectTimeout?;
59
+ private privateReconnectTimeout?;
60
+ private reconnectInterval;
61
+ private authenticated;
62
+ private _pendingPrivateSubscribe;
63
+ private _pendingPublicSubscribe;
64
+ private _subscriptionPublicTopics;
65
+ private _subscriptionPrivateTopics;
66
+ private _eventHandlers;
67
+ constructor(options: WSOptions);
68
+ private createPublicSC;
69
+ private createPrivateSC;
70
+ private onOpen;
71
+ private onPrivateOpen;
72
+ private onMessage;
73
+ private onClose;
74
+ private onError;
75
+ private onPrivateError;
76
+ send: (message: any) => void;
77
+ close(): void;
78
+ private authenticate;
79
+ privateSubscription(params: any, cb: WSMessageHandler): void;
80
+ subscription(params: any, cb: WSMessageHandler): unsubscribe;
81
+ private generateMessage;
82
+ private reconnectPublic;
83
+ }
84
+
85
+ export { NetworkId$1 as NetworkId, WS, WSOptions$1 as WSOptions, WebSocketClient, __ORDERLY_API_URL_KEY__, get, post };
package/dist/index.js CHANGED
@@ -57,6 +57,7 @@ var __async = (__this, __arguments, generator) => {
57
57
  // src/index.ts
58
58
  var src_exports = {};
59
59
  __export(src_exports, {
60
+ WS: () => WS,
60
61
  WebSocketClient: () => ws_default,
61
62
  __ORDERLY_API_URL_KEY__: () => __ORDERLY_API_URL_KEY__,
62
63
  get: () => get,
@@ -307,6 +308,12 @@ var _WebSocketClient = class _WebSocketClient {
307
308
  return this._observe(true, params, unsubscribe, messageFilter);
308
309
  }
309
310
  _observe(isPrivate, params, unsubscribe, messageFilter) {
311
+ console.log(
312
+ "observe---------------------------",
313
+ params,
314
+ unsubscribe,
315
+ messageFilter
316
+ );
310
317
  if (isPrivate && !this.privateWsSubject) {
311
318
  throw new Error("private ws not connected");
312
319
  }
@@ -400,8 +407,198 @@ var ws_default = WebSocketClient;
400
407
 
401
408
  // src/constants.ts
402
409
  var __ORDERLY_API_URL_KEY__ = "__ORDERLY_API_URL__";
410
+
411
+ // src/ws/ws.ts
412
+ var defaultMessageFormatter = (message) => message.data;
413
+ var WS = class {
414
+ constructor(options) {
415
+ this.options = options;
416
+ this.publicIsReconnecting = false;
417
+ this.privateIsReconnecting = false;
418
+ this.reconnectInterval = 1e3;
419
+ this.authenticated = false;
420
+ this._pendingPrivateSubscribe = [];
421
+ this._pendingPublicSubscribe = [];
422
+ this._subscriptionPublicTopics = [];
423
+ this._subscriptionPrivateTopics = [];
424
+ this._eventHandlers = /* @__PURE__ */ new Map();
425
+ this.send = (message) => {
426
+ if (typeof message !== "string") {
427
+ message = JSON.stringify(message);
428
+ }
429
+ if (typeof message === "undefined")
430
+ return;
431
+ if (this.publicSocket.readyState === WebSocket.OPEN) {
432
+ this.publicSocket.send(message);
433
+ console.log("WebSocket message sent:", message);
434
+ } else {
435
+ console.warn("WebSocket connection is not open. Cannot send message.");
436
+ }
437
+ };
438
+ this.createPublicSC(options);
439
+ if (!!options.accountId) {
440
+ this.createPrivateSC(options);
441
+ }
442
+ }
443
+ createPublicSC(options) {
444
+ let url;
445
+ if (typeof options.url === "string") {
446
+ url = options.url;
447
+ } else {
448
+ url = WS_URL[options.networkId || "testnet"].public;
449
+ }
450
+ this.publicSocket = new WebSocket(`${url}${options.accountId}`);
451
+ this.publicSocket.onopen = this.onOpen.bind(this);
452
+ this.publicSocket.onmessage = this.onMessage.bind(this);
453
+ this.publicSocket.onclose = this.onClose.bind(this);
454
+ this.publicSocket.onerror = this.onError.bind(this);
455
+ }
456
+ createPrivateSC(options) {
457
+ const url = WS_URL[options.networkId || "testnet"].private;
458
+ this.privateSocket = new WebSocket(`${url}${options.accountId}`);
459
+ this.privateSocket.onopen = this.onPrivateOpen.bind(this);
460
+ this.privateSocket.onmessage = this.onMessage.bind(this);
461
+ this.privateSocket.onerror = this.onPrivateError.bind(this);
462
+ }
463
+ onOpen(event) {
464
+ console.log("WebSocket connection opened:");
465
+ console.log(this._pendingPublicSubscribe);
466
+ if (this._pendingPublicSubscribe.length > 0) {
467
+ this._pendingPublicSubscribe.forEach(([params, cb]) => {
468
+ this.subscription(params, cb);
469
+ });
470
+ this._pendingPublicSubscribe = [];
471
+ }
472
+ this.publicIsReconnecting = false;
473
+ }
474
+ onPrivateOpen(event) {
475
+ console.log("Private WebSocket connection opened:");
476
+ if (this._pendingPrivateSubscribe.length > 0) {
477
+ this._pendingPrivateSubscribe.forEach(([params, cb]) => {
478
+ this.subscription(params, cb);
479
+ });
480
+ this._pendingPrivateSubscribe = [];
481
+ }
482
+ this.privateIsReconnecting = false;
483
+ }
484
+ onMessage(event) {
485
+ try {
486
+ const message = JSON.parse(event.data);
487
+ const commoneHandler = messageHandlers.get(message.event);
488
+ if (commoneHandler) {
489
+ commoneHandler.handle(message, this.send);
490
+ } else {
491
+ const eventhandler = this._eventHandlers.get(message.topic);
492
+ if (eventhandler == null ? void 0 : eventhandler.cb) {
493
+ eventhandler.cb.forEach((cb) => {
494
+ const data = cb.formatter ? cb.formatter(message) : defaultMessageFormatter(message);
495
+ cb.onMessage(data);
496
+ });
497
+ }
498
+ }
499
+ } catch (e) {
500
+ console.log("WebSocket message received:", event.data);
501
+ }
502
+ }
503
+ onClose(event) {
504
+ console.log("WebSocket connection closed:", event.reason);
505
+ }
506
+ onError(event) {
507
+ console.error("WebSocket error:", event);
508
+ this._eventHandlers.forEach((value, key) => {
509
+ if (!value.isPrivate) {
510
+ this._pendingPublicSubscribe.push([value.params, value.cb]);
511
+ this._eventHandlers.delete(key);
512
+ }
513
+ });
514
+ this.reconnectPublic();
515
+ }
516
+ onPrivateError(event) {
517
+ console.error("Private WebSocket error:", event);
518
+ this._eventHandlers.forEach((value, key) => {
519
+ if (value.isPrivate) {
520
+ this._pendingPrivateSubscribe.push([value.params, value.cb]);
521
+ this._eventHandlers.delete(key);
522
+ }
523
+ });
524
+ }
525
+ close() {
526
+ var _a;
527
+ this.publicSocket.close();
528
+ (_a = this.privateSocket) == null ? void 0 : _a.close();
529
+ }
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
+ );
549
+ }
550
+ privateSubscription(params, cb) {
551
+ }
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
+ };
558
+ if (this.publicSocket.readyState !== WebSocket.OPEN) {
559
+ this._pendingPublicSubscribe.push([params, cb]);
560
+ return unsubscribe;
561
+ }
562
+ const handler = this._eventHandlers.get(subscribeMessage.topic);
563
+ if (!handler) {
564
+ this._eventHandlers.set(subscribeMessage.topic, {
565
+ params,
566
+ cb: [cb]
567
+ });
568
+ } else {
569
+ handler.cb.push(cb);
570
+ }
571
+ this.publicSocket.send(JSON.stringify(subscribeMessage));
572
+ return unsubscribe;
573
+ }
574
+ generateMessage(params, unsubscribe, messageFilter) {
575
+ let subscribeMessage, unsubscribeMessage;
576
+ let filter, messageFormatter = (message) => message.data;
577
+ if (typeof params === "string") {
578
+ subscribeMessage = { event: "subscribe", topic: params };
579
+ unsubscribeMessage = { event: "unsubscribe", topic: params };
580
+ filter = (message) => message.topic === params;
581
+ } else {
582
+ subscribeMessage = params;
583
+ unsubscribeMessage = typeof unsubscribe === "function" ? unsubscribe() : unsubscribe;
584
+ filter = messageFilter || ((message) => true);
585
+ }
586
+ return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];
587
+ }
588
+ reconnectPublic() {
589
+ if (this.publicIsReconnecting)
590
+ return;
591
+ this.publicIsReconnecting = true;
592
+ console.log(`Reconnecting in ${this.reconnectInterval / 1e3} seconds...`);
593
+ this.publicReconnectTimeout = window.setTimeout(() => {
594
+ console.log("Reconnecting...");
595
+ this.createPublicSC(this.options);
596
+ }, this.reconnectInterval);
597
+ }
598
+ };
403
599
  // Annotate the CommonJS export names for ESM import in node:
404
600
  0 && (module.exports = {
601
+ WS,
405
602
  WebSocketClient,
406
603
  __ORDERLY_API_URL_KEY__,
407
604
  get,
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"],"sourcesContent":["export { get, post } from \"./fetch\";\n\nexport { default as WebSocketClient } from \"./ws\";\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\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 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"],"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 } 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":[]}
package/dist/index.mjs CHANGED
@@ -281,6 +281,12 @@ var _WebSocketClient = class _WebSocketClient {
281
281
  return this._observe(true, params, unsubscribe, messageFilter);
282
282
  }
283
283
  _observe(isPrivate, params, unsubscribe, messageFilter) {
284
+ console.log(
285
+ "observe---------------------------",
286
+ params,
287
+ unsubscribe,
288
+ messageFilter
289
+ );
284
290
  if (isPrivate && !this.privateWsSubject) {
285
291
  throw new Error("private ws not connected");
286
292
  }
@@ -374,7 +380,197 @@ var ws_default = WebSocketClient;
374
380
 
375
381
  // src/constants.ts
376
382
  var __ORDERLY_API_URL_KEY__ = "__ORDERLY_API_URL__";
383
+
384
+ // src/ws/ws.ts
385
+ var defaultMessageFormatter = (message) => message.data;
386
+ var WS = class {
387
+ constructor(options) {
388
+ this.options = options;
389
+ this.publicIsReconnecting = false;
390
+ this.privateIsReconnecting = false;
391
+ this.reconnectInterval = 1e3;
392
+ this.authenticated = false;
393
+ this._pendingPrivateSubscribe = [];
394
+ this._pendingPublicSubscribe = [];
395
+ this._subscriptionPublicTopics = [];
396
+ this._subscriptionPrivateTopics = [];
397
+ this._eventHandlers = /* @__PURE__ */ new Map();
398
+ this.send = (message) => {
399
+ if (typeof message !== "string") {
400
+ message = JSON.stringify(message);
401
+ }
402
+ if (typeof message === "undefined")
403
+ return;
404
+ if (this.publicSocket.readyState === WebSocket.OPEN) {
405
+ this.publicSocket.send(message);
406
+ console.log("WebSocket message sent:", message);
407
+ } else {
408
+ console.warn("WebSocket connection is not open. Cannot send message.");
409
+ }
410
+ };
411
+ this.createPublicSC(options);
412
+ if (!!options.accountId) {
413
+ this.createPrivateSC(options);
414
+ }
415
+ }
416
+ createPublicSC(options) {
417
+ let url;
418
+ if (typeof options.url === "string") {
419
+ url = options.url;
420
+ } else {
421
+ url = WS_URL[options.networkId || "testnet"].public;
422
+ }
423
+ this.publicSocket = new WebSocket(`${url}${options.accountId}`);
424
+ this.publicSocket.onopen = this.onOpen.bind(this);
425
+ this.publicSocket.onmessage = this.onMessage.bind(this);
426
+ this.publicSocket.onclose = this.onClose.bind(this);
427
+ this.publicSocket.onerror = this.onError.bind(this);
428
+ }
429
+ createPrivateSC(options) {
430
+ const url = WS_URL[options.networkId || "testnet"].private;
431
+ this.privateSocket = new WebSocket(`${url}${options.accountId}`);
432
+ this.privateSocket.onopen = this.onPrivateOpen.bind(this);
433
+ this.privateSocket.onmessage = this.onMessage.bind(this);
434
+ this.privateSocket.onerror = this.onPrivateError.bind(this);
435
+ }
436
+ onOpen(event) {
437
+ console.log("WebSocket connection opened:");
438
+ console.log(this._pendingPublicSubscribe);
439
+ if (this._pendingPublicSubscribe.length > 0) {
440
+ this._pendingPublicSubscribe.forEach(([params, cb]) => {
441
+ this.subscription(params, cb);
442
+ });
443
+ this._pendingPublicSubscribe = [];
444
+ }
445
+ this.publicIsReconnecting = false;
446
+ }
447
+ onPrivateOpen(event) {
448
+ console.log("Private WebSocket connection opened:");
449
+ if (this._pendingPrivateSubscribe.length > 0) {
450
+ this._pendingPrivateSubscribe.forEach(([params, cb]) => {
451
+ this.subscription(params, cb);
452
+ });
453
+ this._pendingPrivateSubscribe = [];
454
+ }
455
+ this.privateIsReconnecting = false;
456
+ }
457
+ onMessage(event) {
458
+ try {
459
+ const message = JSON.parse(event.data);
460
+ const commoneHandler = messageHandlers.get(message.event);
461
+ if (commoneHandler) {
462
+ commoneHandler.handle(message, this.send);
463
+ } else {
464
+ const eventhandler = this._eventHandlers.get(message.topic);
465
+ if (eventhandler == null ? void 0 : eventhandler.cb) {
466
+ eventhandler.cb.forEach((cb) => {
467
+ const data = cb.formatter ? cb.formatter(message) : defaultMessageFormatter(message);
468
+ cb.onMessage(data);
469
+ });
470
+ }
471
+ }
472
+ } catch (e) {
473
+ console.log("WebSocket message received:", event.data);
474
+ }
475
+ }
476
+ onClose(event) {
477
+ console.log("WebSocket connection closed:", event.reason);
478
+ }
479
+ onError(event) {
480
+ console.error("WebSocket error:", event);
481
+ this._eventHandlers.forEach((value, key) => {
482
+ if (!value.isPrivate) {
483
+ this._pendingPublicSubscribe.push([value.params, value.cb]);
484
+ this._eventHandlers.delete(key);
485
+ }
486
+ });
487
+ this.reconnectPublic();
488
+ }
489
+ onPrivateError(event) {
490
+ console.error("Private WebSocket error:", event);
491
+ this._eventHandlers.forEach((value, key) => {
492
+ if (value.isPrivate) {
493
+ this._pendingPrivateSubscribe.push([value.params, value.cb]);
494
+ this._eventHandlers.delete(key);
495
+ }
496
+ });
497
+ }
498
+ close() {
499
+ var _a;
500
+ this.publicSocket.close();
501
+ (_a = this.privateSocket) == null ? void 0 : _a.close();
502
+ }
503
+ authenticate(accountId, message) {
504
+ if (this.authenticated)
505
+ return;
506
+ if (!this.privateSocket) {
507
+ console.error("private ws not connected");
508
+ return;
509
+ }
510
+ console.log("push auth message:", message);
511
+ this.privateSocket.send(
512
+ JSON.stringify({
513
+ id: "auth",
514
+ event: "auth",
515
+ params: {
516
+ orderly_key: message.publicKey,
517
+ sign: message.signature,
518
+ timestamp: message.timestamp
519
+ }
520
+ })
521
+ );
522
+ }
523
+ privateSubscription(params, cb) {
524
+ }
525
+ subscription(params, cb) {
526
+ const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] = this.generateMessage(params);
527
+ const unsubscribe = () => {
528
+ console.log("unsubscribeMessage", unsubscribeMessage);
529
+ this.publicSocket.send(JSON.stringify(unsubscribeMessage));
530
+ };
531
+ if (this.publicSocket.readyState !== WebSocket.OPEN) {
532
+ this._pendingPublicSubscribe.push([params, cb]);
533
+ return unsubscribe;
534
+ }
535
+ const handler = this._eventHandlers.get(subscribeMessage.topic);
536
+ if (!handler) {
537
+ this._eventHandlers.set(subscribeMessage.topic, {
538
+ params,
539
+ cb: [cb]
540
+ });
541
+ } else {
542
+ handler.cb.push(cb);
543
+ }
544
+ this.publicSocket.send(JSON.stringify(subscribeMessage));
545
+ return unsubscribe;
546
+ }
547
+ generateMessage(params, unsubscribe, messageFilter) {
548
+ let subscribeMessage, unsubscribeMessage;
549
+ let filter, messageFormatter = (message) => message.data;
550
+ if (typeof params === "string") {
551
+ subscribeMessage = { event: "subscribe", topic: params };
552
+ unsubscribeMessage = { event: "unsubscribe", topic: params };
553
+ filter = (message) => message.topic === params;
554
+ } else {
555
+ subscribeMessage = params;
556
+ unsubscribeMessage = typeof unsubscribe === "function" ? unsubscribe() : unsubscribe;
557
+ filter = messageFilter || ((message) => true);
558
+ }
559
+ return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];
560
+ }
561
+ reconnectPublic() {
562
+ if (this.publicIsReconnecting)
563
+ return;
564
+ this.publicIsReconnecting = true;
565
+ console.log(`Reconnecting in ${this.reconnectInterval / 1e3} seconds...`);
566
+ this.publicReconnectTimeout = window.setTimeout(() => {
567
+ console.log("Reconnecting...");
568
+ this.createPublicSC(this.options);
569
+ }, this.reconnectInterval);
570
+ }
571
+ };
377
572
  export {
573
+ WS,
378
574
  ws_default as WebSocketClient,
379
575
  __ORDERLY_API_URL_KEY__,
380
576
  get,
@@ -1 +1 @@
1
- {"version":3,"sources":["../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"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers),\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 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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../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":["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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/net",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -17,7 +17,7 @@
17
17
  "rxjs": "^7.8.1",
18
18
  "tsup": "^7.1.0",
19
19
  "typescript": "^5.1.6",
20
- "tsconfig": "0.0.3"
20
+ "tsconfig": "0.0.4"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "rxjs": "^7.8.1"
package/src/index.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export { get, post } from "./fetch";
2
2
 
3
3
  export { default as WebSocketClient } from "./ws";
4
+ export { type NetworkId, type WSOptions } from "./ws";
4
5
  export { __ORDERLY_API_URL_KEY__ } from "./constants";
6
+
7
+ export { WS } from "./ws/ws";
package/src/types/ws.ts CHANGED
@@ -11,5 +11,5 @@ export type SendFunc = (message: any) => void;
11
11
 
12
12
  export interface MessageHandler {
13
13
  // wsSubject: WebSocketSubject<any>;
14
- handle: (message: any, send: (message: SendFunc) => void) => void;
14
+ handle: (message: any, send: (message: any) => void) => void;
15
15
  }
package/src/ws/index.ts CHANGED
@@ -209,6 +209,13 @@ class WebSocketClient {
209
209
  unsubscribe?: () => any,
210
210
  messageFilter?: (value: T) => boolean
211
211
  ) {
212
+ console.log(
213
+ "observe---------------------------",
214
+ params,
215
+ unsubscribe,
216
+ messageFilter
217
+ );
218
+
212
219
  if (isPrivate && !this.privateWsSubject) {
213
220
  throw new Error("private ws not connected");
214
221
  }
package/src/ws/ws.ts ADDED
@@ -0,0 +1,286 @@
1
+ import { WS_URL } from "./contants";
2
+ import { messageHandlers } from "./handler/handler";
3
+
4
+ export type NetworkId = "testnet" | "mainnet";
5
+
6
+ export type WSOptions = {
7
+ url?: string;
8
+ networkId?: NetworkId;
9
+ accountId?: string;
10
+
11
+ onSigntureRequest?: (accountId: string) => Promise<any>;
12
+ };
13
+
14
+ export type unsubscribe = () => void;
15
+
16
+ type WSMessageHandler = {
17
+ onMessage: (message: any) => void;
18
+ onError?: (error: any) => void;
19
+ onClose?: (event: any) => void;
20
+ onUnsubscribe: (event: any) => string;
21
+ formatter?: (message: any) => any;
22
+ };
23
+
24
+ type Topics = {
25
+ params: any;
26
+ isPrivate?: boolean;
27
+ cb: WSMessageHandler[];
28
+ };
29
+
30
+ const defaultMessageFormatter = (message: any) => message.data;
31
+
32
+ export class WS {
33
+ private publicSocket!: WebSocket;
34
+ private privateSocket?: WebSocket;
35
+
36
+ private publicIsReconnecting: boolean = false;
37
+ private privateIsReconnecting: boolean = false;
38
+
39
+ private publicReconnectTimeout?: number;
40
+ private privateReconnectTimeout?: number;
41
+
42
+ private reconnectInterval: number = 1000;
43
+
44
+ private authenticated: boolean = false;
45
+
46
+ private _pendingPrivateSubscribe: any[][] = [];
47
+ private _pendingPublicSubscribe: any[][] = [];
48
+
49
+ private _subscriptionPublicTopics: Topics[] = [];
50
+ private _subscriptionPrivateTopics: Topics[] = [];
51
+
52
+ private _eventHandlers: Map<string, Topics> = new Map();
53
+
54
+ constructor(private readonly options: WSOptions) {
55
+ this.createPublicSC(options);
56
+
57
+ if (!!options.accountId) {
58
+ this.createPrivateSC(options);
59
+ }
60
+ }
61
+
62
+ private createPublicSC(options: WSOptions) {
63
+ let url;
64
+ if (typeof options.url === "string") {
65
+ url = options.url;
66
+ } else {
67
+ url = WS_URL[options.networkId || "testnet"].public;
68
+ }
69
+ this.publicSocket = new WebSocket(`${url}${options.accountId}`);
70
+ this.publicSocket.onopen = this.onOpen.bind(this);
71
+ this.publicSocket.onmessage = this.onMessage.bind(this);
72
+ this.publicSocket.onclose = this.onClose.bind(this);
73
+ this.publicSocket.onerror = this.onError.bind(this);
74
+ }
75
+
76
+ private createPrivateSC(options: WSOptions) {
77
+ const url = WS_URL[options.networkId || "testnet"].private;
78
+ this.privateSocket = new WebSocket(`${url}${options.accountId}`);
79
+ this.privateSocket.onopen = this.onPrivateOpen.bind(this);
80
+ this.privateSocket.onmessage = this.onMessage.bind(this);
81
+ // this.privateSocket.onclose = this.onClose.bind(this);
82
+ this.privateSocket.onerror = this.onPrivateError.bind(this);
83
+ }
84
+
85
+ private onOpen(event: Event) {
86
+ console.log("WebSocket connection opened:");
87
+ console.log(this._pendingPublicSubscribe);
88
+ if (this._pendingPublicSubscribe.length > 0) {
89
+ this._pendingPublicSubscribe.forEach(([params, cb]) => {
90
+ this.subscription(params, cb);
91
+ });
92
+ this._pendingPublicSubscribe = [];
93
+ }
94
+
95
+ this.publicIsReconnecting = false;
96
+ }
97
+
98
+ private onPrivateOpen(event: Event) {
99
+ console.log("Private WebSocket connection opened:");
100
+
101
+ if (this._pendingPrivateSubscribe.length > 0) {
102
+ this._pendingPrivateSubscribe.forEach(([params, cb]) => {
103
+ this.subscription(params, cb);
104
+ });
105
+ this._pendingPrivateSubscribe = [];
106
+ }
107
+
108
+ this.privateIsReconnecting = false;
109
+ }
110
+
111
+ private onMessage(event: MessageEvent) {
112
+ try {
113
+ const message = JSON.parse(event.data);
114
+ const commoneHandler = messageHandlers.get(message.event);
115
+
116
+ if (commoneHandler) {
117
+ commoneHandler.handle(message, this.send);
118
+ } else {
119
+ const eventhandler = this._eventHandlers.get(message.topic);
120
+ if (eventhandler?.cb) {
121
+ eventhandler.cb.forEach((cb) => {
122
+ const data = cb.formatter
123
+ ? cb.formatter(message)
124
+ : defaultMessageFormatter(message);
125
+ cb.onMessage(data);
126
+ });
127
+ }
128
+ }
129
+ // console.log("WebSocket message received:", message);
130
+ } catch (e) {
131
+ console.log("WebSocket message received:", event.data);
132
+ }
133
+
134
+ // You can process the received message here
135
+ }
136
+
137
+ private onClose(event: CloseEvent) {
138
+ console.log("WebSocket connection closed:", event.reason);
139
+ }
140
+
141
+ private onError(event: Event) {
142
+ console.error("WebSocket error:", event);
143
+
144
+ this._eventHandlers.forEach((value, key) => {
145
+ if (!value.isPrivate) {
146
+ this._pendingPublicSubscribe.push([value.params, value.cb]);
147
+ this._eventHandlers.delete(key);
148
+ }
149
+ });
150
+
151
+ this.reconnectPublic();
152
+ }
153
+
154
+ private onPrivateError(event: Event) {
155
+ console.error("Private WebSocket error:", event);
156
+
157
+ this._eventHandlers.forEach((value, key) => {
158
+ if (value.isPrivate) {
159
+ this._pendingPrivateSubscribe.push([value.params, value.cb]);
160
+ this._eventHandlers.delete(key);
161
+ }
162
+ });
163
+ }
164
+
165
+ send = (message: any) => {
166
+ if (typeof message !== "string") {
167
+ message = JSON.stringify(message);
168
+ }
169
+ if (typeof message === "undefined") return;
170
+ if (this.publicSocket.readyState === WebSocket.OPEN) {
171
+ this.publicSocket.send(message);
172
+ console.log("WebSocket message sent:", message);
173
+ } else {
174
+ console.warn("WebSocket connection is not open. Cannot send message.");
175
+ }
176
+ };
177
+
178
+ close() {
179
+ this.publicSocket.close();
180
+ this.privateSocket?.close();
181
+ }
182
+
183
+ private authenticate(
184
+ accountId: string,
185
+ message: {
186
+ publicKey: string;
187
+ signature: string;
188
+ timestamp: number;
189
+ }
190
+ ) {
191
+ if (this.authenticated) return;
192
+ if (!this.privateSocket) {
193
+ console.error("private ws not connected");
194
+ return;
195
+ }
196
+
197
+ console.log("push auth message:", message);
198
+ this.privateSocket.send(
199
+ JSON.stringify({
200
+ id: "auth",
201
+ event: "auth",
202
+ params: {
203
+ orderly_key: message.publicKey,
204
+ sign: message.signature,
205
+ timestamp: message.timestamp,
206
+ },
207
+ })
208
+ );
209
+ // this.wsSubject.next({ type: "authenticate" });
210
+ // this.authenticated = true;
211
+ }
212
+
213
+ privateSubscription(params: any, cb: WSMessageHandler) {}
214
+
215
+ subscription(params: any, cb: WSMessageHandler): unsubscribe {
216
+ const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] =
217
+ this.generateMessage(params);
218
+
219
+ const unsubscribe = () => {
220
+ console.log("unsubscribeMessage", unsubscribeMessage);
221
+ this.publicSocket.send(JSON.stringify(unsubscribeMessage));
222
+ };
223
+
224
+ if (this.publicSocket.readyState !== WebSocket.OPEN) {
225
+ this._pendingPublicSubscribe.push([params, cb]);
226
+ return unsubscribe;
227
+ }
228
+
229
+ const handler = this._eventHandlers.get(subscribeMessage.topic);
230
+
231
+ if (!handler) {
232
+ this._eventHandlers.set(subscribeMessage.topic, {
233
+ params,
234
+ cb: [cb],
235
+ });
236
+ } else {
237
+ handler.cb.push(cb);
238
+ }
239
+
240
+ this.publicSocket.send(JSON.stringify(subscribeMessage));
241
+ // this._subscriptionPublicTopics.push({params, cb: [cb]});
242
+
243
+ return unsubscribe;
244
+ }
245
+
246
+ private generateMessage(
247
+ params: any,
248
+ unsubscribe?: () => any,
249
+ messageFilter?: (value: any) => boolean
250
+ ): [
251
+ Record<string, any>,
252
+ Record<string, any>,
253
+ (message: any) => boolean,
254
+ (message: any) => any
255
+ ] {
256
+ let subscribeMessage: Record<string, any>,
257
+ unsubscribeMessage: Record<string, any>;
258
+ let filter: (message: any) => boolean,
259
+ messageFormatter: (message: any) => any = (message: any) => message.data;
260
+
261
+ if (typeof params === "string") {
262
+ subscribeMessage = { event: "subscribe", topic: params };
263
+ unsubscribeMessage = { event: "unsubscribe", topic: params };
264
+ filter = (message: any) => message.topic === params;
265
+ } else {
266
+ subscribeMessage = params;
267
+ unsubscribeMessage =
268
+ typeof unsubscribe === "function" ? unsubscribe() : unsubscribe;
269
+ filter = messageFilter || ((message: any) => true);
270
+ }
271
+
272
+ return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];
273
+ }
274
+
275
+ private reconnectPublic() {
276
+ if (this.publicIsReconnecting) return;
277
+ this.publicIsReconnecting = true;
278
+ console.log(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);
279
+ this.publicReconnectTimeout = window.setTimeout(() => {
280
+ console.log("Reconnecting...");
281
+ // this.publicIsReconnecting = false;
282
+
283
+ this.createPublicSC(this.options);
284
+ }, this.reconnectInterval);
285
+ }
286
+ }