tardis-dev 16.4.1 → 16.4.2

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 (55) hide show
  1. package/dist/exchangedetails.d.ts +1 -1
  2. package/dist/exchangedetails.d.ts.map +1 -1
  3. package/dist/handy.d.ts +9 -4
  4. package/dist/handy.d.ts.map +1 -1
  5. package/dist/handy.js +17 -12
  6. package/dist/handy.js.map +1 -1
  7. package/dist/mappers/binanceeuropeanoptions.d.ts.map +1 -1
  8. package/dist/mappers/binanceeuropeanoptions.js +30 -70
  9. package/dist/mappers/binanceeuropeanoptions.js.map +1 -1
  10. package/dist/mappers/bitget.js +5 -5
  11. package/dist/mappers/bitget.js.map +1 -1
  12. package/dist/mappers/bitmex.js +5 -5
  13. package/dist/mappers/bitmex.js.map +1 -1
  14. package/dist/mappers/bullish.js +15 -15
  15. package/dist/mappers/bullish.js.map +1 -1
  16. package/dist/mappers/bybit.js +16 -16
  17. package/dist/mappers/bybit.js.map +1 -1
  18. package/dist/mappers/deribit.js +12 -12
  19. package/dist/mappers/deribit.js.map +1 -1
  20. package/dist/mappers/ftx.js +5 -5
  21. package/dist/mappers/ftx.js.map +1 -1
  22. package/dist/mappers/huobi.d.ts.map +1 -1
  23. package/dist/mappers/huobi.js +20 -20
  24. package/dist/mappers/huobi.js.map +1 -1
  25. package/dist/mappers/index.d.ts.map +1 -1
  26. package/dist/mappers/index.js +4 -2
  27. package/dist/mappers/index.js.map +1 -1
  28. package/dist/mappers/kraken.js +5 -5
  29. package/dist/mappers/kraken.js.map +1 -1
  30. package/dist/mappers/kucoinfutures.d.ts.map +1 -1
  31. package/dist/mappers/kucoinfutures.js +2 -2
  32. package/dist/mappers/kucoinfutures.js.map +1 -1
  33. package/dist/mappers/lighter.js +5 -5
  34. package/dist/mappers/lighter.js.map +1 -1
  35. package/dist/mappers/okex.js +38 -38
  36. package/dist/mappers/okex.js.map +1 -1
  37. package/dist/mappers/serum.js +5 -5
  38. package/dist/mappers/serum.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/exchangedetails.ts +1 -1
  41. package/src/handy.ts +18 -14
  42. package/src/mappers/binanceeuropeanoptions.ts +30 -79
  43. package/src/mappers/bitget.ts +5 -5
  44. package/src/mappers/bitmex.ts +5 -5
  45. package/src/mappers/bullish.ts +15 -15
  46. package/src/mappers/bybit.ts +16 -16
  47. package/src/mappers/deribit.ts +12 -12
  48. package/src/mappers/ftx.ts +5 -5
  49. package/src/mappers/huobi.ts +20 -20
  50. package/src/mappers/index.ts +4 -2
  51. package/src/mappers/kraken.ts +5 -5
  52. package/src/mappers/kucoinfutures.ts +2 -2
  53. package/src/mappers/lighter.ts +5 -5
  54. package/src/mappers/okex.ts +38 -38
  55. package/src/mappers/serum.ts +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"serum.js","sourceRoot":"","sources":["../../src/mappers/serum.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serum.js","sourceRoot":"","sources":["../../src/mappers/serum.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-dev",
3
- "version": "16.4.1",
3
+ "version": "16.4.2",
4
4
  "engines": {
5
5
  "node": ">=25"
6
6
  },
@@ -10,7 +10,7 @@ export async function getExchangeDetails<T extends Exchange>(exchange: T) {
10
10
  return data as ExchangeDetails<T>
11
11
  }
12
12
 
13
- export type SymbolType = 'spot' | 'future' | 'perpetual' | 'option' | 'combo'
13
+ export type SymbolType = 'spot' | 'future' | 'perpetual' | 'option' | 'combo' | 'prediction'
14
14
 
15
15
  export type DatasetType =
16
16
  | 'trades'
package/src/handy.ts CHANGED
@@ -771,38 +771,42 @@ export function decimalPlaces(n: number) {
771
771
  }
772
772
 
773
773
  /**
774
- * Parses optional numeric fields where `undefined`, `null`, `NaN`, `Infinity`, and `-Infinity` are treated as not valid and mapped to `undefined`.
775
- * `0` is valid and preserved. Use for nullable/optional numeric fields such as open interest, funding rates, and greeks.
774
+ * Parses optional numeric fields where:
775
+ * * `0` **is valid and preserved**
776
+ * * `undefined`, `null`, `NaN`, `Infinity`, and `-Infinity` are treated as not valid and mapped to `undefined`
777
+ *
778
+ * Use for nullable/optional numeric fields such as open interest, funding rates, and greeks.
776
779
  */
777
780
  export function asNumberOrUndefined(val: string | number | undefined | null) {
778
781
  if (val === undefined || val === null || val === '') {
779
782
  return
780
783
  }
781
784
 
785
+ if (typeof val === 'number') {
786
+ return Number.isFinite(val) ? val : undefined
787
+ }
788
+
782
789
  const asNumber = Number(val)
783
790
  return Number.isFinite(asNumber) ? asNumber : undefined
784
791
  }
785
792
 
786
793
  /**
787
- * Parses optional numeric fields where `0`, `undefined`, `null`, `NaN`, `Infinity`, and `-Infinity` are treated as not valid and mapped to `undefined`.
794
+ * Parses optional numeric fields where:
795
+ * * `0`, `undefined`, `null`, `NaN`, `Infinity`, and `-Infinity` are treated as not valid and mapped to `undefined`.
796
+ *
788
797
  * Use for empty quote/top-of-book values that exchanges encode as zero.
789
798
  */
790
- export function asNumberIfValid(val: string | number | undefined | null) {
791
- if (val === undefined || val === null) {
792
- return
793
- }
794
-
795
- var asNumber = Number(val)
796
-
797
- if (isNaN(asNumber) || isFinite(asNumber) === false) {
799
+ export function asNonZeroNumberOrUndefined(val: string | number | undefined | null) {
800
+ if (val === undefined || val === null || val === '' || val === 0) {
798
801
  return
799
802
  }
800
803
 
801
- if (asNumber === 0) {
802
- return
804
+ if (typeof val === 'number') {
805
+ return Number.isFinite(val) ? val : undefined
803
806
  }
804
807
 
805
- return asNumber
808
+ const asNumber = Number(val)
809
+ return Number.isFinite(asNumber) && asNumber !== 0 ? asNumber : undefined
806
810
  }
807
811
 
808
812
  export function upperCaseSymbols(symbols?: string[]) {
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, lowerCaseSymbols, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, lowerCaseSymbols, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, OptionSummary, Trade } from '../types.ts'
3
3
  import { Mapper } from './mapper.ts'
4
4
 
@@ -285,34 +285,10 @@ export class BinanceEuropeanOptionSummaryMapper implements Mapper<'binance-europ
285
285
 
286
286
  const underlyingIndex = `${base}USDT`
287
287
 
288
- let bestBidPrice = asNumberIfValid(optionInfo.bo)
289
- if (bestBidPrice === 0) {
290
- bestBidPrice = undefined
291
- }
292
-
293
- let bestBidAmount = asNumberIfValid(optionInfo.bq)
294
- if (bestBidAmount === 0) {
295
- bestBidAmount = undefined
296
- }
297
- let bestAskPrice = asNumberIfValid(optionInfo.ao)
298
- if (bestAskPrice === 0) {
299
- bestAskPrice = undefined
300
- }
301
-
302
- let bestAskAmount = asNumberIfValid(optionInfo.aq)
303
- if (bestAskAmount === 0) {
304
- bestAskAmount = undefined
305
- }
306
-
307
- let bestBidIV = bestBidPrice !== undefined ? asNumberIfValid(optionInfo.b) : undefined
308
- if (bestBidIV === -1) {
309
- bestBidIV = undefined
310
- }
311
-
312
- let bestAskIV = bestAskPrice !== undefined ? asNumberIfValid(optionInfo.a) : undefined
313
- if (bestAskIV === -1) {
314
- bestAskIV = undefined
315
- }
288
+ const bestBidPrice = asNonZeroNumberOrUndefined(optionInfo.bo)
289
+ const bestBidIV = bestBidPrice !== undefined ? asNonZeroNumberOrUndefined(optionInfo.b) : undefined
290
+ const bestAskPrice = asNonZeroNumberOrUndefined(optionInfo.ao)
291
+ const bestAskIV = bestAskPrice !== undefined ? asNonZeroNumberOrUndefined(optionInfo.a) : undefined
316
292
 
317
293
  const optionSummary: OptionSummary = {
318
294
  type: 'option_summary',
@@ -323,24 +299,24 @@ export class BinanceEuropeanOptionSummaryMapper implements Mapper<'binance-europ
323
299
  expirationDate,
324
300
 
325
301
  bestBidPrice,
326
- bestBidAmount,
327
- bestBidIV,
302
+ bestBidAmount: asNonZeroNumberOrUndefined(optionInfo.bq),
303
+ bestBidIV: bestBidIV === -1 ? undefined : bestBidIV,
328
304
 
329
305
  bestAskPrice,
330
- bestAskAmount,
331
- bestAskIV,
306
+ bestAskAmount: asNonZeroNumberOrUndefined(optionInfo.aq),
307
+ bestAskIV: bestAskIV === -1 ? undefined : bestAskIV,
332
308
 
333
- lastPrice: asNumberIfValid(optionInfo.c),
309
+ lastPrice: asNonZeroNumberOrUndefined(optionInfo.c),
334
310
 
335
311
  openInterest: this._openInterests.get(optionInfo.s),
336
312
 
337
- markPrice: asNumberIfValid(optionInfo.mp),
313
+ markPrice: asNonZeroNumberOrUndefined(optionInfo.mp),
338
314
  markIV: undefined,
339
315
 
340
- delta: asNumberIfValid(optionInfo.d),
341
- gamma: asNumberIfValid(optionInfo.g),
342
- vega: asNumberIfValid(optionInfo.v),
343
- theta: asNumberIfValid(optionInfo.t),
316
+ delta: asNonZeroNumberOrUndefined(optionInfo.d),
317
+ gamma: asNonZeroNumberOrUndefined(optionInfo.g),
318
+ vega: asNonZeroNumberOrUndefined(optionInfo.v),
319
+ theta: asNonZeroNumberOrUndefined(optionInfo.t),
344
320
  rho: undefined,
345
321
 
346
322
  underlyingPrice: this._indexPrices.get(underlyingIndex),
@@ -434,43 +410,18 @@ export class BinanceEuropeanOptionSummaryMapperV2 implements Mapper<'binance-eur
434
410
  const isPut = optionType === 'P'
435
411
  const underlyingIndex = `${base}USDT`
436
412
 
437
- let bestBidPrice = asNumberIfValid(markData.bo)
438
- if (bestBidPrice === 0) {
439
- bestBidPrice = undefined
440
- }
441
-
442
- let bestBidAmount = asNumberIfValid(markData.bq)
443
- if (bestBidAmount === 0) {
444
- bestBidAmount = undefined
445
- }
446
-
447
- let bestAskPrice = asNumberIfValid(markData.ao)
448
- if (bestAskPrice === 0) {
449
- bestAskPrice = undefined
450
- }
451
-
452
- let bestAskAmount = asNumberIfValid(markData.aq)
453
- if (bestAskAmount === 0) {
454
- bestAskAmount = undefined
455
- }
456
-
457
- let bestBidIV = bestBidPrice !== undefined ? asNumberIfValid(markData.b) : undefined
458
- if (bestBidIV === -1) {
459
- bestBidIV = undefined
460
- }
461
-
462
- let bestAskIV = bestAskPrice !== undefined ? asNumberIfValid(markData.a) : undefined
463
- if (bestAskIV === -1) {
464
- bestAskIV = undefined
465
- }
413
+ const bestBidPrice = asNonZeroNumberOrUndefined(markData.bo)
414
+ const bestBidIV = bestBidPrice !== undefined ? asNonZeroNumberOrUndefined(markData.b) : undefined
415
+ const bestAskPrice = asNonZeroNumberOrUndefined(markData.ao)
416
+ const bestAskIV = bestAskPrice !== undefined ? asNonZeroNumberOrUndefined(markData.a) : undefined
466
417
 
467
- const markPrice = asNumberIfValid(markData.mp)
468
- const markIV = asNumberIfValid(markData.vo)
469
- const delta = asNumberIfValid(markData.d)
470
- const gamma = asNumberIfValid(markData.g)
471
- const vega = asNumberIfValid(markData.v)
472
- const theta = asNumberIfValid(markData.t)
473
- const underlyingPrice = asNumberIfValid(markData.i) // Index price is included in mark price data
418
+ const markPrice = asNonZeroNumberOrUndefined(markData.mp)
419
+ const markIV = asNonZeroNumberOrUndefined(markData.vo)
420
+ const delta = asNonZeroNumberOrUndefined(markData.d)
421
+ const gamma = asNonZeroNumberOrUndefined(markData.g)
422
+ const vega = asNonZeroNumberOrUndefined(markData.v)
423
+ const theta = asNonZeroNumberOrUndefined(markData.t)
424
+ const underlyingPrice = asNonZeroNumberOrUndefined(markData.i) // Index price is included in mark price data
474
425
 
475
426
  const optionSummary: OptionSummary = {
476
427
  type: 'option_summary',
@@ -481,12 +432,12 @@ export class BinanceEuropeanOptionSummaryMapperV2 implements Mapper<'binance-eur
481
432
  expirationDate,
482
433
 
483
434
  bestBidPrice,
484
- bestBidAmount,
485
- bestBidIV,
435
+ bestBidAmount: asNonZeroNumberOrUndefined(markData.bq),
436
+ bestBidIV: bestBidIV === -1 ? undefined : bestBidIV,
486
437
 
487
438
  bestAskPrice,
488
- bestAskAmount,
489
- bestAskIV,
439
+ bestAskAmount: asNonZeroNumberOrUndefined(markData.aq),
440
+ bestAskIV: bestAskIV === -1 ? undefined : bestAskIV,
490
441
 
491
442
  lastPrice: this._lastPrices.get(markData.s),
492
443
 
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Exchange, Liquidation, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -248,10 +248,10 @@ export class BitgetV3BookTickerMapper implements Mapper<'bitget' | 'bitget-futur
248
248
  type: 'book_ticker',
249
249
  symbol: message.arg.symbol,
250
250
  exchange: this._exchange,
251
- askAmount: bboMessage.a[0] ? asNumberIfValid(bboMessage.a[0][1]) : undefined,
252
- askPrice: bboMessage.a[0] ? asNumberIfValid(bboMessage.a[0][0]) : undefined,
253
- bidPrice: bboMessage.b[0] ? asNumberIfValid(bboMessage.b[0][0]) : undefined,
254
- bidAmount: bboMessage.b[0] ? asNumberIfValid(bboMessage.b[0][1]) : undefined,
251
+ askPrice: asNonZeroNumberOrUndefined(bboMessage.a[0]?.[0]),
252
+ askAmount: asNonZeroNumberOrUndefined(bboMessage.a[0]?.[1]),
253
+ bidPrice: asNonZeroNumberOrUndefined(bboMessage.b[0]?.[0]),
254
+ bidAmount: asNonZeroNumberOrUndefined(bboMessage.b[0]?.[1]),
255
255
  timestamp: new Date(Number(bboMessage.ts)),
256
256
  localTimestamp
257
257
  }
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookPriceLevel, BookTicker, DerivativeTicker, FilterForExchange, Liquidation, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -267,11 +267,11 @@ export const bitmexBookTickerMapper: Mapper<'bitmex', BookTicker> = {
267
267
  type: 'book_ticker',
268
268
  symbol: bitmexQuote.symbol,
269
269
  exchange: 'bitmex',
270
- askAmount: asNumberIfValid(bitmexQuote.askSize),
271
- askPrice: asNumberIfValid(bitmexQuote.askPrice),
270
+ askAmount: asNonZeroNumberOrUndefined(bitmexQuote.askSize),
271
+ askPrice: asNonZeroNumberOrUndefined(bitmexQuote.askPrice),
272
272
 
273
- bidPrice: asNumberIfValid(bitmexQuote.bidPrice),
274
- bidAmount: asNumberIfValid(bitmexQuote.bidSize),
273
+ bidPrice: asNonZeroNumberOrUndefined(bitmexQuote.bidPrice),
274
+ bidAmount: asNonZeroNumberOrUndefined(bitmexQuote.bidSize),
275
275
  timestamp: new Date(bitmexQuote.timestamp),
276
276
  localTimestamp: localTimestamp
277
277
  }
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, asNumberOrUndefined } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, asNumberOrUndefined } from '../handy.ts'
2
2
  import { BookChange, BookPriceLevel, BookTicker, DerivativeTicker, OptionSummary, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -102,10 +102,10 @@ export class BullishBookTickerMapper implements Mapper<'bullish', BookTicker> {
102
102
  type: 'book_ticker',
103
103
  symbol: message.data.symbol,
104
104
  exchange: 'bullish',
105
- bidPrice: asNumberIfValid(message.data.bid[0]),
106
- bidAmount: asNumberIfValid(message.data.bid[1]),
107
- askPrice: asNumberIfValid(message.data.ask[0]),
108
- askAmount: asNumberIfValid(message.data.ask[1]),
105
+ bidPrice: asNonZeroNumberOrUndefined(message.data.bid[0]),
106
+ bidAmount: asNonZeroNumberOrUndefined(message.data.bid[1]),
107
+ askPrice: asNonZeroNumberOrUndefined(message.data.ask[0]),
108
+ askAmount: asNonZeroNumberOrUndefined(message.data.ask[1]),
109
109
  timestamp: new Date(message.data.datetime),
110
110
  localTimestamp
111
111
  }
@@ -145,7 +145,7 @@ export class BullishDerivativeTickerMapper implements Mapper<'bullish', Derivati
145
145
 
146
146
  *map(message: BullishDerivativeTickerMessage | BullishIndexPriceMessage, localTimestamp: Date): IterableIterator<DerivativeTicker> {
147
147
  if (message.dataType === 'V1TAIndexPrice') {
148
- const price = asNumberIfValid(message.data.price)
148
+ const price = asNonZeroNumberOrUndefined(message.data.price)
149
149
  if (price !== undefined) {
150
150
  this.indexPrices.set(message.data.assetSymbol, {
151
151
  price,
@@ -160,8 +160,8 @@ export class BullishDerivativeTickerMapper implements Mapper<'bullish', Derivati
160
160
  const indexAsset = message.data.symbol.split('-')[0]
161
161
  const indexPrice = this.indexPrices.get(indexAsset)
162
162
 
163
- pendingTickerInfo.updateLastPrice(asNumberIfValid(message.data.last))
164
- pendingTickerInfo.updateMarkPrice(asNumberIfValid(message.data.markPrice))
163
+ pendingTickerInfo.updateLastPrice(asNonZeroNumberOrUndefined(message.data.last))
164
+ pendingTickerInfo.updateMarkPrice(asNonZeroNumberOrUndefined(message.data.markPrice))
165
165
  pendingTickerInfo.updateFundingRate(asNumberOrUndefined(message.data.fundingRate))
166
166
  pendingTickerInfo.updateOpenInterest(asNumberOrUndefined(message.data.openInterest))
167
167
  pendingTickerInfo.updateIndexPrice(indexPrice?.price)
@@ -205,7 +205,7 @@ export class BullishOptionSummaryMapper implements Mapper<'bullish', OptionSumma
205
205
 
206
206
  *map(message: BullishOptionTickerMessage | BullishIndexPriceMessage, localTimestamp: Date): IterableIterator<OptionSummary> {
207
207
  if (message.dataType === 'V1TAIndexPrice') {
208
- const price = asNumberIfValid(message.data.price)
208
+ const price = asNonZeroNumberOrUndefined(message.data.price)
209
209
  if (price !== undefined) {
210
210
  this.indexPrices.set(message.data.assetSymbol, {
211
211
  price,
@@ -229,16 +229,16 @@ export class BullishOptionSummaryMapper implements Mapper<'bullish', OptionSumma
229
229
  optionType: optionType === 'P' ? 'put' : 'call',
230
230
  strikePrice: Number(strikePriceText),
231
231
  expirationDate,
232
- bestBidPrice: asNumberIfValid(message.data.bestBid),
233
- bestBidAmount: asNumberIfValid(message.data.bidVolume),
232
+ bestBidPrice: asNonZeroNumberOrUndefined(message.data.bestBid),
233
+ bestBidAmount: asNonZeroNumberOrUndefined(message.data.bidVolume),
234
234
  bestBidIV: undefined,
235
- bestAskPrice: asNumberIfValid(message.data.bestAsk),
236
- bestAskAmount: asNumberIfValid(message.data.askVolume),
235
+ bestAskPrice: asNonZeroNumberOrUndefined(message.data.bestAsk),
236
+ bestAskAmount: asNonZeroNumberOrUndefined(message.data.askVolume),
237
237
  bestAskIV: undefined,
238
- lastPrice: asNumberIfValid(message.data.last),
238
+ lastPrice: asNonZeroNumberOrUndefined(message.data.last),
239
239
  openInterest: asNumberOrUndefined(message.data.openInterest),
240
240
  markPrice: asNumberOrUndefined(message.data.markPrice),
241
- markIV: asNumberIfValid(message.data.impliedVolatility),
241
+ markIV: asNonZeroNumberOrUndefined(message.data.impliedVolatility),
242
242
  delta: asNumberOrUndefined(message.data.delta),
243
243
  gamma: asNumberOrUndefined(message.data.gamma),
244
244
  vega: asNumberOrUndefined(message.data.vega),
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Exchange, Liquidation, OptionSummary, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -332,27 +332,27 @@ export class BybitV5OptionSummaryMapper implements Mapper<'bybit-options', Optio
332
332
  strikePrice,
333
333
  expirationDate,
334
334
 
335
- bestBidPrice: asNumberIfValid(message.data.bidPrice),
336
- bestBidAmount: asNumberIfValid(message.data.bidSize),
337
- bestBidIV: asNumberIfValid(message.data.bidIv),
335
+ bestBidPrice: asNonZeroNumberOrUndefined(message.data.bidPrice),
336
+ bestBidAmount: asNonZeroNumberOrUndefined(message.data.bidSize),
337
+ bestBidIV: asNonZeroNumberOrUndefined(message.data.bidIv),
338
338
 
339
- bestAskPrice: asNumberIfValid(message.data.askPrice),
340
- bestAskAmount: asNumberIfValid(message.data.askSize),
341
- bestAskIV: asNumberIfValid(message.data.askIv),
339
+ bestAskPrice: asNonZeroNumberOrUndefined(message.data.askPrice),
340
+ bestAskAmount: asNonZeroNumberOrUndefined(message.data.askSize),
341
+ bestAskIV: asNonZeroNumberOrUndefined(message.data.askIv),
342
342
 
343
- lastPrice: asNumberIfValid(message.data.lastPrice),
344
- openInterest: asNumberIfValid(message.data.openInterest),
343
+ lastPrice: asNonZeroNumberOrUndefined(message.data.lastPrice),
344
+ openInterest: asNonZeroNumberOrUndefined(message.data.openInterest),
345
345
 
346
- markPrice: asNumberIfValid(message.data.markPrice),
347
- markIV: asNumberIfValid(message.data.markPriceIv),
346
+ markPrice: asNonZeroNumberOrUndefined(message.data.markPrice),
347
+ markIV: asNonZeroNumberOrUndefined(message.data.markPriceIv),
348
348
 
349
- delta: asNumberIfValid(message.data.delta),
350
- gamma: asNumberIfValid(message.data.gamma),
351
- vega: asNumberIfValid(message.data.vega),
352
- theta: asNumberIfValid(message.data.theta),
349
+ delta: asNonZeroNumberOrUndefined(message.data.delta),
350
+ gamma: asNonZeroNumberOrUndefined(message.data.gamma),
351
+ vega: asNonZeroNumberOrUndefined(message.data.vega),
352
+ theta: asNonZeroNumberOrUndefined(message.data.theta),
353
353
  rho: undefined,
354
354
 
355
- underlyingPrice: asNumberIfValid(message.data.underlyingPrice),
355
+ underlyingPrice: asNonZeroNumberOrUndefined(message.data.underlyingPrice),
356
356
  underlyingIndex: '',
357
357
  timestamp: new Date(message.ts),
358
358
  localTimestamp: localTimestamp
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Liquidation, OptionSummary, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -200,15 +200,15 @@ export class DeribitOptionSummaryMapper implements Mapper<'deribit', OptionSumma
200
200
  strikePrice,
201
201
  expirationDate,
202
202
 
203
- bestBidPrice: asNumberIfValid(optionInfo.best_bid_price),
204
- bestBidAmount: asNumberIfValid(optionInfo.best_bid_amount),
205
- bestBidIV: asNumberIfValid(optionInfo.bid_iv),
203
+ bestBidPrice: asNonZeroNumberOrUndefined(optionInfo.best_bid_price),
204
+ bestBidAmount: asNonZeroNumberOrUndefined(optionInfo.best_bid_amount),
205
+ bestBidIV: asNonZeroNumberOrUndefined(optionInfo.bid_iv),
206
206
 
207
- bestAskPrice: asNumberIfValid(optionInfo.best_ask_price),
208
- bestAskAmount: asNumberIfValid(optionInfo.best_ask_amount),
209
- bestAskIV: asNumberIfValid(optionInfo.ask_iv),
207
+ bestAskPrice: asNonZeroNumberOrUndefined(optionInfo.best_ask_price),
208
+ bestAskAmount: asNonZeroNumberOrUndefined(optionInfo.best_ask_amount),
209
+ bestAskIV: asNonZeroNumberOrUndefined(optionInfo.ask_iv),
210
210
 
211
- lastPrice: asNumberIfValid(optionInfo.last_price),
211
+ lastPrice: asNonZeroNumberOrUndefined(optionInfo.last_price),
212
212
  openInterest: optionInfo.open_interest,
213
213
 
214
214
  markPrice: optionInfo.mark_price,
@@ -308,10 +308,10 @@ export const deribitBookTickerMapper: Mapper<'deribit', BookTicker> = {
308
308
  symbol: deribitTicker.instrument_name.toUpperCase(),
309
309
  exchange: 'deribit',
310
310
 
311
- askAmount: asNumberIfValid(deribitTicker.best_ask_amount),
312
- askPrice: asNumberIfValid(deribitTicker.best_ask_price),
313
- bidPrice: asNumberIfValid(deribitTicker.best_bid_price),
314
- bidAmount: asNumberIfValid(deribitTicker.best_bid_amount),
311
+ askAmount: asNonZeroNumberOrUndefined(deribitTicker.best_ask_amount),
312
+ askPrice: asNonZeroNumberOrUndefined(deribitTicker.best_ask_price),
313
+ bidPrice: asNonZeroNumberOrUndefined(deribitTicker.best_bid_price),
314
+ bidAmount: asNonZeroNumberOrUndefined(deribitTicker.best_bid_amount),
315
315
 
316
316
  timestamp: new Date(deribitTicker.timestamp),
317
317
  localTimestamp: localTimestamp
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, parseμs, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, parseμs, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Exchange, Liquidation, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -229,11 +229,11 @@ export class FTXBookTickerMapper implements Mapper<'ftx' | 'ftx-us', BookTicker>
229
229
  symbol: ftxTicker.market,
230
230
  exchange: this._exchange,
231
231
 
232
- askAmount: asNumberIfValid(ftxTicker.data.askSize),
233
- askPrice: asNumberIfValid(ftxTicker.data.ask),
232
+ askAmount: asNonZeroNumberOrUndefined(ftxTicker.data.askSize),
233
+ askPrice: asNonZeroNumberOrUndefined(ftxTicker.data.ask),
234
234
 
235
- bidPrice: asNumberIfValid(ftxTicker.data.bid),
236
- bidAmount: asNumberIfValid(ftxTicker.data.bidSize),
235
+ bidPrice: asNonZeroNumberOrUndefined(ftxTicker.data.bid),
236
+ bidAmount: asNonZeroNumberOrUndefined(ftxTicker.data.bidSize),
237
237
  timestamp,
238
238
  localTimestamp: localTimestamp
239
239
  }
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, CircularBuffer, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, CircularBuffer, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Exchange, FilterForExchange, Liquidation, OptionSummary, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -489,26 +489,26 @@ export class HuobiOptionsSummaryMapper implements Mapper<'huobi-dm-options', Opt
489
489
  strikePrice: Number(symbolParts[4]),
490
490
  expirationDate,
491
491
 
492
- bestBidPrice: asNumberIfValid(marketIndexMessage.data.bid_one),
492
+ bestBidPrice: asNonZeroNumberOrUndefined(marketIndexMessage.data.bid_one),
493
493
 
494
494
  bestBidAmount: undefined,
495
- bestBidIV: asNumberIfValid(marketIndexMessage.data.iv_bid_one),
495
+ bestBidIV: asNonZeroNumberOrUndefined(marketIndexMessage.data.iv_bid_one),
496
496
 
497
- bestAskPrice: asNumberIfValid(marketIndexMessage.data.ask_one),
497
+ bestAskPrice: asNonZeroNumberOrUndefined(marketIndexMessage.data.ask_one),
498
498
  bestAskAmount: undefined,
499
- bestAskIV: asNumberIfValid(marketIndexMessage.data.iv_ask_one),
499
+ bestAskIV: asNonZeroNumberOrUndefined(marketIndexMessage.data.iv_ask_one),
500
500
 
501
- lastPrice: asNumberIfValid(marketIndexMessage.data.last_price),
501
+ lastPrice: asNonZeroNumberOrUndefined(marketIndexMessage.data.last_price),
502
502
 
503
503
  openInterest,
504
504
 
505
- markPrice: marketIndexMessage.data.mark_price > 0 ? asNumberIfValid(marketIndexMessage.data.mark_price) : undefined,
506
- markIV: asNumberIfValid(marketIndexMessage.data.iv_mark_price),
505
+ markPrice: marketIndexMessage.data.mark_price > 0 ? asNonZeroNumberOrUndefined(marketIndexMessage.data.mark_price) : undefined,
506
+ markIV: asNonZeroNumberOrUndefined(marketIndexMessage.data.iv_mark_price),
507
507
 
508
- delta: asNumberIfValid(marketIndexMessage.data.delta),
509
- gamma: asNumberIfValid(marketIndexMessage.data.gamma),
510
- vega: asNumberIfValid(marketIndexMessage.data.vega),
511
- theta: asNumberIfValid(marketIndexMessage.data.theta),
508
+ delta: asNonZeroNumberOrUndefined(marketIndexMessage.data.delta),
509
+ gamma: asNonZeroNumberOrUndefined(marketIndexMessage.data.gamma),
510
+ vega: asNonZeroNumberOrUndefined(marketIndexMessage.data.vega),
511
+ theta: asNonZeroNumberOrUndefined(marketIndexMessage.data.theta),
512
512
  rho: undefined,
513
513
 
514
514
  underlyingPrice: lastUnderlyingPrice,
@@ -555,11 +555,11 @@ export class HuobiBookTickerMapper implements Mapper<'huobi' | 'huobi-dm' | 'huo
555
555
  symbol,
556
556
  exchange: this._exchange,
557
557
 
558
- askAmount: asNumberIfValid(message.tick.askSize),
559
- askPrice: asNumberIfValid(message.tick.ask),
558
+ askAmount: asNonZeroNumberOrUndefined(message.tick.askSize),
559
+ askPrice: asNonZeroNumberOrUndefined(message.tick.ask),
560
560
 
561
- bidPrice: asNumberIfValid(message.tick.bid),
562
- bidAmount: asNumberIfValid(message.tick.bidSize),
561
+ bidPrice: asNonZeroNumberOrUndefined(message.tick.bid),
562
+ bidAmount: asNonZeroNumberOrUndefined(message.tick.bidSize),
563
563
  timestamp: new Date(message.tick.quoteTime),
564
564
  localTimestamp: localTimestamp
565
565
  }
@@ -569,11 +569,11 @@ export class HuobiBookTickerMapper implements Mapper<'huobi' | 'huobi-dm' | 'huo
569
569
  symbol,
570
570
  exchange: this._exchange,
571
571
 
572
- askAmount: message.tick.ask !== undefined && message.tick.ask !== null ? asNumberIfValid(message.tick.ask[1]) : undefined,
573
- askPrice: message.tick.ask !== undefined && message.tick.ask !== null ? asNumberIfValid(message.tick.ask[0]) : undefined,
572
+ askAmount: asNonZeroNumberOrUndefined(message.tick.ask?.[1]),
573
+ askPrice: asNonZeroNumberOrUndefined(message.tick.ask?.[0]),
574
574
 
575
- bidPrice: message.tick.bid !== undefined && message.tick.bid !== null ? asNumberIfValid(message.tick.bid[0]) : undefined,
576
- bidAmount: message.tick.bid !== undefined && message.tick.bid !== null ? asNumberIfValid(message.tick.bid[1]) : undefined,
575
+ bidPrice: asNonZeroNumberOrUndefined(message.tick.bid?.[0]),
576
+ bidAmount: asNonZeroNumberOrUndefined(message.tick.bid?.[1]),
577
577
  timestamp: new Date(message.tick.ts),
578
578
  localTimestamp: localTimestamp
579
579
  }
@@ -183,6 +183,7 @@ const isRealTime = (date: Date) => {
183
183
 
184
184
  const OKEX_V5_API_SWITCH_DATE = new Date('2021-12-23T00:00:00.000Z')
185
185
  const OKEX_V5_TBT_BOOK_TICKER_RELEASE_DATE = new Date('2022-05-06T00:00:00.000Z')
186
+ const OKEX_PUBLIC_BOOKS_SWITCH_DATE = new Date('2026-05-21T00:00:00.000Z')
186
187
  const shouldUseOkexV5Mappers = (localTimestamp: Date) => {
187
188
  return isRealTime(localTimestamp) || localTimestamp.valueOf() >= OKEX_V5_API_SWITCH_DATE.valueOf()
188
189
  }
@@ -200,8 +201,9 @@ const shouldUsePoloniexV2Mappers = (localTimestamp: Date) => {
200
201
  // see https://status.tardis.dev/incidents/ryjyv8tgdgkj
201
202
  const shouldUseOKXPublicBooksChannel = (localTimestamp: Date) => {
202
203
  return (
203
- localTimestamp.valueOf() >= new Date('2023-02-25T00:00:00.000Z').valueOf() &&
204
- localTimestamp.valueOf() < new Date('2023-03-09T00:00:00.000Z').valueOf()
204
+ (localTimestamp.valueOf() >= new Date('2023-02-25T00:00:00.000Z').valueOf() &&
205
+ localTimestamp.valueOf() < new Date('2023-03-09T00:00:00.000Z').valueOf()) ||
206
+ localTimestamp.valueOf() >= OKEX_PUBLIC_BOOKS_SWITCH_DATE.valueOf()
205
207
  )
206
208
  }
207
209
 
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid, upperCaseSymbols } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, Trade } from '../types.ts'
3
3
  import { Mapper } from './mapper.ts'
4
4
 
@@ -158,11 +158,11 @@ export const krakenBookTickerMapper: Mapper<'kraken', BookTicker> = {
158
158
  symbol: message[3],
159
159
  exchange: 'kraken',
160
160
 
161
- askAmount: asNumberIfValid(askVolume),
162
- askPrice: asNumberIfValid(ask),
161
+ askAmount: asNonZeroNumberOrUndefined(askVolume),
162
+ askPrice: asNonZeroNumberOrUndefined(ask),
163
163
 
164
- bidPrice: asNumberIfValid(bid),
165
- bidAmount: asNumberIfValid(bidVolume),
164
+ bidPrice: asNonZeroNumberOrUndefined(bid),
165
+ bidAmount: asNonZeroNumberOrUndefined(bidVolume),
166
166
  timestamp,
167
167
  localTimestamp: localTimestamp
168
168
  }
@@ -1,5 +1,5 @@
1
1
  import { debug } from '../debug.ts'
2
- import { asNumberIfValid, CircularBuffer, upperCaseSymbols } from '../handy.ts'
2
+ import { asNonZeroNumberOrUndefined, CircularBuffer, upperCaseSymbols } from '../handy.ts'
3
3
  import { BookChange, BookTicker, DerivativeTicker, Trade } from '../types.ts'
4
4
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
5
5
 
@@ -310,7 +310,7 @@ export class KucoinFuturesDerivativeTickerMapper implements Mapper<'kucoin-futur
310
310
  }
311
311
 
312
312
  if (message.subject === 'contractDetails') {
313
- const openInterestValue = asNumberIfValid(message.data.openInterest)
313
+ const openInterestValue = asNonZeroNumberOrUndefined(message.data.openInterest)
314
314
  if (openInterestValue === undefined) {
315
315
  return
316
316
  }
@@ -1,4 +1,4 @@
1
- import { asNumberIfValid } from '../handy.ts'
1
+ import { asNonZeroNumberOrUndefined } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Liquidation, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
4
 
@@ -144,10 +144,10 @@ export class LighterBookTickerMapper implements Mapper<'lighter', BookTicker> {
144
144
  type: 'book_ticker',
145
145
  symbol,
146
146
  exchange: 'lighter',
147
- askAmount: asNumberIfValid(message.ticker?.a?.size),
148
- askPrice: asNumberIfValid(message.ticker?.a?.price),
149
- bidPrice: asNumberIfValid(message.ticker?.b?.price),
150
- bidAmount: asNumberIfValid(message.ticker?.b?.size),
147
+ askAmount: asNonZeroNumberOrUndefined(message.ticker?.a?.size),
148
+ askPrice: asNonZeroNumberOrUndefined(message.ticker?.a?.price),
149
+ bidPrice: asNonZeroNumberOrUndefined(message.ticker?.b?.price),
150
+ bidAmount: asNonZeroNumberOrUndefined(message.ticker?.b?.size),
151
151
  timestamp: new Date(message.timestamp),
152
152
  localTimestamp
153
153
  }