@grvt/client 1.4.30 → 1.5.0

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.
package/ws/ws.d.ts CHANGED
@@ -1,4 +1,13 @@
1
- import { type TWSRequest } from './interfaces';
1
+ import type { TWSRequest } from './interfaces';
2
+ export declare class WSError extends Error {
3
+ code?: number;
4
+ status?: number;
5
+ constructor(response: {
6
+ status?: number;
7
+ code?: number;
8
+ message?: string;
9
+ });
10
+ }
2
11
  interface IOptions {
3
12
  url: string | URL;
4
13
  protocols?: string | string[];
@@ -46,14 +55,15 @@ export declare class WS {
46
55
  private readonly _onCloses;
47
56
  onClose(callback: (e: CloseEvent) => void): () => void;
48
57
  private readonly _onErrors;
49
- onError(callback: (e: Event) => void): () => void;
58
+ onError(callback: (e: Event | WSError) => void): () => void;
50
59
  private _subscribeCurrentPairs;
51
60
  private _subscribe;
52
61
  /**
53
62
  * Only supports one feed
54
63
  */
55
64
  subscribe(_options: TWSRequest): string;
56
- unsubscribe(pairedConsumerKey: string): this;
65
+ subscribes(...subscriptions: TWSRequest[]): string[];
66
+ unsubscribe(...pairedConsumerKeys: string[]): this;
57
67
  connect(): this;
58
68
  disconnect(): this;
59
69
  ready(delay?: number): Promise<unknown>;
package/ws/ws.js CHANGED
@@ -20,10 +20,31 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  return t;
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.WS = void 0;
24
- const interfaces_1 = require("../interfaces");
23
+ exports.WS = exports.WSError = void 0;
24
+ const ws_candlestick_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_candlestick_feed_data_v_1");
25
+ const ws_deposit_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_deposit_feed_data_v_1");
26
+ const ws_fill_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_fill_feed_data_v_1");
27
+ const ws_mini_ticker_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_mini_ticker_feed_data_v_1");
28
+ const ws_order_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_order_feed_data_v_1");
29
+ const ws_order_group_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_order_group_feed_data_v_1");
30
+ const ws_order_state_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_order_state_feed_data_v_1");
31
+ const ws_orderbook_levels_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_orderbook_levels_feed_data_v_1");
32
+ const ws_positions_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_positions_feed_data_v_1");
33
+ const ws_ticker_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_ticker_feed_data_v_1");
34
+ const ws_trade_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_trade_feed_data_v_1");
35
+ const ws_transfer_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_transfer_feed_data_v_1");
36
+ const ws_withdrawal_feed_data_v_1_1 = require("../interfaces/codegen/schema-maps/ws_withdrawal_feed_data_v_1");
25
37
  const utils_1 = require("../utils");
26
- const interfaces_2 = require("./interfaces");
38
+ const interfaces_1 = require("./interfaces");
39
+ class WSError extends Error {
40
+ constructor(response) {
41
+ super(response.message);
42
+ this.name = 'WSError';
43
+ this.code = response.code;
44
+ this.status = response.status;
45
+ }
46
+ }
47
+ exports.WSError = WSError;
27
48
  const omitZeroStr = (str) => str === '0' ? '' : str;
28
49
  class WS {
29
50
  get _ws() {
@@ -128,7 +149,7 @@ class WS {
128
149
  reconnect();
129
150
  });
130
151
  currentWs.addEventListener('message', (e) => {
131
- var _a, _b, _c, _d, _e, _f;
152
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
132
153
  // only keep the latest ws
133
154
  if (currentWs !== this.__ws) {
134
155
  this._close(currentWs);
@@ -140,17 +161,33 @@ class WS {
140
161
  }
141
162
  const message = utils_1.JsonUtils.parse(e.data);
142
163
  /**
143
- * Ignore 400 status response messages
164
+ * Handle error response
144
165
  */
145
- if (message.status === 400) {
166
+ if ((_b = (_a = message.status) !== null && _a !== void 0 ? _a : message.c) !== null && _b !== void 0 ? _b : message.code) {
167
+ /**
168
+ * Ignore 1003 response "Request could not be processed due to malformed syntax"
169
+ * This happens when client send
170
+ */
171
+ const code = (_c = message.c) !== null && _c !== void 0 ? _c : message.code;
172
+ if (code !== 1003) {
173
+ const error = new WSError(Object.assign(Object.assign({}, message), { code, message: (_d = message.m) !== null && _d !== void 0 ? _d : message.message }));
174
+ if (this._onErrors.length) {
175
+ for (const onError of this._onErrors) {
176
+ onError(error);
177
+ }
178
+ }
179
+ else {
180
+ console.error(error);
181
+ }
182
+ }
146
183
  return;
147
184
  }
148
- const stream = message.s = (_b = (_a = message.s) === null || _a === void 0 ? void 0 : _a.replace) === null || _b === void 0 ? void 0 : _b.call(_a, `${this._version}.`, '');
185
+ const stream = message.s = (_f = (_e = message.s) === null || _e === void 0 ? void 0 : _e.replace) === null || _f === void 0 ? void 0 : _f.call(_e, `${this._version}.`, '');
149
186
  const result = this._messageLiteToFull(message);
150
187
  // no entity found
151
188
  if (!result) {
152
189
  // if no entity found and not a subscription message
153
- if (!((_c = message.s1) === null || _c === void 0 ? void 0 : _c.length)) {
190
+ if (!((_g = message.s1) === null || _g === void 0 ? void 0 : _g.length)) {
154
191
  console.warn('Error: something went wrong with message', message);
155
192
  }
156
193
  return;
@@ -159,7 +196,7 @@ class WS {
159
196
  console.warn('Error: cannot parse stream or feed from message', message);
160
197
  return;
161
198
  }
162
- const instrument = (_f = (_e = (_d = result === null || result === void 0 ? void 0 : result.legs) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.instrument) !== null && _f !== void 0 ? _f : result === null || result === void 0 ? void 0 : result.instrument;
199
+ const instrument = (_k = (_j = (_h = result === null || result === void 0 ? void 0 : result.legs) === null || _h === void 0 ? void 0 : _h[0]) === null || _j === void 0 ? void 0 : _j.instrument) !== null && _k !== void 0 ? _k : result === null || result === void 0 ? void 0 : result.instrument;
163
200
  /**
164
201
  * Handle subscriptions with instrument
165
202
  */
@@ -225,21 +262,21 @@ class WS {
225
262
  ].filter(Boolean).join('-');
226
263
  const withdrawalFromAccountId = omitZeroStr(result.from_account_id);
227
264
  switch (stream) {
228
- case interfaces_2.EStream.GROUP:
265
+ case interfaces_1.EStream.GROUP:
229
266
  return [...acc, ...Object.values(value)];
230
- case interfaces_2.EStream.STATE:
267
+ case interfaces_1.EStream.STATE:
231
268
  return [...acc, ...Object.values(value)];
232
- case interfaces_2.EStream.DEPOSIT:
269
+ case interfaces_1.EStream.DEPOSIT:
233
270
  if (depositDestinationAccountId && key.endsWith(depositDestinationAccountId)) {
234
271
  return [...acc, ...Object.values(value)];
235
272
  }
236
273
  break;
237
- case interfaces_2.EStream.TRANSFER:
274
+ case interfaces_1.EStream.TRANSFER:
238
275
  if ((transferSourceKey && key.endsWith(transferSourceKey)) || (transferDestinationKey && key.endsWith(transferDestinationKey))) {
239
276
  return [...acc, ...Object.values(value)];
240
277
  }
241
278
  break;
242
- case interfaces_2.EStream.WITHDRAWAL:
279
+ case interfaces_1.EStream.WITHDRAWAL:
243
280
  if (withdrawalFromAccountId && key.endsWith(withdrawalFromAccountId)) {
244
281
  return [...acc, ...Object.values(value)];
245
282
  }
@@ -259,10 +296,10 @@ class WS {
259
296
  return acc;
260
297
  }
261
298
  const hasSubAccountId = [
262
- interfaces_2.EStream.ORDER,
299
+ interfaces_1.EStream.ORDER,
263
300
  // EStream.STATE,
264
- interfaces_2.EStream.POSITION,
265
- interfaces_2.EStream.FILL
301
+ interfaces_1.EStream.POSITION,
302
+ interfaces_1.EStream.FILL
266
303
  // EStream.DEPOSIT,
267
304
  // EStream.TRANSFER,
268
305
  // EStream.WITHDRAWAL
@@ -415,76 +452,76 @@ class WS {
415
452
  };
416
453
  const { stream, params } = options;
417
454
  switch (stream) {
418
- case interfaces_2.EStream.CANDLE:
455
+ case interfaces_1.EStream.CANDLE:
419
456
  return {
420
457
  stream,
421
458
  feed: [candleFeed(params)]
422
459
  };
423
- case interfaces_2.EStream.ORDERBOOK_DELTA:
424
- case interfaces_2.EStream.RPI_BOOK_DELTA:
460
+ case interfaces_1.EStream.ORDERBOOK_DELTA:
461
+ case interfaces_1.EStream.RPI_BOOK_DELTA:
425
462
  return {
426
463
  stream,
427
464
  feed: [rpiBookDeltaFeed(params)]
428
465
  };
429
- case interfaces_2.EStream.ORDERBOOK_SNAP:
430
- case interfaces_2.EStream.RPI_BOOK_SNAP:
466
+ case interfaces_1.EStream.ORDERBOOK_SNAP:
467
+ case interfaces_1.EStream.RPI_BOOK_SNAP:
431
468
  return {
432
469
  stream,
433
470
  feed: [rpiBookFeed(params)]
434
471
  };
435
- case interfaces_2.EStream.MINI_DELTA:
436
- case interfaces_2.EStream.MINI_SNAP:
472
+ case interfaces_1.EStream.MINI_DELTA:
473
+ case interfaces_1.EStream.MINI_SNAP:
437
474
  return {
438
475
  stream,
439
476
  feed: [miniFeed(params)]
440
477
  };
441
- case interfaces_2.EStream.TICKER_DELTA:
442
- case interfaces_2.EStream.TICKER_SNAP:
478
+ case interfaces_1.EStream.TICKER_DELTA:
479
+ case interfaces_1.EStream.TICKER_SNAP:
443
480
  return {
444
481
  stream,
445
482
  feed: [tickerFeed(params)]
446
483
  };
447
- case interfaces_2.EStream.TRADE:
484
+ case interfaces_1.EStream.TRADE:
448
485
  return {
449
486
  stream,
450
487
  feed: [publicTradesFeed(params)]
451
488
  };
452
- case interfaces_2.EStream.GROUP:
489
+ case interfaces_1.EStream.GROUP:
453
490
  return {
454
491
  stream,
455
492
  feed: [orderGroupFeed(params)]
456
493
  };
457
- case interfaces_2.EStream.ORDER:
494
+ case interfaces_1.EStream.ORDER:
458
495
  return {
459
496
  stream,
460
497
  feed: [orderFeed(params)]
461
498
  };
462
- case interfaces_2.EStream.STATE:
499
+ case interfaces_1.EStream.STATE:
463
500
  return {
464
501
  stream,
465
502
  feed: [orderStateFeed(params)]
466
503
  };
467
- case interfaces_2.EStream.POSITION:
504
+ case interfaces_1.EStream.POSITION:
468
505
  return {
469
506
  stream,
470
507
  feed: [positionFeed(params)]
471
508
  };
472
- case interfaces_2.EStream.FILL:
509
+ case interfaces_1.EStream.FILL:
473
510
  return {
474
511
  stream,
475
512
  feed: [fillFeed(params)]
476
513
  };
477
- case interfaces_2.EStream.DEPOSIT:
514
+ case interfaces_1.EStream.DEPOSIT:
478
515
  return {
479
516
  stream,
480
517
  feed: [depositFeed(params)]
481
518
  };
482
- case interfaces_2.EStream.TRANSFER:
519
+ case interfaces_1.EStream.TRANSFER:
483
520
  return {
484
521
  stream,
485
522
  feed: [transferFeed(params)]
486
523
  };
487
- case interfaces_2.EStream.WITHDRAWAL:
524
+ case interfaces_1.EStream.WITHDRAWAL:
488
525
  return {
489
526
  stream,
490
527
  feed: [withdrawalFeed(params)]
@@ -495,37 +532,37 @@ class WS {
495
532
  }
496
533
  _messageLiteToFull(message) {
497
534
  switch (message.s) {
498
- case interfaces_2.EStream.CANDLE:
499
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_CANDLESTICK_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
500
- case interfaces_2.EStream.ORDERBOOK_DELTA:
501
- case interfaces_2.EStream.ORDERBOOK_SNAP:
502
- case interfaces_2.EStream.RPI_BOOK_DELTA:
503
- case interfaces_2.EStream.RPI_BOOK_SNAP:
504
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_ORDERBOOK_LEVELS_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
505
- case interfaces_2.EStream.MINI_DELTA:
506
- case interfaces_2.EStream.MINI_SNAP:
507
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_MINI_TICKER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
508
- case interfaces_2.EStream.TICKER_DELTA:
509
- case interfaces_2.EStream.TICKER_SNAP:
510
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_TICKER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
511
- case interfaces_2.EStream.TRADE:
512
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_TRADE_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
513
- case interfaces_2.EStream.GROUP:
514
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_ORDER_GROUP_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
515
- case interfaces_2.EStream.ORDER:
516
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_ORDER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
517
- case interfaces_2.EStream.STATE:
518
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_ORDER_STATE_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
519
- case interfaces_2.EStream.POSITION:
520
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_POSITIONS_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
521
- case interfaces_2.EStream.FILL:
522
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_FILL_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
523
- case interfaces_2.EStream.DEPOSIT:
524
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_DEPOSIT_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
525
- case interfaces_2.EStream.TRANSFER:
526
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_TRANSFER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
527
- case interfaces_2.EStream.WITHDRAWAL:
528
- return utils_1.Utils.schemaMap(message, interfaces_1.WS_WITHDRAWAL_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
535
+ case interfaces_1.EStream.CANDLE:
536
+ return utils_1.Utils.schemaMap(message, ws_candlestick_feed_data_v_1_1.WS_CANDLESTICK_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
537
+ case interfaces_1.EStream.ORDERBOOK_DELTA:
538
+ case interfaces_1.EStream.ORDERBOOK_SNAP:
539
+ case interfaces_1.EStream.RPI_BOOK_DELTA:
540
+ case interfaces_1.EStream.RPI_BOOK_SNAP:
541
+ return utils_1.Utils.schemaMap(message, ws_orderbook_levels_feed_data_v_1_1.WS_ORDERBOOK_LEVELS_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
542
+ case interfaces_1.EStream.MINI_DELTA:
543
+ case interfaces_1.EStream.MINI_SNAP:
544
+ return utils_1.Utils.schemaMap(message, ws_mini_ticker_feed_data_v_1_1.WS_MINI_TICKER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
545
+ case interfaces_1.EStream.TICKER_DELTA:
546
+ case interfaces_1.EStream.TICKER_SNAP:
547
+ return utils_1.Utils.schemaMap(message, ws_ticker_feed_data_v_1_1.WS_TICKER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
548
+ case interfaces_1.EStream.TRADE:
549
+ return utils_1.Utils.schemaMap(message, ws_trade_feed_data_v_1_1.WS_TRADE_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
550
+ case interfaces_1.EStream.GROUP:
551
+ return utils_1.Utils.schemaMap(message, ws_order_group_feed_data_v_1_1.WS_ORDER_GROUP_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
552
+ case interfaces_1.EStream.ORDER:
553
+ return utils_1.Utils.schemaMap(message, ws_order_feed_data_v_1_1.WS_ORDER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
554
+ case interfaces_1.EStream.STATE:
555
+ return utils_1.Utils.schemaMap(message, ws_order_state_feed_data_v_1_1.WS_ORDER_STATE_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
556
+ case interfaces_1.EStream.POSITION:
557
+ return utils_1.Utils.schemaMap(message, ws_positions_feed_data_v_1_1.WS_POSITIONS_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
558
+ case interfaces_1.EStream.FILL:
559
+ return utils_1.Utils.schemaMap(message, ws_fill_feed_data_v_1_1.WS_FILL_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
560
+ case interfaces_1.EStream.DEPOSIT:
561
+ return utils_1.Utils.schemaMap(message, ws_deposit_feed_data_v_1_1.WS_DEPOSIT_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
562
+ case interfaces_1.EStream.TRANSFER:
563
+ return utils_1.Utils.schemaMap(message, ws_transfer_feed_data_v_1_1.WS_TRANSFER_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
564
+ case interfaces_1.EStream.WITHDRAWAL:
565
+ return utils_1.Utils.schemaMap(message, ws_withdrawal_feed_data_v_1_1.WS_WITHDRAWAL_FEED_DATA_V_1_MAP.LITE_TO_FULL).feed;
529
566
  default:
530
567
  console.warn('Unknown message:', message);
531
568
  }
@@ -622,12 +659,24 @@ class WS {
622
659
  }
623
660
  _subscribeCurrentPairs() {
624
661
  const pairs = Object.keys(this._pairs);
625
- for (const pair of pairs) {
662
+ const groupStreams = {};
663
+ // keep last primary stream
664
+ for (const pair of pairs.reverse()) {
626
665
  const { stream, feed } = this._parsePair(pair);
666
+ if (!groupStreams[stream]) {
667
+ groupStreams[stream] = [];
668
+ }
669
+ const primaryFeed = feed.split('@')[0];
670
+ if (!groupStreams[stream].some((f) => f.startsWith(`${primaryFeed}@`))) {
671
+ groupStreams[stream].push(feed);
672
+ }
673
+ }
674
+ const streams = Object.keys(groupStreams);
675
+ for (const stream of streams) {
627
676
  this._sendMessage({
628
677
  method: 'subscribe',
629
678
  stream,
630
- feed: [feed]
679
+ feed: groupStreams[stream]
631
680
  });
632
681
  }
633
682
  }
@@ -684,8 +733,90 @@ class WS {
684
733
  void this._subscribe(pair, subscribePayload).catch(onError);
685
734
  return this._addConsumer(pair, onMessage);
686
735
  }
687
- unsubscribe(pairedConsumerKey) {
688
- this._removeConsumer(pairedConsumerKey);
736
+ subscribes(...subscriptions) {
737
+ var _a;
738
+ if (!subscriptions.length) {
739
+ return [];
740
+ }
741
+ const pairs = [];
742
+ const payloads = [];
743
+ const groupStreams = {};
744
+ for (const subscription of subscriptions) {
745
+ const { onData: onMessage, onError } = subscription, options = __rest(subscription, ["onData", "onError"]);
746
+ const subscribePayload = this._parseStream(options);
747
+ const stream = subscribePayload === null || subscribePayload === void 0 ? void 0 : subscribePayload.stream;
748
+ const feed = (_a = subscribePayload === null || subscribePayload === void 0 ? void 0 : subscribePayload.feed) === null || _a === void 0 ? void 0 : _a[0];
749
+ if (!stream || !feed) {
750
+ throw new Error('Unknown stream or feed');
751
+ }
752
+ if (!groupStreams[stream]) {
753
+ groupStreams[stream] = [];
754
+ }
755
+ const primaryFeed = feed.split('@')[0];
756
+ if (groupStreams[stream].some((f) => f.startsWith(`${primaryFeed}@`))) {
757
+ throw new Error(`Attempted to subscribe to same primary selector twice, in same request: ${primaryFeed}`);
758
+ }
759
+ groupStreams[stream].push(feed);
760
+ payloads.push(subscribePayload);
761
+ pairs.push({
762
+ pair: this._getPair({ stream, feed }),
763
+ onData: onMessage,
764
+ onError
765
+ });
766
+ }
767
+ /**
768
+ * Subscribe in parallel and listen for responses
769
+ */
770
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
771
+ var _b;
772
+ yield this.ready();
773
+ for (const { pair, onError } of pairs) {
774
+ let _resolve;
775
+ const onPaired = (e) => {
776
+ var _a, _b, _c;
777
+ const message = utils_1.JsonUtils.parse(e.data);
778
+ if (!(message === null || message === void 0 ? void 0 : message.s) || !((_a = message === null || message === void 0 ? void 0 : message.s1) === null || _a === void 0 ? void 0 : _a.length)) {
779
+ return;
780
+ }
781
+ const responseStream = (_c = (_b = message.s) === null || _b === void 0 ? void 0 : _b.replace) === null || _c === void 0 ? void 0 : _c.call(_b, `${this._version}.`, '');
782
+ const { stream, feed } = this._parsePair(pair);
783
+ const asset = feed.split('@')[0];
784
+ const subs = message.s1;
785
+ const isResolved = stream === responseStream && (subs.includes(asset) ||
786
+ subs.includes(asset.toLowerCase()) ||
787
+ subs.includes(feed) ||
788
+ subs.includes(feed.toLowerCase()));
789
+ if (isResolved) {
790
+ _resolve();
791
+ }
792
+ };
793
+ const promise = new Promise((resolve) => {
794
+ _resolve = resolve;
795
+ this._ws.addEventListener('message', onPaired);
796
+ });
797
+ utils_1.Utils.timeout(promise, (_b = this._options.timeout) !== null && _b !== void 0 ? _b : 30000, new Error('Subscribe Timeout: ' + pair))
798
+ .catch((error) => onError === null || onError === void 0 ? void 0 : onError(error))
799
+ .finally(() => {
800
+ this._ws.removeEventListener('message', onPaired);
801
+ });
802
+ }
803
+ const streams = Object.keys(groupStreams);
804
+ for (const stream of streams) {
805
+ this._sendMessage({
806
+ method: 'subscribe',
807
+ stream,
808
+ feed: groupStreams[stream]
809
+ });
810
+ }
811
+ }));
812
+ return pairs.map(({ pair, onData }) => {
813
+ return this._addConsumer(pair, onData);
814
+ });
815
+ }
816
+ unsubscribe(...pairedConsumerKeys) {
817
+ for (const pairedConsumerKey of pairedConsumerKeys) {
818
+ this._removeConsumer(pairedConsumerKey);
819
+ }
689
820
  return this;
690
821
  }
691
822
  connect() {