@orderly.network/net 1.0.14 → 1.0.16

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.13 build /Users/leo/orderly/orderly-web/packages/net
2
+ > @orderly.network/net@1.0.15 build /Users/leo/orderly/orderly-web/packages/net
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@ CLI Target: es6
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
12
  ESM Build start
13
- CJS dist/index.js 13.59 KB
14
- CJS dist/index.js.map 21.52 KB
13
+ CJS dist/index.js 14.82 KB
14
+ CJS dist/index.js.map 23.73 KB
15
15
  CJS ⚡️ Build success in 24ms
16
- ESM dist/index.mjs 12.55 KB
17
- ESM dist/index.mjs.map 21.28 KB
18
- ESM ⚡️ Build success in 24ms
16
+ ESM dist/index.mjs 13.77 KB
17
+ ESM dist/index.mjs.map 23.48 KB
18
+ ESM ⚡️ Build success in 25ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 1090ms
21
- DTS dist/index.d.ts 2.19 KB
22
- DTS dist/index.d.mts 2.19 KB
20
+ DTS ⚡️ Build success in 1123ms
21
+ DTS dist/index.d.ts 2.36 KB
22
+ DTS dist/index.d.mts 2.36 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @orderly.network/net
2
2
 
3
+ ## 1.0.16
4
+
5
+ ### Patch Changes
6
+
7
+ - update
8
+
9
+ ## 1.0.15
10
+
11
+ ### Patch Changes
12
+
13
+ - update
14
+
3
15
  ## 1.0.14
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -33,13 +33,17 @@ declare class WS {
33
33
  private _pendingPrivateSubscribe;
34
34
  private _pendingPublicSubscribe;
35
35
  private _eventHandlers;
36
+ private _eventPrivateHandlers;
36
37
  constructor(options: WSOptions);
37
38
  openPrivate(accountId: string): void;
39
+ closePrivate(): void;
38
40
  private createPublicSC;
39
41
  private createPrivateSC;
40
42
  private onOpen;
41
43
  private onPrivateOpen;
42
44
  private onMessage;
45
+ private onPublicMessage;
46
+ private onPrivateMessage;
43
47
  private handlePendingPrivateTopic;
44
48
  private onClose;
45
49
  private onError;
@@ -48,10 +52,12 @@ declare class WS {
48
52
  close(): void;
49
53
  set accountId(accountId: string);
50
54
  private authenticate;
51
- privateSubscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">, once?: boolean): void;
55
+ privateSubscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">): () => void;
52
56
  subscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">, once?: boolean): unsubscribe | undefined;
53
57
  onceSubscribe(params: any, callback: Omit<WSMessageHandler, "onUnsubscribe">): void;
54
58
  private unsubscribe;
59
+ private unsubscribePrivate;
60
+ private unsubscribePublic;
55
61
  private generateMessage;
56
62
  private reconnectPublic;
57
63
  }
package/dist/index.d.ts CHANGED
@@ -33,13 +33,17 @@ declare class WS {
33
33
  private _pendingPrivateSubscribe;
34
34
  private _pendingPublicSubscribe;
35
35
  private _eventHandlers;
36
+ private _eventPrivateHandlers;
36
37
  constructor(options: WSOptions);
37
38
  openPrivate(accountId: string): void;
39
+ closePrivate(): void;
38
40
  private createPublicSC;
39
41
  private createPrivateSC;
40
42
  private onOpen;
41
43
  private onPrivateOpen;
42
44
  private onMessage;
45
+ private onPublicMessage;
46
+ private onPrivateMessage;
43
47
  private handlePendingPrivateTopic;
44
48
  private onClose;
45
49
  private onError;
@@ -48,10 +52,12 @@ declare class WS {
48
52
  close(): void;
49
53
  set accountId(accountId: string);
50
54
  private authenticate;
51
- privateSubscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">, once?: boolean): void;
55
+ privateSubscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">): () => void;
52
56
  subscribe(params: any, callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">, once?: boolean): unsubscribe | undefined;
53
57
  onceSubscribe(params: any, callback: Omit<WSMessageHandler, "onUnsubscribe">): void;
54
58
  private unsubscribe;
59
+ private unsubscribePrivate;
60
+ private unsubscribePublic;
55
61
  private generateMessage;
56
62
  private reconnectPublic;
57
63
  }
package/dist/index.js CHANGED
@@ -157,16 +157,15 @@ var __ORDERLY_API_URL_KEY__ = "__ORDERLY_API_URL__";
157
157
 
158
158
  // src/ws/handler/baseHandler.ts
159
159
  var BaseHandler = class {
160
- // constructor(readonly wsSubject: WebSocketSubject<any>) {}
161
- handle(message, send) {
160
+ handle(message, webSocket) {
162
161
  throw new Error("Method not implemented.");
163
162
  }
164
163
  };
165
164
 
166
165
  // src/ws/handler/ping.ts
167
166
  var PingHandler = class extends BaseHandler {
168
- handle(_, send) {
169
- send({ event: "pong", ts: Date.now() });
167
+ handle(_, webSocket) {
168
+ webSocket.send(JSON.stringify({ event: "pong", ts: Date.now() }));
170
169
  }
171
170
  };
172
171
 
@@ -187,7 +186,9 @@ var WS = class {
187
186
  this.authenticated = false;
188
187
  this._pendingPrivateSubscribe = [];
189
188
  this._pendingPublicSubscribe = [];
189
+ // all message handlers
190
190
  this._eventHandlers = /* @__PURE__ */ new Map();
191
+ this._eventPrivateHandlers = /* @__PURE__ */ new Map();
191
192
  this.send = (message) => {
192
193
  if (typeof message !== "string") {
193
194
  message = JSON.stringify(message);
@@ -214,12 +215,19 @@ var WS = class {
214
215
  accountId
215
216
  }));
216
217
  }
218
+ closePrivate() {
219
+ var _a;
220
+ this.authenticated = false;
221
+ this._pendingPrivateSubscribe = [];
222
+ this._eventPrivateHandlers.clear();
223
+ (_a = this.privateSocket) == null ? void 0 : _a.close();
224
+ }
217
225
  createPublicSC(options) {
218
226
  this.publicSocket = new WebSocket(
219
227
  `${this.options.publicUrl}/ws/stream/${COMMON_ID}`
220
228
  );
221
229
  this.publicSocket.onopen = this.onOpen.bind(this);
222
- this.publicSocket.onmessage = this.onMessage.bind(this);
230
+ this.publicSocket.onmessage = this.onPublicMessage.bind(this);
223
231
  this.publicSocket.onclose = this.onClose.bind(this);
224
232
  this.publicSocket.onerror = this.onError.bind(this);
225
233
  }
@@ -230,7 +238,7 @@ var WS = class {
230
238
  `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`
231
239
  );
232
240
  this.privateSocket.onopen = this.onPrivateOpen.bind(this);
233
- this.privateSocket.onmessage = this.onMessage.bind(this);
241
+ this.privateSocket.onmessage = this.onPrivateMessage.bind(this);
234
242
  this.privateSocket.onerror = this.onPrivateError.bind(this);
235
243
  }
236
244
  onOpen(event) {
@@ -249,7 +257,7 @@ var WS = class {
249
257
  this.authenticate(this.options.accountId);
250
258
  this.privateIsReconnecting = false;
251
259
  }
252
- onMessage(event) {
260
+ onMessage(event, socket, handlerMap) {
253
261
  try {
254
262
  const message = JSON.parse(event.data);
255
263
  const commoneHandler = messageHandlers.get(message.event);
@@ -259,11 +267,9 @@ var WS = class {
259
267
  return;
260
268
  }
261
269
  if (commoneHandler) {
262
- commoneHandler.handle(message, this.send);
270
+ commoneHandler.handle(message, socket);
263
271
  } else {
264
- const eventhandler = this._eventHandlers.get(
265
- message.topic || message.event
266
- );
272
+ const eventhandler = handlerMap.get(message.topic || message.event);
267
273
  if (eventhandler == null ? void 0 : eventhandler.callback) {
268
274
  eventhandler.callback.forEach((cb) => {
269
275
  const data = cb.formatter ? cb.formatter(message) : defaultMessageFormatter(message);
@@ -274,9 +280,15 @@ var WS = class {
274
280
  }
275
281
  }
276
282
  } catch (e) {
277
- console.log("WebSocket message received:", event.data);
283
+ console.log("WebSocket message received:", e, event.data);
278
284
  }
279
285
  }
286
+ onPublicMessage(event) {
287
+ this.onMessage(event, this.publicSocket, this._eventHandlers);
288
+ }
289
+ onPrivateMessage(event) {
290
+ this.onMessage(event, this.privateSocket, this._eventPrivateHandlers);
291
+ }
280
292
  handlePendingPrivateTopic() {
281
293
  if (this._pendingPrivateSubscribe.length > 0) {
282
294
  this._pendingPrivateSubscribe.forEach(([params, cb]) => {
@@ -324,7 +336,6 @@ var WS = class {
324
336
  return;
325
337
  }
326
338
  const message = yield (_b = (_a = this.options).onSigntureRequest) == null ? void 0 : _b.call(_a, accountId);
327
- console.log("push auth message:", message);
328
339
  this.privateSocket.send(
329
340
  JSON.stringify({
330
341
  id: "auth",
@@ -338,13 +349,35 @@ var WS = class {
338
349
  );
339
350
  });
340
351
  }
341
- privateSubscribe(params, callback, once) {
342
- var _a, _b;
343
- console.log("\u{1F449}", params, callback, (_a = this.privateSocket) == null ? void 0 : _a.readyState);
344
- if (((_b = this.privateSocket) == null ? void 0 : _b.readyState) !== WebSocket.OPEN) {
352
+ privateSubscribe(params, callback) {
353
+ var _a;
354
+ const [subscribeMessage, onUnsubscribe] = this.generateMessage(
355
+ params,
356
+ callback.onUnsubscribe
357
+ );
358
+ if (((_a = this.privateSocket) == null ? void 0 : _a.readyState) !== WebSocket.OPEN) {
345
359
  this._pendingPrivateSubscribe.push([params, callback]);
346
- return;
360
+ return () => {
361
+ this.unsubscribePrivate(subscribeMessage);
362
+ };
347
363
  }
364
+ const topic = subscribeMessage.topic || subscribeMessage.event;
365
+ const handler = this._eventPrivateHandlers.get(topic);
366
+ const callbacks = __spreadProps(__spreadValues({}, callback), {
367
+ onUnsubscribe
368
+ });
369
+ if (!handler) {
370
+ this._eventPrivateHandlers.set(topic, {
371
+ params,
372
+ callback: [callbacks]
373
+ });
374
+ } else {
375
+ handler.callback.push(callbacks);
376
+ }
377
+ this.privateSocket.send(JSON.stringify(subscribeMessage));
378
+ return () => {
379
+ this.unsubscribePrivate(subscribeMessage);
380
+ };
348
381
  }
349
382
  subscribe(params, callback, once) {
350
383
  console.log("\u{1F449}", params, callback, this.publicSocket.readyState);
@@ -356,7 +389,7 @@ var WS = class {
356
389
  this._pendingPublicSubscribe.push([params, callback]);
357
390
  if (!once) {
358
391
  return () => {
359
- this.unsubscribe(subscribeMessage);
392
+ this.unsubscribePublic(subscribeMessage);
360
393
  };
361
394
  }
362
395
  return;
@@ -377,7 +410,7 @@ var WS = class {
377
410
  this.publicSocket.send(JSON.stringify(subscribeMessage));
378
411
  if (!once) {
379
412
  return () => {
380
- this.unsubscribe(subscribeMessage);
413
+ this.unsubscribePublic(subscribeMessage);
381
414
  };
382
415
  }
383
416
  }
@@ -387,23 +420,29 @@ var WS = class {
387
420
  onceSubscribe(params, callback) {
388
421
  this.subscribe(params, callback, true);
389
422
  }
390
- unsubscribe(parmas) {
423
+ unsubscribe(parmas, webSocket, handlerMap) {
391
424
  const topic = parmas.topic || parmas.event;
392
- const handler = this._eventHandlers.get(topic);
425
+ const handler = handlerMap.get(topic);
393
426
  console.log("\u{1F91C} unsubscribe", parmas, topic, handler);
394
427
  if (!!handler && Array.isArray(handler == null ? void 0 : handler.callback)) {
395
428
  if (handler.callback.length === 1) {
396
429
  const unsubscribeMessage = handler.callback[0].onUnsubscribe(topic);
397
430
  console.log("unsubscribeMessage", unsubscribeMessage);
398
- this.publicSocket.send(JSON.stringify(unsubscribeMessage));
399
- this._eventHandlers.delete(topic);
431
+ webSocket.send(JSON.stringify(unsubscribeMessage));
432
+ handlerMap.delete(topic);
400
433
  } else {
401
- this._eventHandlers.set(topic, __spreadProps(__spreadValues({}, handler), {
434
+ handlerMap.set(topic, __spreadProps(__spreadValues({}, handler), {
402
435
  callback: handler.callback.slice(0, -1)
403
436
  }));
404
437
  }
405
438
  }
406
439
  }
440
+ unsubscribePrivate(parmas) {
441
+ this.unsubscribe(parmas, this.privateSocket, this._eventPrivateHandlers);
442
+ }
443
+ unsubscribePublic(parmas) {
444
+ this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);
445
+ }
407
446
  generateMessage(params, onUnsubscribe) {
408
447
  let subscribeMessage;
409
448
  if (typeof params === "string") {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del, put, mutate } from \"./fetch\";\n\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\n\nexport { WS } from \"./ws/ws\";\n","async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n if (res.success) {\n return res;\n } else {\n throw new Error(res);\n }\n }\n\n const error = await response.json();\n\n throw new Error(error.message || error.code || error);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler, 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","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n private _eventHandlers: Map<string, Topics> = new Map();\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n private createPublicSC(options: WSOptions) {\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.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 console.log(\"to open private webSocket ---->>>>\");\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onMessage.bind(this);\n // this.privateSocket.onclose = this.onClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"WebSocket connection opened:\");\n console.log(this._pendingPublicSubscribe);\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb]) => {\n this.subscribe(params, cb);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n }\n\n private onPrivateOpen(event: Event) {\n console.log(\"Private WebSocket connection opened:\");\n\n //auth\n\n this.authenticate(this.options.accountId!);\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 (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, this.send);\n } else {\n const eventhandler = this._eventHandlers.get(\n message.topic || message.event\n );\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n }\n }\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", event.data);\n }\n\n // You can process the received message here\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onClose(event: CloseEvent) {\n console.log(\"WebSocket connection closed:\", event.reason);\n }\n\n private onError(event: Event) {\n console.error(\"WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (!value.isPrivate) {\n this._pendingPublicSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n\n this.reconnectPublic();\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (value.isPrivate) {\n this._pendingPrivateSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n // console.log(\"WebSocket message sent:\", message);\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n console.log(\"push auth message:\", message);\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ) {\n console.log(\"👉\", params, callback, this.privateSocket?.readyState);\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return;\n }\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n console.log(\"👉\", params, callback, this.publicSocket.readyState);\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback]);\n\n if (!once) {\n return () => {\n this.unsubscribe(subscribeMessage);\n };\n }\n return;\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribe(subscribeMessage);\n };\n }\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(parmas: MessageParams) {\n const topic = parmas.topic || parmas.event;\n const handler = this._eventHandlers.get(topic);\n console.log(\"🤜 unsubscribe\", parmas, topic, handler);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n console.log(\"unsubscribeMessage\", unsubscribeMessage);\n this.publicSocket.send(JSON.stringify(unsubscribeMessage));\n this._eventHandlers.delete(topic);\n //post unsubscribe message\n } else {\n this._eventHandlers.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n console.log(\"👉\", params);\n\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);\n window.setTimeout(() => {\n console.log(\"Reconnecting...\");\n // this.publicIsReconnecting = false;\n\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del, put, mutate } from \"./fetch\";\n\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\n\nexport { WS } from \"./ws/ws\";\n","async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n if (res.success) {\n return res;\n } else {\n throw new Error(res);\n }\n }\n\n const error = await response.json();\n\n throw new Error(error.message || error.code || error);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ event: \"pong\", ts: Date.now() }));\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this.publicSocket.onclose = this.onClose.bind(this);\n this.publicSocket.onerror = this.onError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n console.log(\"to open private webSocket ---->>>>\");\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n // this.privateSocket.onclose = this.onClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"WebSocket connection opened:\");\n console.log(this._pendingPublicSubscribe);\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb]) => {\n this.subscribe(params, cb);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n }\n\n private onPrivateOpen(event: Event) {\n console.log(\"Private WebSocket connection opened:\");\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const eventhandler = handlerMap.get(message.topic || message.event);\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n }\n }\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", e, event.data);\n }\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this.publicSocket, this._eventHandlers);\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onClose(event: CloseEvent) {\n console.log(\"WebSocket connection closed:\", event.reason);\n }\n\n private onError(event: Event) {\n console.error(\"WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (!value.isPrivate) {\n this._pendingPublicSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n\n this.reconnectPublic();\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (value.isPrivate) {\n this._pendingPrivateSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n // console.log(\"WebSocket message sent:\", message);\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n console.log(\"👉\", params, callback, this.publicSocket.readyState);\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n console.log(\"🤜 unsubscribe\", parmas, topic, handler);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n console.log(\"unsubscribeMessage\", unsubscribeMessage);\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n handlerMap.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n console.log(\"👉\", params);\n\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);\n window.setTimeout(() => {\n console.log(\"Reconnecting...\");\n // this.publicIsReconnecting = false;\n\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -128,16 +128,15 @@ var __ORDERLY_API_URL_KEY__ = "__ORDERLY_API_URL__";
128
128
 
129
129
  // src/ws/handler/baseHandler.ts
130
130
  var BaseHandler = class {
131
- // constructor(readonly wsSubject: WebSocketSubject<any>) {}
132
- handle(message, send) {
131
+ handle(message, webSocket) {
133
132
  throw new Error("Method not implemented.");
134
133
  }
135
134
  };
136
135
 
137
136
  // src/ws/handler/ping.ts
138
137
  var PingHandler = class extends BaseHandler {
139
- handle(_, send) {
140
- send({ event: "pong", ts: Date.now() });
138
+ handle(_, webSocket) {
139
+ webSocket.send(JSON.stringify({ event: "pong", ts: Date.now() }));
141
140
  }
142
141
  };
143
142
 
@@ -158,7 +157,9 @@ var WS = class {
158
157
  this.authenticated = false;
159
158
  this._pendingPrivateSubscribe = [];
160
159
  this._pendingPublicSubscribe = [];
160
+ // all message handlers
161
161
  this._eventHandlers = /* @__PURE__ */ new Map();
162
+ this._eventPrivateHandlers = /* @__PURE__ */ new Map();
162
163
  this.send = (message) => {
163
164
  if (typeof message !== "string") {
164
165
  message = JSON.stringify(message);
@@ -185,12 +186,19 @@ var WS = class {
185
186
  accountId
186
187
  }));
187
188
  }
189
+ closePrivate() {
190
+ var _a;
191
+ this.authenticated = false;
192
+ this._pendingPrivateSubscribe = [];
193
+ this._eventPrivateHandlers.clear();
194
+ (_a = this.privateSocket) == null ? void 0 : _a.close();
195
+ }
188
196
  createPublicSC(options) {
189
197
  this.publicSocket = new WebSocket(
190
198
  `${this.options.publicUrl}/ws/stream/${COMMON_ID}`
191
199
  );
192
200
  this.publicSocket.onopen = this.onOpen.bind(this);
193
- this.publicSocket.onmessage = this.onMessage.bind(this);
201
+ this.publicSocket.onmessage = this.onPublicMessage.bind(this);
194
202
  this.publicSocket.onclose = this.onClose.bind(this);
195
203
  this.publicSocket.onerror = this.onError.bind(this);
196
204
  }
@@ -201,7 +209,7 @@ var WS = class {
201
209
  `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`
202
210
  );
203
211
  this.privateSocket.onopen = this.onPrivateOpen.bind(this);
204
- this.privateSocket.onmessage = this.onMessage.bind(this);
212
+ this.privateSocket.onmessage = this.onPrivateMessage.bind(this);
205
213
  this.privateSocket.onerror = this.onPrivateError.bind(this);
206
214
  }
207
215
  onOpen(event) {
@@ -220,7 +228,7 @@ var WS = class {
220
228
  this.authenticate(this.options.accountId);
221
229
  this.privateIsReconnecting = false;
222
230
  }
223
- onMessage(event) {
231
+ onMessage(event, socket, handlerMap) {
224
232
  try {
225
233
  const message = JSON.parse(event.data);
226
234
  const commoneHandler = messageHandlers.get(message.event);
@@ -230,11 +238,9 @@ var WS = class {
230
238
  return;
231
239
  }
232
240
  if (commoneHandler) {
233
- commoneHandler.handle(message, this.send);
241
+ commoneHandler.handle(message, socket);
234
242
  } else {
235
- const eventhandler = this._eventHandlers.get(
236
- message.topic || message.event
237
- );
243
+ const eventhandler = handlerMap.get(message.topic || message.event);
238
244
  if (eventhandler == null ? void 0 : eventhandler.callback) {
239
245
  eventhandler.callback.forEach((cb) => {
240
246
  const data = cb.formatter ? cb.formatter(message) : defaultMessageFormatter(message);
@@ -245,9 +251,15 @@ var WS = class {
245
251
  }
246
252
  }
247
253
  } catch (e) {
248
- console.log("WebSocket message received:", event.data);
254
+ console.log("WebSocket message received:", e, event.data);
249
255
  }
250
256
  }
257
+ onPublicMessage(event) {
258
+ this.onMessage(event, this.publicSocket, this._eventHandlers);
259
+ }
260
+ onPrivateMessage(event) {
261
+ this.onMessage(event, this.privateSocket, this._eventPrivateHandlers);
262
+ }
251
263
  handlePendingPrivateTopic() {
252
264
  if (this._pendingPrivateSubscribe.length > 0) {
253
265
  this._pendingPrivateSubscribe.forEach(([params, cb]) => {
@@ -295,7 +307,6 @@ var WS = class {
295
307
  return;
296
308
  }
297
309
  const message = yield (_b = (_a = this.options).onSigntureRequest) == null ? void 0 : _b.call(_a, accountId);
298
- console.log("push auth message:", message);
299
310
  this.privateSocket.send(
300
311
  JSON.stringify({
301
312
  id: "auth",
@@ -309,13 +320,35 @@ var WS = class {
309
320
  );
310
321
  });
311
322
  }
312
- privateSubscribe(params, callback, once) {
313
- var _a, _b;
314
- console.log("\u{1F449}", params, callback, (_a = this.privateSocket) == null ? void 0 : _a.readyState);
315
- if (((_b = this.privateSocket) == null ? void 0 : _b.readyState) !== WebSocket.OPEN) {
323
+ privateSubscribe(params, callback) {
324
+ var _a;
325
+ const [subscribeMessage, onUnsubscribe] = this.generateMessage(
326
+ params,
327
+ callback.onUnsubscribe
328
+ );
329
+ if (((_a = this.privateSocket) == null ? void 0 : _a.readyState) !== WebSocket.OPEN) {
316
330
  this._pendingPrivateSubscribe.push([params, callback]);
317
- return;
331
+ return () => {
332
+ this.unsubscribePrivate(subscribeMessage);
333
+ };
318
334
  }
335
+ const topic = subscribeMessage.topic || subscribeMessage.event;
336
+ const handler = this._eventPrivateHandlers.get(topic);
337
+ const callbacks = __spreadProps(__spreadValues({}, callback), {
338
+ onUnsubscribe
339
+ });
340
+ if (!handler) {
341
+ this._eventPrivateHandlers.set(topic, {
342
+ params,
343
+ callback: [callbacks]
344
+ });
345
+ } else {
346
+ handler.callback.push(callbacks);
347
+ }
348
+ this.privateSocket.send(JSON.stringify(subscribeMessage));
349
+ return () => {
350
+ this.unsubscribePrivate(subscribeMessage);
351
+ };
319
352
  }
320
353
  subscribe(params, callback, once) {
321
354
  console.log("\u{1F449}", params, callback, this.publicSocket.readyState);
@@ -327,7 +360,7 @@ var WS = class {
327
360
  this._pendingPublicSubscribe.push([params, callback]);
328
361
  if (!once) {
329
362
  return () => {
330
- this.unsubscribe(subscribeMessage);
363
+ this.unsubscribePublic(subscribeMessage);
331
364
  };
332
365
  }
333
366
  return;
@@ -348,7 +381,7 @@ var WS = class {
348
381
  this.publicSocket.send(JSON.stringify(subscribeMessage));
349
382
  if (!once) {
350
383
  return () => {
351
- this.unsubscribe(subscribeMessage);
384
+ this.unsubscribePublic(subscribeMessage);
352
385
  };
353
386
  }
354
387
  }
@@ -358,23 +391,29 @@ var WS = class {
358
391
  onceSubscribe(params, callback) {
359
392
  this.subscribe(params, callback, true);
360
393
  }
361
- unsubscribe(parmas) {
394
+ unsubscribe(parmas, webSocket, handlerMap) {
362
395
  const topic = parmas.topic || parmas.event;
363
- const handler = this._eventHandlers.get(topic);
396
+ const handler = handlerMap.get(topic);
364
397
  console.log("\u{1F91C} unsubscribe", parmas, topic, handler);
365
398
  if (!!handler && Array.isArray(handler == null ? void 0 : handler.callback)) {
366
399
  if (handler.callback.length === 1) {
367
400
  const unsubscribeMessage = handler.callback[0].onUnsubscribe(topic);
368
401
  console.log("unsubscribeMessage", unsubscribeMessage);
369
- this.publicSocket.send(JSON.stringify(unsubscribeMessage));
370
- this._eventHandlers.delete(topic);
402
+ webSocket.send(JSON.stringify(unsubscribeMessage));
403
+ handlerMap.delete(topic);
371
404
  } else {
372
- this._eventHandlers.set(topic, __spreadProps(__spreadValues({}, handler), {
405
+ handlerMap.set(topic, __spreadProps(__spreadValues({}, handler), {
373
406
  callback: handler.callback.slice(0, -1)
374
407
  }));
375
408
  }
376
409
  }
377
410
  }
411
+ unsubscribePrivate(parmas) {
412
+ this.unsubscribe(parmas, this.privateSocket, this._eventPrivateHandlers);
413
+ }
414
+ unsubscribePublic(parmas) {
415
+ this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);
416
+ }
378
417
  generateMessage(params, onUnsubscribe) {
379
418
  let subscribeMessage;
380
419
  if (typeof params === "string") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n if (res.success) {\n return res;\n } else {\n throw new Error(res);\n }\n }\n\n const error = await response.json();\n\n throw new Error(error.message || error.code || error);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler, 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","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n private _eventHandlers: Map<string, Topics> = new Map();\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n private createPublicSC(options: WSOptions) {\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.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 console.log(\"to open private webSocket ---->>>>\");\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onMessage.bind(this);\n // this.privateSocket.onclose = this.onClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"WebSocket connection opened:\");\n console.log(this._pendingPublicSubscribe);\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb]) => {\n this.subscribe(params, cb);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n }\n\n private onPrivateOpen(event: Event) {\n console.log(\"Private WebSocket connection opened:\");\n\n //auth\n\n this.authenticate(this.options.accountId!);\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 (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, this.send);\n } else {\n const eventhandler = this._eventHandlers.get(\n message.topic || message.event\n );\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n }\n }\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", event.data);\n }\n\n // You can process the received message here\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onClose(event: CloseEvent) {\n console.log(\"WebSocket connection closed:\", event.reason);\n }\n\n private onError(event: Event) {\n console.error(\"WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (!value.isPrivate) {\n this._pendingPublicSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n\n this.reconnectPublic();\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (value.isPrivate) {\n this._pendingPrivateSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n // console.log(\"WebSocket message sent:\", message);\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n console.log(\"push auth message:\", message);\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ) {\n console.log(\"👉\", params, callback, this.privateSocket?.readyState);\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return;\n }\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n console.log(\"👉\", params, callback, this.publicSocket.readyState);\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback]);\n\n if (!once) {\n return () => {\n this.unsubscribe(subscribeMessage);\n };\n }\n return;\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribe(subscribeMessage);\n };\n }\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(parmas: MessageParams) {\n const topic = parmas.topic || parmas.event;\n const handler = this._eventHandlers.get(topic);\n console.log(\"🤜 unsubscribe\", parmas, topic, handler);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n console.log(\"unsubscribeMessage\", unsubscribeMessage);\n this.publicSocket.send(JSON.stringify(unsubscribeMessage));\n this._eventHandlers.delete(topic);\n //post unsubscribe message\n } else {\n this._eventHandlers.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n console.log(\"👉\", params);\n\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);\n window.setTimeout(() => {\n console.log(\"Reconnecting...\");\n // this.publicIsReconnecting = false;\n\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n if (res.success) {\n return res;\n } else {\n throw new Error(res);\n }\n }\n\n const error = await response.json();\n\n throw new Error(error.message || error.code || error);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ event: \"pong\", ts: Date.now() }));\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nexport class WS {\n private publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n this.publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this.publicSocket.onopen = this.onOpen.bind(this);\n this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this.publicSocket.onclose = this.onClose.bind(this);\n this.publicSocket.onerror = this.onError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n console.log(\"to open private webSocket ---->>>>\");\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n // this.privateSocket.onclose = this.onClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n console.log(\"WebSocket connection opened:\");\n console.log(this._pendingPublicSubscribe);\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb]) => {\n this.subscribe(params, cb);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n }\n\n private onPrivateOpen(event: Event) {\n console.log(\"Private WebSocket connection opened:\");\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const eventhandler = handlerMap.get(message.topic || message.event);\n if (eventhandler?.callback) {\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n }\n }\n // console.log(\"WebSocket message received:\", message);\n } catch (e) {\n console.log(\"WebSocket message received:\", e, event.data);\n }\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this.publicSocket, this._eventHandlers);\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onClose(event: CloseEvent) {\n console.log(\"WebSocket connection closed:\", event.reason);\n }\n\n private onError(event: Event) {\n console.error(\"WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (!value.isPrivate) {\n this._pendingPublicSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n\n this.reconnectPublic();\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n\n this._eventHandlers.forEach((value, key) => {\n if (value.isPrivate) {\n this._pendingPrivateSubscribe.push([value.params, value.callback]);\n this._eventHandlers.delete(key);\n }\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this.publicSocket.readyState === WebSocket.OPEN) {\n this.publicSocket.send(message);\n // console.log(\"WebSocket message sent:\", message);\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this.publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean\n ): unsubscribe | undefined {\n console.log(\"👉\", params, callback, this.publicSocket.readyState);\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n } else {\n handler.callback.push(callbacks);\n }\n\n this.publicSocket.send(JSON.stringify(subscribeMessage));\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n console.log(\"🤜 unsubscribe\", parmas, topic, handler);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n console.log(\"unsubscribeMessage\", unsubscribeMessage);\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n handlerMap.set(topic, {\n ...handler,\n callback: handler.callback.slice(0, -1),\n });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n console.log(\"👉\", params);\n\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [subscribeMessage, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n console.log(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);\n window.setTimeout(() => {\n console.log(\"Reconnecting...\");\n // this.publicIsReconnecting = false;\n\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAe,QAAQ,KAAa,SAAsB;AAAA;AAExD,QAAI,CAAC,IAAI,WAAW,MAAM,GAAG;AAC3B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,UAAM,cAAc,IAAI,IAAI,GAAG;AAC/B,UAAM,WAAW,MAAM,MAAM,aAAa,iCACrC,UADqC;AAAA;AAAA;AAAA,MAIxC,SAAS,eAAe,QAAQ,SAAS,QAAQ,MAAM;AAAA,IACzD,EAAC;AAED,QAAI,SAAS,IAAI;AACf,YAAM,MAAM,MAAM,SAAS,KAAK;AAChC,UAAI,IAAI,SAAS;AACf,eAAO;AAAA,MACT,OAAO;AACL,cAAM,IAAI,MAAM,GAAG;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,SAAS,KAAK;AAElC,UAAM,IAAI,MAAM,MAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,EACtD;AAAA;AAEA,SAAS,eACP,UAAuB,CAAC,GACxB,QACa;AAEb,QAAM,WAAW,IAAI,QAAQ,OAAO;AAGpC,MAAI,CAAC,SAAS,IAAI,cAAc,GAAG;AACjC,QAAI,WAAW,UAAU;AACvB,eAAS,OAAO,gBAAgB,gCAAgC;AAAA,IAClE,OAAO;AACL,eAAS,OAAO,gBAAgB,mCAAmC;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAe,IACb,KACA,SACA,WACY;AAAA;AACZ,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,OACL,QACJ;AAED,QAAI,IAAI,SAAS;AACf,UAAI,OAAO,cAAc,YAAY;AACnC,eAAO,UAAU,IAAI,IAAI;AAAA,MAC3B;AAEA,UAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,CAAC,GAAG;AACnC,eAAO,IAAI,KAAK,MAAM;AAAA,MACxB;AACA,aAAO,IAAI;AAAA,IACb;AACA,UAAM,IAAI,MAAM,IAAI,OAAO;AAAA,EAC7B;AAAA;AACA,SAAe,KACb,KACA,MACA,SACc;AAAA;AACd,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,OACtB,QACJ;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,IACb,KACA,MACA,SACc;AAAA;AACd,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,OACtB,QACJ;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,IACb,KACA,SACc;AAAA;AACd,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,OACL,QACJ;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,OAAO,KAAa,MAAmB;AAAA;AACpD,UAAM,MAAM,MAAM,QAAQ,KAAK,IAAI;AAEnC,WAAO;AAAA,EACT;AAAA;;;AChHO,IAAM,0BAAkC;;;ACE/C,IAAqB,cAArB,MAA2D;AAAA,EACzD,OAAO,SAAc,WAAsB;AACzC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACJA,IAAqB,cAArB,cAAyC,YAAY;AAAA,EACnD,OAAO,GAAQ,WAAsB;AACnC,cAAU,KAAK,KAAK,UAAU,EAAE,OAAO,QAAQ,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,EAClE;AACF;;;ACQO,IAAM,kBAAkB,oBAAI,IAAiC;AAAA,EAClE,CAAC,QAAQ,IAAI,YAAY,CAAC;AAC5B,CAAC;;;ACqBD,IAAM,0BAA0B,CAAC,YAAiB,QAAQ;AAC1D,IAAM,YAAY;AAEX,IAAM,KAAN,MAAS;AAAA,EAkBd,YAAoB,SAAoB;AAApB;AAdpB,SAAQ,uBAAgC;AACxC,SAAQ,wBAAiC;AAEzC,SAAQ,oBAA4B;AAEpC,SAAQ,gBAAyB;AAEjC,SAAQ,2BAAoC,CAAC;AAC7C,SAAQ,0BAAmC,CAAC;AAG5C;AAAA,SAAQ,iBAAsC,oBAAI,IAAI;AACtD,SAAQ,wBAA6C,oBAAI,IAAI;AA6J7D,gBAAO,CAAC,YAAiB;AACvB,UAAI,OAAO,YAAY,UAAU;AAC/B,kBAAU,KAAK,UAAU,OAAO;AAAA,MAClC;AACA,UAAI,OAAO,YAAY;AAAa;AACpC,UAAI,KAAK,aAAa,eAAe,UAAU,MAAM;AACnD,aAAK,aAAa,KAAK,OAAO;AAAA,MAEhC,OAAO;AACL,gBAAQ,KAAK,wDAAwD;AAAA,MACvE;AAAA,IACF;AArKE,SAAK,eAAe,OAAO;AAE3B,QAAI,CAAC,CAAC,QAAQ,WAAW;AACvB,WAAK,gBAAgB,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA,EAEO,YAAY,WAAmB;AAlExC;AAmEI,UAAI,UAAK,kBAAL,mBAAoB,gBAAe,UAAU,MAAM;AACrD;AAAA,IACF;AACA,SAAK,gBAAgB,iCAChB,KAAK,UADW;AAAA,MAEnB;AAAA,IACF,EAAC;AAAA,EACH;AAAA,EAEO,eAAe;AA5ExB;AA6EI,SAAK,gBAAgB;AACrB,SAAK,2BAA2B,CAAC;AAEjC,SAAK,sBAAsB,MAAM;AAEjC,eAAK,kBAAL,mBAAoB;AAAA,EACtB;AAAA,EAEQ,eAAe,SAAoB;AACzC,SAAK,eAAe,IAAI;AAAA,MACtB,GAAG,KAAK,QAAQ,SAAS,cAAc,SAAS;AAAA,IAClD;AACA,SAAK,aAAa,SAAS,KAAK,OAAO,KAAK,IAAI;AAChD,SAAK,aAAa,YAAY,KAAK,gBAAgB,KAAK,IAAI;AAC5D,SAAK,aAAa,UAAU,KAAK,QAAQ,KAAK,IAAI;AAClD,SAAK,aAAa,UAAU,KAAK,QAAQ,KAAK,IAAI;AAAA,EACpD;AAAA,EAEQ,gBAAgB,SAAoB;AAC1C,YAAQ,IAAI,oCAAoC;AAEhD,SAAK,UAAU;AAEf,SAAK,gBAAgB,IAAI;AAAA,MACvB,GAAG,KAAK,QAAQ,UAAU,yBAAyB,QAAQ,SAAS;AAAA,IACtE;AACA,SAAK,cAAc,SAAS,KAAK,cAAc,KAAK,IAAI;AACxD,SAAK,cAAc,YAAY,KAAK,iBAAiB,KAAK,IAAI;AAE9D,SAAK,cAAc,UAAU,KAAK,eAAe,KAAK,IAAI;AAAA,EAC5D;AAAA,EAEQ,OAAO,OAAc;AAC3B,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ,IAAI,KAAK,uBAAuB;AACxC,QAAI,KAAK,wBAAwB,SAAS,GAAG;AAC3C,WAAK,wBAAwB,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM;AACrD,aAAK,UAAU,QAAQ,EAAE;AAAA,MAC3B,CAAC;AACD,WAAK,0BAA0B,CAAC;AAAA,IAClC;AAEA,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,cAAc,OAAc;AAClC,YAAQ,IAAI,sCAAsC;AAElD,SAAK,aAAa,KAAK,QAAQ,SAAU;AACzC,SAAK,wBAAwB;AAAA,EAC/B;AAAA,EAEQ,UACN,OACA,QACA,YACA;AACA,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,MAAM,IAAI;AACrC,YAAM,iBAAiB,gBAAgB,IAAI,QAAQ,KAAK;AAExD,UAAI,QAAQ,UAAU,UAAU,QAAQ,SAAS;AAC/C,aAAK,gBAAgB;AACrB,aAAK,0BAA0B;AAC/B;AAAA,MACF;AAEA,UAAI,gBAAgB;AAClB,uBAAe,OAAO,SAAS,MAAM;AAAA,MACvC,OAAO;AACL,cAAM,eAAe,WAAW,IAAI,QAAQ,SAAS,QAAQ,KAAK;AAClE,YAAI,6CAAc,UAAU;AAC1B,uBAAa,SAAS,QAAQ,CAAC,OAAO;AACpC,kBAAM,OAAO,GAAG,YACZ,GAAG,UAAU,OAAO,IACpB,wBAAwB,OAAO;AAEnC,gBAAI,MAAM;AACR,iBAAG,UAAU,IAAI;AAAA,YACnB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IAEF,SAAS,GAAG;AACV,cAAQ,IAAI,+BAA+B,GAAG,MAAM,IAAI;AAAA,IAC1D;AAAA,EAGF;AAAA,EAEQ,gBAAgB,OAAqB;AAC3C,SAAK,UAAU,OAAO,KAAK,cAAc,KAAK,cAAc;AAAA,EAC9D;AAAA,EAEQ,iBAAiB,OAAqB;AAC5C,SAAK,UAAU,OAAO,KAAK,eAAgB,KAAK,qBAAqB;AAAA,EACvE;AAAA,EAEQ,4BAA4B;AAClC,QAAI,KAAK,yBAAyB,SAAS,GAAG;AAC5C,WAAK,yBAAyB,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM;AACtD,aAAK,iBAAiB,QAAQ,EAAE;AAAA,MAClC,CAAC;AACD,WAAK,2BAA2B,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAmB;AACjC,YAAQ,IAAI,gCAAgC,MAAM,MAAM;AAAA,EAC1D;AAAA,EAEQ,QAAQ,OAAc;AAC5B,YAAQ,MAAM,oBAAoB,KAAK;AAEvC,SAAK,eAAe,QAAQ,CAAC,OAAO,QAAQ;AAC1C,UAAI,CAAC,MAAM,WAAW;AACpB,aAAK,wBAAwB,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAChE,aAAK,eAAe,OAAO,GAAG;AAAA,MAChC;AAAA,IACF,CAAC;AAED,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,eAAe,OAAc;AACnC,YAAQ,MAAM,4BAA4B,KAAK;AAE/C,SAAK,eAAe,QAAQ,CAAC,OAAO,QAAQ;AAC1C,UAAI,MAAM,WAAW;AACnB,aAAK,yBAAyB,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,CAAC;AACjE,aAAK,eAAe,OAAO,GAAG;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAeA,QAAQ;AAlOV;AAmOI,SAAK,aAAa,MAAM;AACxB,eAAK,kBAAL,mBAAoB;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU,WAAmB;AAAA,EAAC;AAAA,EAEpB,aAAa,WAAmB;AAAA;AAzOhD;AA0OI,UAAI,KAAK;AAAe;AACxB,UAAI,CAAC,KAAK,eAAe;AACvB,gBAAQ,MAAM,0BAA0B;AACxC;AAAA,MACF;AAEA,YAAM,UAAU,OAAM,gBAAK,SAAQ,sBAAb,4BAAiC;AAEvD,WAAK,cAAc;AAAA,QACjB,KAAK,UAAU;AAAA,UACb,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,aAAa,QAAQ;AAAA,YACrB,MAAM,QAAQ;AAAA,YACd,WAAW,QAAQ;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IAGF;AAAA;AAAA,EAEA,iBACE,QACA,UACA;AApQJ;AAqQI,UAAM,CAAC,kBAAkB,aAAa,IAAI,KAAK;AAAA,MAC7C;AAAA,MACC,SAA8B;AAAA,IACjC;AAEA,UAAI,UAAK,kBAAL,mBAAoB,gBAAe,UAAU,MAAM;AACrD,WAAK,yBAAyB,KAAK,CAAC,QAAQ,QAAQ,CAAC;AACrD,aAAO,MAAM;AACX,aAAK,mBAAmB,gBAAgB;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,QAAQ,iBAAiB,SAAS,iBAAiB;AAEzD,UAAM,UAAU,KAAK,sBAAsB,IAAI,KAAK;AACpD,UAAM,YAAY,iCACb,WADa;AAAA,MAEhB;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ,WAAK,sBAAsB,IAAI,OAAO;AAAA,QACpC;AAAA,QACA,UAAU,CAAC,SAAS;AAAA,MACtB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,SAAS,KAAK,SAAS;AAAA,IACjC;AAEA,SAAK,cAAc,KAAK,KAAK,UAAU,gBAAgB,CAAC;AAExD,WAAO,MAAM;AACX,WAAK,mBAAmB,gBAAgB;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,UACE,QACA,UACA,MACyB;AACzB,YAAQ,IAAI,aAAM,QAAQ,UAAU,KAAK,aAAa,UAAU;AAEhE,UAAM,CAAC,kBAAkB,aAAa,IAAI,KAAK;AAAA,MAC7C;AAAA,MACC,SAA8B;AAAA,IACjC;AAEA,QAAI,KAAK,aAAa,eAAe,UAAU,MAAM;AACnD,WAAK,wBAAwB,KAAK,CAAC,QAAQ,QAAQ,CAAC;AAEpD,UAAI,CAAC,MAAM;AACT,eAAO,MAAM;AACX,eAAK,kBAAkB,gBAAgB;AAAA,QACzC;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,iBAAiB,SAAS,iBAAiB;AAEzD,UAAM,UAAU,KAAK,eAAe,IAAI,KAAK;AAC7C,UAAM,YAAY,iCACb,WADa;AAAA,MAEhB;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ,WAAK,eAAe,IAAI,OAAO;AAAA,QAC7B;AAAA,QACA,UAAU,CAAC,SAAS;AAAA,MACtB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,SAAS,KAAK,SAAS;AAAA,IACjC;AAEA,SAAK,aAAa,KAAK,KAAK,UAAU,gBAAgB,CAAC;AAGvD,QAAI,CAAC,MAAM;AACT,aAAO,MAAM;AACX,aAAK,kBAAkB,gBAAgB;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,cACE,QACA,UACA;AACA,SAAK,UAAU,QAAQ,UAAU,IAAI;AAAA,EACvC;AAAA,EAEQ,YACN,QACA,WACA,YACA;AACA,UAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,UAAM,UAAU,WAAW,IAAI,KAAK;AACpC,YAAQ,IAAI,yBAAkB,QAAQ,OAAO,OAAO;AAEpD,QAAI,CAAC,CAAC,WAAW,MAAM,QAAQ,mCAAS,QAAQ,GAAG;AACjD,UAAI,QAAS,SAAS,WAAW,GAAG;AAClC,cAAM,qBAAqB,QAAS,SAAS,CAAC,EAAE,cAAc,KAAK;AAEnE,gBAAQ,IAAI,sBAAsB,kBAAkB;AACpD,kBAAU,KAAK,KAAK,UAAU,kBAAkB,CAAC;AACjD,mBAAW,OAAO,KAAK;AAAA,MAEzB,OAAO;AACL,mBAAW,IAAI,OAAO,iCACjB,UADiB;AAAA,UAEpB,UAAU,QAAQ,SAAS,MAAM,GAAG,EAAE;AAAA,QACxC,EAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAuB;AAChD,SAAK,YAAY,QAAQ,KAAK,eAAgB,KAAK,qBAAqB;AAAA,EAC1E;AAAA,EAEQ,kBAAkB,QAAuB;AAC/C,SAAK,YAAY,QAAQ,KAAK,cAAc,KAAK,cAAc;AAAA,EACjE;AAAA,EAEQ,gBACN,QACA,eACyC;AACzC,QAAI;AAEJ,QAAI,OAAO,WAAW,UAAU;AAC9B,yBAAmB,EAAE,OAAO,aAAa,OAAO,OAAO;AAAA,IACzD,OAAO;AACL,yBAAmB;AAAA,IACrB;AAEA,QAAI,OAAO,kBAAkB,YAAY;AACvC,UAAI,OAAO,WAAW,UAAU;AAC9B,gBAAQ,IAAI,aAAM,MAAM;AAExB,wBAAgB,OAAO,EAAE,OAAO,eAAe,OAAO,OAAO;AAAA,MAC/D,OAAO;AACL,wBAAgB,OAAO,EAAE,OAAO,eAAe,OAAO,OAAO,MAAM;AAAA,MACrE;AAAA,IACF;AAEA,WAAO,CAAC,kBAAkB,aAAa;AAAA,EACzC;AAAA,EAEQ,kBAAkB;AACxB,QAAI,KAAK;AAAsB;AAC/B,SAAK,uBAAuB;AAC5B,YAAQ,IAAI,mBAAmB,KAAK,oBAAoB,GAAI,aAAa;AACzE,WAAO,WAAW,MAAM;AACtB,cAAQ,IAAI,iBAAiB;AAG7B,WAAK,eAAe,KAAK,OAAO;AAAA,IAClC,GAAG,KAAK,iBAAiB;AAAA,EAC3B;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/net",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
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.14"
20
+ "tsconfig": "0.0.16"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "rxjs": "^7.8.1"
package/src/types/ws.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { WebSocketSubject } from "rxjs/webSocket";
2
-
3
1
  export type MessageObserveTopic = {
4
2
  event: "subscribe" | "unsubscribe";
5
3
  topic: string;
@@ -11,5 +9,5 @@ export type SendFunc = (message: any) => void;
11
9
 
12
10
  export interface MessageHandler {
13
11
  // wsSubject: WebSocketSubject<any>;
14
- handle: (message: any, send: (message: any) => void) => void;
12
+ handle: (message: any, webSocket: WebSocket) => void;
15
13
  }
@@ -1,9 +1,7 @@
1
- import { MessageHandler, SendFunc } from "@/types/ws";
2
- import { WebSocketSubject } from "rxjs/webSocket";
1
+ import { MessageHandler } from "@/types/ws";
3
2
 
4
3
  export default class BaseHandler implements MessageHandler {
5
- // constructor(readonly wsSubject: WebSocketSubject<any>) {}
6
- handle(message: any, send: SendFunc) {
4
+ handle(message: any, webSocket: WebSocket) {
7
5
  throw new Error("Method not implemented.");
8
6
  }
9
7
  }
@@ -1,8 +1,7 @@
1
1
  import BaseHandler from "./baseHandler";
2
- import { SendFunc } from "@/types/ws";
3
2
 
4
3
  export default class PingHandler extends BaseHandler {
5
- handle(_: any, send: SendFunc) {
6
- send({ event: "pong", ts: Date.now() });
4
+ handle(_: any, webSocket: WebSocket) {
5
+ webSocket.send(JSON.stringify({ event: "pong", ts: Date.now() }));
7
6
  }
8
7
  }
package/src/ws/ws.ts CHANGED
@@ -52,7 +52,9 @@ export class WS {
52
52
  private _pendingPrivateSubscribe: any[][] = [];
53
53
  private _pendingPublicSubscribe: any[][] = [];
54
54
 
55
+ // all message handlers
55
56
  private _eventHandlers: Map<string, Topics> = new Map();
57
+ private _eventPrivateHandlers: Map<string, Topics> = new Map();
56
58
 
57
59
  constructor(private options: WSOptions) {
58
60
  this.createPublicSC(options);
@@ -72,12 +74,21 @@ export class WS {
72
74
  });
73
75
  }
74
76
 
77
+ public closePrivate() {
78
+ this.authenticated = false;
79
+ this._pendingPrivateSubscribe = [];
80
+
81
+ this._eventPrivateHandlers.clear();
82
+
83
+ this.privateSocket?.close();
84
+ }
85
+
75
86
  private createPublicSC(options: WSOptions) {
76
87
  this.publicSocket = new WebSocket(
77
88
  `${this.options.publicUrl}/ws/stream/${COMMON_ID}`
78
89
  );
79
90
  this.publicSocket.onopen = this.onOpen.bind(this);
80
- this.publicSocket.onmessage = this.onMessage.bind(this);
91
+ this.publicSocket.onmessage = this.onPublicMessage.bind(this);
81
92
  this.publicSocket.onclose = this.onClose.bind(this);
82
93
  this.publicSocket.onerror = this.onError.bind(this);
83
94
  }
@@ -91,7 +102,7 @@ export class WS {
91
102
  `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`
92
103
  );
93
104
  this.privateSocket.onopen = this.onPrivateOpen.bind(this);
94
- this.privateSocket.onmessage = this.onMessage.bind(this);
105
+ this.privateSocket.onmessage = this.onPrivateMessage.bind(this);
95
106
  // this.privateSocket.onclose = this.onClose.bind(this);
96
107
  this.privateSocket.onerror = this.onPrivateError.bind(this);
97
108
  }
@@ -111,15 +122,16 @@ export class WS {
111
122
 
112
123
  private onPrivateOpen(event: Event) {
113
124
  console.log("Private WebSocket connection opened:");
114
-
115
125
  //auth
116
-
117
126
  this.authenticate(this.options.accountId!);
118
-
119
127
  this.privateIsReconnecting = false;
120
128
  }
121
129
 
122
- private onMessage(event: MessageEvent) {
130
+ private onMessage(
131
+ event: MessageEvent,
132
+ socket: WebSocket,
133
+ handlerMap: Map<string, Topics>
134
+ ) {
123
135
  try {
124
136
  const message = JSON.parse(event.data);
125
137
  const commoneHandler = messageHandlers.get(message.event);
@@ -131,11 +143,9 @@ export class WS {
131
143
  }
132
144
 
133
145
  if (commoneHandler) {
134
- commoneHandler.handle(message, this.send);
146
+ commoneHandler.handle(message, socket);
135
147
  } else {
136
- const eventhandler = this._eventHandlers.get(
137
- message.topic || message.event
138
- );
148
+ const eventhandler = handlerMap.get(message.topic || message.event);
139
149
  if (eventhandler?.callback) {
140
150
  eventhandler.callback.forEach((cb) => {
141
151
  const data = cb.formatter
@@ -150,12 +160,20 @@ export class WS {
150
160
  }
151
161
  // console.log("WebSocket message received:", message);
152
162
  } catch (e) {
153
- console.log("WebSocket message received:", event.data);
163
+ console.log("WebSocket message received:", e, event.data);
154
164
  }
155
165
 
156
166
  // You can process the received message here
157
167
  }
158
168
 
169
+ private onPublicMessage(event: MessageEvent) {
170
+ this.onMessage(event, this.publicSocket, this._eventHandlers);
171
+ }
172
+
173
+ private onPrivateMessage(event: MessageEvent) {
174
+ this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);
175
+ }
176
+
159
177
  private handlePendingPrivateTopic() {
160
178
  if (this._pendingPrivateSubscribe.length > 0) {
161
179
  this._pendingPrivateSubscribe.forEach(([params, cb]) => {
@@ -222,7 +240,6 @@ export class WS {
222
240
 
223
241
  const message = await this.options.onSigntureRequest?.(accountId);
224
242
 
225
- console.log("push auth message:", message);
226
243
  this.privateSocket.send(
227
244
  JSON.stringify({
228
245
  id: "auth",
@@ -240,15 +257,42 @@ export class WS {
240
257
 
241
258
  privateSubscribe(
242
259
  params: any,
243
- callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">,
244
- once?: boolean
260
+ callback: WSMessageHandler | Omit<WSMessageHandler, "onUnsubscribe">
245
261
  ) {
246
- console.log("👉", params, callback, this.privateSocket?.readyState);
262
+ const [subscribeMessage, onUnsubscribe] = this.generateMessage(
263
+ params,
264
+ (callback as WSMessageHandler).onUnsubscribe
265
+ );
247
266
 
248
267
  if (this.privateSocket?.readyState !== WebSocket.OPEN) {
249
268
  this._pendingPrivateSubscribe.push([params, callback]);
250
- return;
269
+ return () => {
270
+ this.unsubscribePrivate(subscribeMessage);
271
+ };
272
+ }
273
+
274
+ const topic = subscribeMessage.topic || subscribeMessage.event;
275
+
276
+ const handler = this._eventPrivateHandlers.get(topic);
277
+ const callbacks = {
278
+ ...callback,
279
+ onUnsubscribe,
280
+ };
281
+
282
+ if (!handler) {
283
+ this._eventPrivateHandlers.set(topic, {
284
+ params,
285
+ callback: [callbacks],
286
+ });
287
+ } else {
288
+ handler.callback.push(callbacks);
251
289
  }
290
+
291
+ this.privateSocket.send(JSON.stringify(subscribeMessage));
292
+
293
+ return () => {
294
+ this.unsubscribePrivate(subscribeMessage);
295
+ };
252
296
  }
253
297
 
254
298
  subscribe(
@@ -268,7 +312,7 @@ export class WS {
268
312
 
269
313
  if (!once) {
270
314
  return () => {
271
- this.unsubscribe(subscribeMessage);
315
+ this.unsubscribePublic(subscribeMessage);
272
316
  };
273
317
  }
274
318
  return;
@@ -296,7 +340,7 @@ export class WS {
296
340
 
297
341
  if (!once) {
298
342
  return () => {
299
- this.unsubscribe(subscribeMessage);
343
+ this.unsubscribePublic(subscribeMessage);
300
344
  };
301
345
  }
302
346
  }
@@ -312,9 +356,13 @@ export class WS {
312
356
  this.subscribe(params, callback, true);
313
357
  }
314
358
 
315
- private unsubscribe(parmas: MessageParams) {
359
+ private unsubscribe(
360
+ parmas: MessageParams,
361
+ webSocket: WebSocket,
362
+ handlerMap: Map<string, Topics>
363
+ ) {
316
364
  const topic = parmas.topic || parmas.event;
317
- const handler = this._eventHandlers.get(topic);
365
+ const handler = handlerMap.get(topic);
318
366
  console.log("🤜 unsubscribe", parmas, topic, handler);
319
367
 
320
368
  if (!!handler && Array.isArray(handler?.callback)) {
@@ -322,11 +370,11 @@ export class WS {
322
370
  const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);
323
371
 
324
372
  console.log("unsubscribeMessage", unsubscribeMessage);
325
- this.publicSocket.send(JSON.stringify(unsubscribeMessage));
326
- this._eventHandlers.delete(topic);
373
+ webSocket.send(JSON.stringify(unsubscribeMessage));
374
+ handlerMap.delete(topic);
327
375
  //post unsubscribe message
328
376
  } else {
329
- this._eventHandlers.set(topic, {
377
+ handlerMap.set(topic, {
330
378
  ...handler,
331
379
  callback: handler.callback.slice(0, -1),
332
380
  });
@@ -334,6 +382,14 @@ export class WS {
334
382
  }
335
383
  }
336
384
 
385
+ private unsubscribePrivate(parmas: MessageParams) {
386
+ this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);
387
+ }
388
+
389
+ private unsubscribePublic(parmas: MessageParams) {
390
+ this.unsubscribe(parmas, this.publicSocket, this._eventHandlers);
391
+ }
392
+
337
393
  private generateMessage(
338
394
  params: any,
339
395
  onUnsubscribe?: (event: string) => any