tardis-dev 13.9.0 → 13.10.1

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.
Files changed (103) hide show
  1. package/dist/apikeyaccessinfo.d.ts +1 -1
  2. package/dist/apikeyaccessinfo.d.ts.map +1 -1
  3. package/dist/combine.d.ts +2 -2
  4. package/dist/combine.d.ts.map +1 -1
  5. package/dist/computable/booksnapshot.d.ts +1 -1
  6. package/dist/computable/booksnapshot.d.ts.map +1 -1
  7. package/dist/computable/computable.d.ts +2 -2
  8. package/dist/computable/computable.d.ts.map +1 -1
  9. package/dist/computable/tradebar.d.ts +2 -2
  10. package/dist/computable/tradebar.d.ts.map +1 -1
  11. package/dist/consts.d.ts +1 -1
  12. package/dist/consts.js +1 -1
  13. package/dist/consts.js.map +1 -1
  14. package/dist/downloaddatasets.d.ts +2 -2
  15. package/dist/downloaddatasets.d.ts.map +1 -1
  16. package/dist/exchangedetails.d.ts +6 -6
  17. package/dist/exchangedetails.d.ts.map +1 -1
  18. package/dist/instrumentinfo.d.ts +2 -2
  19. package/dist/instrumentinfo.d.ts.map +1 -1
  20. package/dist/mappers/ascendex.d.ts +6 -6
  21. package/dist/mappers/ascendex.d.ts.map +1 -1
  22. package/dist/mappers/binance.d.ts +13 -13
  23. package/dist/mappers/binance.d.ts.map +1 -1
  24. package/dist/mappers/binanceoptions.d.ts +6 -6
  25. package/dist/mappers/binanceoptions.d.ts.map +1 -1
  26. package/dist/mappers/bitfinex.d.ts +8 -8
  27. package/dist/mappers/bitfinex.d.ts.map +1 -1
  28. package/dist/mappers/bitflyer.d.ts +3 -3
  29. package/dist/mappers/bitflyer.d.ts.map +1 -1
  30. package/dist/mappers/bitmex.d.ts +4 -4
  31. package/dist/mappers/bitmex.d.ts.map +1 -1
  32. package/dist/mappers/bitstamp.d.ts +4 -4
  33. package/dist/mappers/bitstamp.d.ts.map +1 -1
  34. package/dist/mappers/bybit.d.ts +9 -9
  35. package/dist/mappers/bybit.d.ts.map +1 -1
  36. package/dist/mappers/bybitspot.d.ts +3 -3
  37. package/dist/mappers/bybitspot.d.ts.map +1 -1
  38. package/dist/mappers/coinbase.d.ts +5 -5
  39. package/dist/mappers/coinbase.d.ts.map +1 -1
  40. package/dist/mappers/coinflex.d.ts +1 -1
  41. package/dist/mappers/coinflex.d.ts.map +1 -1
  42. package/dist/mappers/cryptocom.d.ts +7 -7
  43. package/dist/mappers/cryptocom.d.ts.map +1 -1
  44. package/dist/mappers/cryptofacilities.d.ts +5 -5
  45. package/dist/mappers/cryptofacilities.d.ts.map +1 -1
  46. package/dist/mappers/delta.d.ts +3 -3
  47. package/dist/mappers/delta.d.ts.map +1 -1
  48. package/dist/mappers/deribit.d.ts +3 -3
  49. package/dist/mappers/deribit.d.ts.map +1 -1
  50. package/dist/mappers/dydx.d.ts +5 -5
  51. package/dist/mappers/dydx.d.ts.map +1 -1
  52. package/dist/mappers/ftx.d.ts +5 -5
  53. package/dist/mappers/ftx.d.ts.map +1 -1
  54. package/dist/mappers/gateio.d.ts +4 -4
  55. package/dist/mappers/gateio.d.ts.map +1 -1
  56. package/dist/mappers/gateiofutures.d.ts +7 -7
  57. package/dist/mappers/gateiofutures.d.ts.map +1 -1
  58. package/dist/mappers/huobi.d.ts +15 -15
  59. package/dist/mappers/huobi.d.ts.map +1 -1
  60. package/dist/mappers/kucoin.d.ts +5 -5
  61. package/dist/mappers/kucoin.d.ts.map +1 -1
  62. package/dist/mappers/mapper.d.ts +2 -2
  63. package/dist/mappers/mapper.d.ts.map +1 -1
  64. package/dist/mappers/okex.d.ts +23 -23
  65. package/dist/mappers/okex.d.ts.map +1 -1
  66. package/dist/mappers/phemex.d.ts +46 -4
  67. package/dist/mappers/phemex.d.ts.map +1 -1
  68. package/dist/mappers/phemex.js +194 -62
  69. package/dist/mappers/phemex.js.map +1 -1
  70. package/dist/mappers/poloniex.d.ts +6 -6
  71. package/dist/mappers/poloniex.d.ts.map +1 -1
  72. package/dist/mappers/serum.d.ts +5 -5
  73. package/dist/mappers/serum.d.ts.map +1 -1
  74. package/dist/mappers/upbit.d.ts +2 -2
  75. package/dist/mappers/upbit.d.ts.map +1 -1
  76. package/dist/options.d.ts +1 -1
  77. package/dist/options.d.ts.map +1 -1
  78. package/dist/orderbook.d.ts +1 -1
  79. package/dist/orderbook.d.ts.map +1 -1
  80. package/dist/realtimefeeds/okex.d.ts +1 -0
  81. package/dist/realtimefeeds/okex.d.ts.map +1 -1
  82. package/dist/realtimefeeds/okex.js +6 -0
  83. package/dist/realtimefeeds/okex.js.map +1 -1
  84. package/dist/realtimefeeds/phemex.d.ts.map +1 -1
  85. package/dist/realtimefeeds/phemex.js +8 -2
  86. package/dist/realtimefeeds/phemex.js.map +1 -1
  87. package/dist/realtimefeeds/realtimefeed.d.ts +2 -2
  88. package/dist/realtimefeeds/realtimefeed.d.ts.map +1 -1
  89. package/dist/realtimefeeds/realtimefeed.js +3 -3
  90. package/dist/realtimefeeds/realtimefeed.js.map +1 -1
  91. package/dist/replay.d.ts +2 -2
  92. package/dist/replay.d.ts.map +1 -1
  93. package/dist/stream.d.ts +2 -2
  94. package/dist/stream.d.ts.map +1 -1
  95. package/dist/types.d.ts +16 -16
  96. package/dist/types.d.ts.map +1 -1
  97. package/dist/worker.d.ts +2 -2
  98. package/dist/worker.d.ts.map +1 -1
  99. package/package.json +1 -1
  100. package/src/consts.ts +1 -1
  101. package/src/mappers/phemex.ts +308 -88
  102. package/src/realtimefeeds/okex.ts +8 -0
  103. package/src/realtimefeeds/phemex.ts +11 -2
@@ -27,46 +27,114 @@ function getQtyScale(symbol: string) {
27
27
  return 1
28
28
  }
29
29
 
30
- function getSymbols(symbols?: string[]) {
31
- if (symbols === undefined) {
32
- return
30
+ const COINS_STARTING_WITH_S = ['SOL', 'SUSHI', 'SNX', 'SAND', 'SRM', 'SKLU', 'SXP', 'STORJ', 'SFP', 'STG']
31
+ function getInstrumentType(symbol: string) {
32
+ if (/\d+$/.test(symbol)) {
33
+ return 'future'
34
+ }
35
+
36
+ if (COINS_STARTING_WITH_S.some((c) => symbol.startsWith(c)) || symbol.startsWith('S') === false) {
37
+ return 'perpetual'
38
+ }
39
+
40
+ return 'spot'
41
+ }
42
+
43
+ function getApiSymbolId(symbolId: string) {
44
+ const type = getInstrumentType(symbolId)
45
+ if (type === 'spot' && symbolId.startsWith('S')) {
46
+ return symbolId.charAt(0).toLowerCase() + symbolId.slice(1)
47
+ }
48
+ if (symbolId.startsWith('U100')) {
49
+ return symbolId.charAt(0).toLowerCase() + symbolId.slice(1)
50
+ }
51
+
52
+ if (symbolId === 'CETHUSD') {
53
+ return symbolId.charAt(0).toLowerCase() + symbolId.slice(1)
54
+ }
55
+
56
+ return symbolId
57
+ }
58
+
59
+ function getSymbols(symbols: string[]) {
60
+ const perpV2Symbols = symbols.filter((s) => getInstrumentType(s) === 'perpetual' && s.endsWith('USDT')).map(getApiSymbolId)
61
+ const otherSymbols = symbols.filter((s) => getInstrumentType(s) !== 'perpetual' || s.endsWith('USDT') == false).map(getApiSymbolId)
62
+
63
+ return {
64
+ perpV2Symbols,
65
+ otherSymbols
33
66
  }
34
- return symbols.map((symbol) => {
35
- if (symbol.startsWith('S')) {
36
- return symbol.charAt(0).toLowerCase() + symbol.slice(1)
37
- }
38
- return symbol
39
- })
40
67
  }
41
68
 
42
69
  export const phemexTradesMapper: Mapper<'phemex', Trade> = {
43
70
  canHandle(message: PhemexTradeMessage) {
44
- return 'trades' in message && message.type === 'incremental'
71
+ return message.type === 'incremental' && ('trades' in message || 'trades_p' in message)
45
72
  },
46
73
 
47
74
  getFilters(symbols?: string[]) {
48
- return [
49
- {
75
+ if (symbols == undefined || symbols.length === 0) {
76
+ return [
77
+ {
78
+ channel: 'trades'
79
+ } as const,
80
+ {
81
+ channel: 'trades_p'
82
+ } as const
83
+ ]
84
+ }
85
+
86
+ const { perpV2Symbols, otherSymbols } = getSymbols(symbols)
87
+
88
+ const filters = []
89
+
90
+ if (perpV2Symbols.length > 0) {
91
+ filters.push({
92
+ channel: 'trades_p',
93
+ symbols: perpV2Symbols
94
+ } as const)
95
+ }
96
+ if (otherSymbols.length > 0) {
97
+ filters.push({
50
98
  channel: 'trades',
51
- symbols: getSymbols(symbols)
52
- } as const
53
- ]
99
+ symbols: otherSymbols
100
+ } as const)
101
+ }
102
+
103
+ return filters
54
104
  },
55
105
 
56
106
  *map(message: PhemexTradeMessage, localTimestamp: Date): IterableIterator<Trade> {
57
- for (const [timestamp, side, priceEp, qty] of message.trades) {
58
- const symbol = message.symbol
107
+ if ('trades' in message) {
108
+ for (const [timestamp, side, priceEp, qty] of message.trades) {
109
+ const symbol = message.symbol
59
110
 
60
- yield {
61
- type: 'trade',
62
- symbol: symbol.toUpperCase(),
63
- exchange: 'phemex',
64
- id: undefined,
65
- price: priceEp / getPriceScale(symbol),
66
- amount: qty / getQtyScale(symbol),
67
- side: side === 'Buy' ? 'buy' : 'sell',
68
- timestamp: fromNanoSecondsToDate(timestamp),
69
- localTimestamp: localTimestamp
111
+ yield {
112
+ type: 'trade',
113
+ symbol: symbol.toUpperCase(),
114
+ exchange: 'phemex',
115
+ id: undefined,
116
+ price: priceEp / getPriceScale(symbol),
117
+ amount: qty / getQtyScale(symbol),
118
+ side: side === 'Buy' ? 'buy' : 'sell',
119
+ timestamp: fromNanoSecondsToDate(timestamp),
120
+ localTimestamp: localTimestamp
121
+ }
122
+ }
123
+ } else if ('trades_p' in message) {
124
+ for (const [timestamp, side, price, qty] of message.trades_p) {
125
+ const symbol = message.symbol
126
+
127
+ yield {
128
+ type: 'trade',
129
+ symbol: symbol.toUpperCase(),
130
+ exchange: 'phemex',
131
+ id: undefined,
132
+ price: Number(price),
133
+ amount: Number(qty),
134
+ side: side === 'Buy' ? 'buy' : 'sell',
135
+ timestamp: fromNanoSecondsToDate(timestamp),
136
+ localTimestamp: localTimestamp
137
+ }
70
138
  }
71
139
  }
72
140
  }
@@ -81,33 +149,75 @@ const mapBookLevelForSymbol =
81
149
  }
82
150
  }
83
151
 
152
+ function mapPerpBookLevel([price, amount]: [string, string]) {
153
+ return {
154
+ price: Number(price),
155
+ amount: Number(amount)
156
+ }
157
+ }
158
+
84
159
  export const phemexBookChangeMapper: Mapper<'phemex', BookChange> = {
85
160
  canHandle(message: PhemexBookMessage) {
86
- return 'book' in message
161
+ return 'book' in message || 'orderbook_p' in message
87
162
  },
88
163
 
89
164
  getFilters(symbols?: string[]) {
90
- return [
91
- {
165
+ if (symbols == undefined || symbols.length === 0) {
166
+ return [
167
+ {
168
+ channel: 'book'
169
+ } as const,
170
+ {
171
+ channel: 'orderbook_p'
172
+ } as const
173
+ ]
174
+ }
175
+
176
+ const { perpV2Symbols, otherSymbols } = getSymbols(symbols)
177
+ const filters = []
178
+
179
+ if (perpV2Symbols.length > 0) {
180
+ filters.push({
181
+ channel: 'orderbook_p',
182
+ symbols: perpV2Symbols
183
+ } as const)
184
+ }
185
+ if (otherSymbols.length > 0) {
186
+ filters.push({
92
187
  channel: 'book',
93
- symbols: getSymbols(symbols)
94
- } as const
95
- ]
188
+ symbols: otherSymbols
189
+ } as const)
190
+ }
191
+
192
+ return filters
96
193
  },
97
194
 
98
195
  *map(message: PhemexBookMessage, localTimestamp: Date): IterableIterator<BookChange> {
99
196
  const symbol = message.symbol
100
- const mapBookLevel = mapBookLevelForSymbol(symbol)
101
- yield {
102
- type: 'book_change',
103
- symbol: symbol.toUpperCase(),
104
- exchange: 'phemex',
105
- isSnapshot: message.type === 'snapshot',
106
- bids: message.book.bids.map(mapBookLevel),
107
- asks: message.book.asks.map(mapBookLevel),
108
-
109
- timestamp: fromNanoSecondsToDate(message.timestamp),
110
- localTimestamp
197
+ if ('book' in message) {
198
+ const mapBookLevel = mapBookLevelForSymbol(symbol)
199
+ yield {
200
+ type: 'book_change',
201
+ symbol: symbol.toUpperCase(),
202
+ exchange: 'phemex',
203
+ isSnapshot: message.type === 'snapshot',
204
+ bids: message.book.bids.map(mapBookLevel),
205
+ asks: message.book.asks.map(mapBookLevel),
206
+
207
+ timestamp: fromNanoSecondsToDate(message.timestamp),
208
+ localTimestamp
209
+ }
210
+ } else if ('orderbook_p' in message) {
211
+ yield {
212
+ type: 'book_change',
213
+ symbol: symbol.toUpperCase(),
214
+ exchange: 'phemex',
215
+ isSnapshot: message.type === 'snapshot',
216
+ bids: message.orderbook_p.bids.map(mapPerpBookLevel),
217
+ asks: message.orderbook_p.asks.map(mapPerpBookLevel),
218
+ timestamp: fromNanoSecondsToDate(message.timestamp),
219
+ localTimestamp
220
+ }
111
221
  }
112
222
  }
113
223
  }
@@ -116,64 +226,174 @@ export class PhemexDerivativeTickerMapper implements Mapper<'phemex', Derivative
116
226
  private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
117
227
 
118
228
  canHandle(message: PhemexTicker) {
119
- return 'market24h' in message
229
+ return 'market24h' in message || message.method === 'perp_market24h_pack_p.update'
120
230
  }
121
231
 
122
232
  getFilters(symbols?: string[]) {
123
- return [
124
- {
233
+ if (symbols == undefined || symbols.length === 0) {
234
+ return [
235
+ {
236
+ channel: 'market24h'
237
+ } as const,
238
+ {
239
+ channel: 'perp_market24h_pack_p'
240
+ } as const
241
+ ]
242
+ }
243
+
244
+ const { perpV2Symbols, otherSymbols } = getSymbols(symbols)
245
+ const filters = []
246
+
247
+ if (perpV2Symbols.length > 0) {
248
+ filters.push({
249
+ channel: 'perp_market24h_pack_p',
250
+ symbols: perpV2Symbols
251
+ } as const)
252
+ }
253
+ if (otherSymbols.length > 0) {
254
+ filters.push({
125
255
  channel: 'market24h',
126
- symbols
127
- } as const
128
- ]
256
+ symbols: otherSymbols
257
+ } as const)
258
+ }
259
+
260
+ return filters
129
261
  }
130
262
 
131
263
  *map(message: PhemexTicker, localTimestamp: Date): IterableIterator<DerivativeTicker> {
132
- const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.market24h.symbol, 'phemex')
133
- const phemexTicker = message.market24h
134
- pendingTickerInfo.updateFundingRate(phemexTicker.fundingRate / 100000000)
135
- pendingTickerInfo.updatePredictedFundingRate(phemexTicker.predFundingRate / 100000000)
136
- pendingTickerInfo.updateIndexPrice(phemexTicker.indexPrice / 10000)
137
- pendingTickerInfo.updateMarkPrice(phemexTicker.markPrice / 10000)
138
- pendingTickerInfo.updateOpenInterest(phemexTicker.openInterest)
139
- pendingTickerInfo.updateLastPrice(phemexTicker.close / 10000)
140
- pendingTickerInfo.updateTimestamp(fromNanoSecondsToDate(message.timestamp))
141
-
142
- if (pendingTickerInfo.hasChanged()) {
143
- yield pendingTickerInfo.getSnapshot(localTimestamp)
264
+ if ('market24h' in message) {
265
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.market24h.symbol, 'phemex')
266
+ const phemexTicker = message.market24h
267
+ pendingTickerInfo.updateFundingRate(phemexTicker.fundingRate / 100000000)
268
+ pendingTickerInfo.updatePredictedFundingRate(phemexTicker.predFundingRate / 100000000)
269
+ pendingTickerInfo.updateIndexPrice(phemexTicker.indexPrice / 10000)
270
+ pendingTickerInfo.updateMarkPrice(phemexTicker.markPrice / 10000)
271
+ pendingTickerInfo.updateOpenInterest(phemexTicker.openInterest)
272
+ pendingTickerInfo.updateLastPrice(phemexTicker.close / 10000)
273
+ pendingTickerInfo.updateTimestamp(fromNanoSecondsToDate(message.timestamp))
274
+
275
+ if (pendingTickerInfo.hasChanged()) {
276
+ yield pendingTickerInfo.getSnapshot(localTimestamp)
277
+ }
278
+ } else {
279
+ for (let [
280
+ symbol,
281
+ _openRp,
282
+ _highRp,
283
+ _lowRp,
284
+ lastRp,
285
+ _volumeRq,
286
+ _turnoverRv,
287
+ openInterestRv,
288
+ indexRp,
289
+ markRp,
290
+ fundingRateRr,
291
+ predFundingRateRr
292
+ ] of message.data) {
293
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(symbol, 'phemex')
294
+
295
+ pendingTickerInfo.updateFundingRate(Number(fundingRateRr))
296
+ pendingTickerInfo.updatePredictedFundingRate(Number(predFundingRateRr))
297
+ pendingTickerInfo.updateIndexPrice(Number(indexRp))
298
+ pendingTickerInfo.updateMarkPrice(Number(markRp))
299
+ pendingTickerInfo.updateOpenInterest(Number(openInterestRv))
300
+ pendingTickerInfo.updateLastPrice(Number(lastRp))
301
+ pendingTickerInfo.updateTimestamp(fromNanoSecondsToDate(message.timestamp))
302
+
303
+ if (pendingTickerInfo.hasChanged()) {
304
+ yield pendingTickerInfo.getSnapshot(localTimestamp)
305
+ }
306
+ }
144
307
  }
145
308
  }
146
309
  }
147
310
 
148
- type PhemexTradeMessage = {
149
- symbol: string
150
- trades: [[number, 'Buy' | 'Sell', number, number]]
151
- type: 'incremental' | 'snapshot'
152
- }
311
+ type PhemexTradeMessage =
312
+ | {
313
+ symbol: string
314
+ trades: [[number, 'Buy' | 'Sell', number, number]]
315
+ type: 'incremental' | 'snapshot'
316
+ }
317
+ | {
318
+ sequence: 79157171
319
+ symbol: 'BTCUSDT'
320
+ trades_p: [[1669198793402790477, 'Buy' | 'Sell', '16545.6', '0.7']]
321
+ type: 'snapshot' | 'incremental'
322
+ }
153
323
 
154
324
  type PhemexBookLevel = [number, number]
155
325
 
156
- type PhemexBookMessage = {
157
- book: {
158
- asks: PhemexBookLevel[]
159
- bids: PhemexBookLevel[]
160
- }
326
+ type PhemexBookMessage =
327
+ | {
328
+ book: {
329
+ asks: PhemexBookLevel[]
330
+ bids: PhemexBookLevel[]
331
+ }
161
332
 
162
- symbol: string
163
- timestamp: number
164
- type: 'incremental' | 'snapshot'
165
- }
333
+ symbol: string
334
+ timestamp: number
335
+ type: 'incremental' | 'snapshot'
336
+ }
337
+ | {
338
+ depth: 0
339
+ orderbook_p: {
340
+ asks: [string, string][]
341
+ bids: [string, string][]
342
+ }
343
+ sequence: 80321058
344
+ symbol: 'BTCUSDT'
345
+ timestamp: 1669198850490348246
346
+ type: 'snapshot' | 'incremental'
347
+ }
166
348
 
167
- type PhemexTicker = {
168
- market24h: {
169
- fundingRate: number
170
- indexPrice: number
171
- markPrice: number
172
- openInterest: number
173
- predFundingRate: number
174
- symbol: string
175
- close: number
176
- }
349
+ type PhemexTicker =
350
+ | {
351
+ market24h: {
352
+ fundingRate: number
353
+ indexPrice: number
354
+ markPrice: number
355
+ openInterest: number
356
+ predFundingRate: number
357
+ symbol: string
358
+ close: number
359
+ }
177
360
 
178
- timestamp: number
179
- }
361
+ timestamp: number
362
+ method: undefined
363
+ }
364
+ | {
365
+ data: [
366
+ [
367
+ 'SOLUSDT',
368
+ '11.246',
369
+ '13.41',
370
+ '10.91',
371
+ '13.029',
372
+ '10445.82',
373
+ '127687.14224',
374
+ '0',
375
+ '13.03062296',
376
+ '13.03154351',
377
+ '0.0001',
378
+ '0.0001'
379
+ ],
380
+
381
+ [
382
+ 'BTCUSDT',
383
+ '15713.1',
384
+ '16626',
385
+ '15685.7',
386
+ '16545.6',
387
+ '1374.476',
388
+ '22296790.4579',
389
+ '0',
390
+ '16553.56998432',
391
+ '16554.73942506',
392
+ '0.0001',
393
+ '0.0001'
394
+ ]
395
+ ]
396
+ method: 'perp_market24h_pack_p.update'
397
+ timestamp: 1669198855202180601
398
+ type: 'incremental'
399
+ }
@@ -61,6 +61,14 @@ export class OkexRealTimeFeed extends RealTimeFeedBase {
61
61
  protected messageIsError(message: any): boolean {
62
62
  return message.event === 'error'
63
63
  }
64
+
65
+ protected isIgnoredError(message: any) {
66
+ if (message.msg.includes('channel') && message.msg.includes(`doesn't exist`)) {
67
+ return true
68
+ }
69
+
70
+ return false
71
+ }
64
72
  }
65
73
 
66
74
  export class OKCoinRealTimeFeed extends RealTimeFeedBase {
@@ -7,16 +7,25 @@ export class PhemexRealTimeFeed extends RealTimeFeedBase {
7
7
 
8
8
  protected readonly channelsMap = {
9
9
  book: 'orderbook.subscribe',
10
+ orderbook_p: 'orderbook_p.subscribe',
10
11
  trades: 'trade.subscribe',
12
+ trades_p: 'trade_p.subscribe',
11
13
  market24h: 'market24h.subscribe',
12
- spot_market24h: 'spot_market24h.subscribe'
14
+ spot_market24h: 'spot_market24h.subscribe',
15
+ perp_market24h_pack_p: 'perp_market24h_pack_p.subscribe'
13
16
  } as any
14
17
 
15
18
  protected mapToSubscribeMessages(filters: Filter<string>[]) {
16
19
  let id = 0
17
20
  return filters
21
+
18
22
  .map((filter) => {
19
- if (filter.symbols !== undefined && filter.channel !== 'market24h' && filter.channel !== 'spot_market24h') {
23
+ if (
24
+ filter.symbols !== undefined &&
25
+ filter.channel !== 'market24h' &&
26
+ filter.channel !== 'spot_market24h' &&
27
+ filter.channel !== 'perp_market24h_pack_p'
28
+ ) {
20
29
  return filter.symbols.map((symbol) => {
21
30
  return {
22
31
  id: id++,