tardis-machine 18.3.8 → 18.4.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 (100) hide show
  1. package/dist/ws/subscriptionsmappers.d.ts.map +1 -1
  2. package/dist/ws/subscriptionsmappers.js +7 -0
  3. package/dist/ws/subscriptionsmappers.js.map +1 -1
  4. package/node_modules/tardis-dev/dist/consts.d.ts +7 -5
  5. package/node_modules/tardis-dev/dist/consts.d.ts.map +1 -1
  6. package/node_modules/tardis-dev/dist/consts.js +33 -5
  7. package/node_modules/tardis-dev/dist/consts.js.map +1 -1
  8. package/node_modules/tardis-dev/dist/handy.d.ts +1 -0
  9. package/node_modules/tardis-dev/dist/handy.d.ts.map +1 -1
  10. package/node_modules/tardis-dev/dist/handy.js +19 -10
  11. package/node_modules/tardis-dev/dist/handy.js.map +1 -1
  12. package/node_modules/tardis-dev/dist/mappers/ascendex.d.ts +4 -4
  13. package/node_modules/tardis-dev/dist/mappers/aster.d.ts +8 -8
  14. package/node_modules/tardis-dev/dist/mappers/binance.d.ts +18 -18
  15. package/node_modules/tardis-dev/dist/mappers/binanceeuropeanoptions.d.ts +1 -1
  16. package/node_modules/tardis-dev/dist/mappers/bitfinex.d.ts +8 -8
  17. package/node_modules/tardis-dev/dist/mappers/bitflyer.d.ts +1 -1
  18. package/node_modules/tardis-dev/dist/mappers/bitget.d.ts +1 -1
  19. package/node_modules/tardis-dev/dist/mappers/bithumb.d.ts +2 -2
  20. package/node_modules/tardis-dev/dist/mappers/bitmex.d.ts +2 -2
  21. package/node_modules/tardis-dev/dist/mappers/bitnomial.d.ts +1 -1
  22. package/node_modules/tardis-dev/dist/mappers/bitstamp.d.ts +3 -2
  23. package/node_modules/tardis-dev/dist/mappers/bitstamp.d.ts.map +1 -1
  24. package/node_modules/tardis-dev/dist/mappers/bitstamp.js +49 -2
  25. package/node_modules/tardis-dev/dist/mappers/bitstamp.js.map +1 -1
  26. package/node_modules/tardis-dev/dist/mappers/bitvavo.d.ts +3 -3
  27. package/node_modules/tardis-dev/dist/mappers/blockchaincom.d.ts +2 -2
  28. package/node_modules/tardis-dev/dist/mappers/bullish.d.ts +5 -5
  29. package/node_modules/tardis-dev/dist/mappers/bybit.d.ts +26 -7
  30. package/node_modules/tardis-dev/dist/mappers/bybit.d.ts.map +1 -1
  31. package/node_modules/tardis-dev/dist/mappers/bybit.js +4 -0
  32. package/node_modules/tardis-dev/dist/mappers/bybit.js.map +1 -1
  33. package/node_modules/tardis-dev/dist/mappers/bybitspot.d.ts +1 -1
  34. package/node_modules/tardis-dev/dist/mappers/coinbase.d.ts +1 -1
  35. package/node_modules/tardis-dev/dist/mappers/coinbasederivatives.d.ts +10 -0
  36. package/node_modules/tardis-dev/dist/mappers/coinbasederivatives.d.ts.map +1 -0
  37. package/node_modules/tardis-dev/dist/mappers/coinbasederivatives.js +144 -0
  38. package/node_modules/tardis-dev/dist/mappers/coinbasederivatives.js.map +1 -0
  39. package/node_modules/tardis-dev/dist/mappers/coinbaseinternational.d.ts +2 -2
  40. package/node_modules/tardis-dev/dist/mappers/coinflex.d.ts +1 -1
  41. package/node_modules/tardis-dev/dist/mappers/cryptocom.d.ts +5 -5
  42. package/node_modules/tardis-dev/dist/mappers/cryptofacilities.d.ts +2 -2
  43. package/node_modules/tardis-dev/dist/mappers/delta.d.ts +1 -1
  44. package/node_modules/tardis-dev/dist/mappers/deribit.d.ts +3 -3
  45. package/node_modules/tardis-dev/dist/mappers/dydx.d.ts +3 -3
  46. package/node_modules/tardis-dev/dist/mappers/dydxv4.d.ts +4 -4
  47. package/node_modules/tardis-dev/dist/mappers/dydxv4.js +19 -2
  48. package/node_modules/tardis-dev/dist/mappers/dydxv4.js.map +1 -1
  49. package/node_modules/tardis-dev/dist/mappers/ftx.d.ts +8 -8
  50. package/node_modules/tardis-dev/dist/mappers/ftx.js +1 -1
  51. package/node_modules/tardis-dev/dist/mappers/ftx.js.map +1 -1
  52. package/node_modules/tardis-dev/dist/mappers/gateio.d.ts +1 -1
  53. package/node_modules/tardis-dev/dist/mappers/gateiofutures.d.ts +4 -4
  54. package/node_modules/tardis-dev/dist/mappers/gemini.d.ts +1 -1
  55. package/node_modules/tardis-dev/dist/mappers/huobi.d.ts +26 -26
  56. package/node_modules/tardis-dev/dist/mappers/hyperliquid.d.ts +3 -3
  57. package/node_modules/tardis-dev/dist/mappers/index.d.ts +216 -183
  58. package/node_modules/tardis-dev/dist/mappers/index.d.ts.map +1 -1
  59. package/node_modules/tardis-dev/dist/mappers/index.js +2 -1
  60. package/node_modules/tardis-dev/dist/mappers/index.js.map +1 -1
  61. package/node_modules/tardis-dev/dist/mappers/kucoin.d.ts +3 -3
  62. package/node_modules/tardis-dev/dist/mappers/kucoinfutures.d.ts +4 -4
  63. package/node_modules/tardis-dev/dist/mappers/lighter.d.ts +10 -10
  64. package/node_modules/tardis-dev/dist/mappers/mexc.d.ts +3 -3
  65. package/node_modules/tardis-dev/dist/mappers/mexcfutures.d.ts +3 -3
  66. package/node_modules/tardis-dev/dist/mappers/okex.d.ts +15 -15
  67. package/node_modules/tardis-dev/dist/mappers/phemex.d.ts +1 -1
  68. package/node_modules/tardis-dev/dist/mappers/polymarket.d.ts +3 -3
  69. package/node_modules/tardis-dev/dist/mappers/serum.d.ts +9 -9
  70. package/node_modules/tardis-dev/dist/mappers/upbit.d.ts +2 -2
  71. package/node_modules/tardis-dev/dist/realtimefeeds/bitstamp.d.ts +12 -2
  72. package/node_modules/tardis-dev/dist/realtimefeeds/bitstamp.d.ts.map +1 -1
  73. package/node_modules/tardis-dev/dist/realtimefeeds/bitstamp.js +36 -3
  74. package/node_modules/tardis-dev/dist/realtimefeeds/bitstamp.js.map +1 -1
  75. package/node_modules/tardis-dev/dist/realtimefeeds/bybit.d.ts +3 -0
  76. package/node_modules/tardis-dev/dist/realtimefeeds/bybit.d.ts.map +1 -1
  77. package/node_modules/tardis-dev/dist/realtimefeeds/bybit.js +3 -0
  78. package/node_modules/tardis-dev/dist/realtimefeeds/bybit.js.map +1 -1
  79. package/node_modules/tardis-dev/dist/realtimefeeds/coinbasederivatives.d.ts +32 -0
  80. package/node_modules/tardis-dev/dist/realtimefeeds/coinbasederivatives.d.ts.map +1 -0
  81. package/node_modules/tardis-dev/dist/realtimefeeds/coinbasederivatives.js +83 -0
  82. package/node_modules/tardis-dev/dist/realtimefeeds/coinbasederivatives.js.map +1 -0
  83. package/node_modules/tardis-dev/dist/realtimefeeds/index.d.ts.map +1 -1
  84. package/node_modules/tardis-dev/dist/realtimefeeds/index.js +4 -1
  85. package/node_modules/tardis-dev/dist/realtimefeeds/index.js.map +1 -1
  86. package/node_modules/tardis-dev/package.json +1 -1
  87. package/node_modules/tardis-dev/src/consts.ts +34 -5
  88. package/node_modules/tardis-dev/src/handy.ts +20 -11
  89. package/node_modules/tardis-dev/src/mappers/bitstamp.ts +101 -27
  90. package/node_modules/tardis-dev/src/mappers/bybit.ts +6 -2
  91. package/node_modules/tardis-dev/src/mappers/coinbasederivatives.ts +230 -0
  92. package/node_modules/tardis-dev/src/mappers/dydxv4.ts +20 -2
  93. package/node_modules/tardis-dev/src/mappers/ftx.ts +1 -1
  94. package/node_modules/tardis-dev/src/mappers/index.ts +2 -0
  95. package/node_modules/tardis-dev/src/realtimefeeds/bitstamp.ts +50 -3
  96. package/node_modules/tardis-dev/src/realtimefeeds/bybit.ts +4 -0
  97. package/node_modules/tardis-dev/src/realtimefeeds/coinbasederivatives.ts +103 -0
  98. package/node_modules/tardis-dev/src/realtimefeeds/index.ts +4 -1
  99. package/package.json +2 -2
  100. package/src/ws/subscriptionsmappers.ts +8 -0
@@ -0,0 +1,103 @@
1
+ import { Writable } from 'node:stream'
2
+ import { batch, getJSON, optimizeFilters } from '../handy.ts'
3
+ import { Filter } from '../types.ts'
4
+ import { MultiConnectionRealTimeFeedBase, PoolingClientBase, RealTimeFeedBase } from './realtimefeed.ts'
5
+
6
+ export class CoinbaseDerivativesRealTimeFeed extends MultiConnectionRealTimeFeedBase {
7
+ protected *_getRealTimeFeeds(exchange: string, filters: Filter<string>[], timeoutIntervalMS?: number, onError?: (error: Error) => void) {
8
+ const wsFilters = optimizeFilters(filters.filter((f) => f.channel !== 'products'))
9
+ for (const filter of wsFilters) {
10
+ if (!['heartbeats', 'subscriptions'].includes(filter.channel) && !filter.symbols?.length) {
11
+ throw new Error('Coinbase derivatives WebSocket subscriptions require explicit symbols')
12
+ }
13
+ }
14
+
15
+ const symbols = [...new Set(wsFilters.flatMap((f) => f.symbols ?? []))]
16
+ const groups: Iterable<string[]> = symbols.length > 0 ? batch(symbols, 25) : wsFilters.length > 0 ? [[]] : []
17
+ for (const group of groups) {
18
+ const groupedFilters = wsFilters
19
+ .map((f) => ({
20
+ ...f,
21
+ symbols: f.symbols?.filter((s) => group.includes(s))
22
+ }))
23
+ .filter((f) => f.symbols?.length || ['heartbeats', 'subscriptions'].includes(f.channel))
24
+ yield new CoinbaseDerivativesSingleConnectionRealTimeFeed(exchange, groupedFilters, timeoutIntervalMS, onError)
25
+ }
26
+
27
+ const productFilters = filters.filter((f) => f.channel === 'products')
28
+ if (productFilters.length > 0) {
29
+ const allProducts = productFilters.some((f) => !f.symbols?.length)
30
+ yield new CoinbaseDerivativesProductsClient(
31
+ exchange,
32
+ allProducts ? undefined : new Set(productFilters.flatMap((f) => f.symbols!)),
33
+ onError
34
+ )
35
+ }
36
+ }
37
+ }
38
+
39
+ class CoinbaseDerivativesSingleConnectionRealTimeFeed extends RealTimeFeedBase {
40
+ protected wssURL = 'wss://advanced-trade-ws.coinbase.com'
41
+ private sequence?: number
42
+
43
+ protected mapToSubscribeMessages(filters: Filter<string>[]) {
44
+ return [
45
+ {
46
+ type: 'subscribe',
47
+ channel: 'heartbeats'
48
+ },
49
+ ...filters
50
+ .filter((f) => !['heartbeats', 'subscriptions'].includes(f.channel))
51
+ .map((f) => ({
52
+ type: 'subscribe',
53
+ channel: f.channel === 'l2_data' ? 'level2' : f.channel,
54
+ product_ids: f.symbols
55
+ }))
56
+ ]
57
+ }
58
+
59
+ protected async onConnected() {
60
+ this.sequence = undefined
61
+ }
62
+
63
+ protected messageIsError(message: { type?: string }) {
64
+ return message.type === 'error'
65
+ }
66
+
67
+ protected onMessage(message: { sequence_num?: number }) {
68
+ if (message.sequence_num === undefined) return
69
+ if (this.sequence !== undefined && message.sequence_num !== this.sequence + 1) {
70
+ throw new Error(`Coinbase derivatives sequence gap: ${this.sequence} -> ${message.sequence_num}`)
71
+ }
72
+ this.sequence = message.sequence_num
73
+ }
74
+ }
75
+
76
+ class CoinbaseDerivativesProductsClient extends PoolingClientBase {
77
+ constructor(
78
+ exchange: string,
79
+ private readonly symbols: Set<string> | undefined,
80
+ onError?: (error: Error) => void
81
+ ) {
82
+ super(exchange, 5, onError)
83
+ }
84
+
85
+ protected async poolDataToStream(output: Writable) {
86
+ for (let offset = 0; !output.destroyed; offset += 100) {
87
+ const { data } = await getJSON<{ products: Product[]; pagination: { has_next: boolean } }>(
88
+ `https://api.coinbase.com/api/v3/brokerage/market/products?product_type=FUTURE&limit=100&offset=${offset}`
89
+ )
90
+
91
+ for (const product of data.products) {
92
+ if (output.destroyed) return
93
+
94
+ if (this.symbols === undefined || this.symbols.has(product.product_id)) {
95
+ output.write({ channel: 'products', generated: true, events: [product] })
96
+ }
97
+ }
98
+ if (!data.pagination.has_next) return
99
+ }
100
+ }
101
+ }
102
+
103
+ type Product = { product_id: string }
@@ -13,8 +13,9 @@ import { BitflyerRealTimeFeed } from './bitflyer.ts'
13
13
  import { BithumbRealTimeFeed } from './bithumb.ts'
14
14
  import { BitstampRealTimeFeed } from './bitstamp.ts'
15
15
  import { BitvavoRealTimeFeed } from './bitvavo.ts'
16
- import { BybitOptionsRealTimeDataFeed, BybitRealTimeDataFeed, BybitSpotRealTimeDataFeed } from './bybit.ts'
16
+ import { BybitOptionsRealTimeDataFeed, BybitRealTimeDataFeed, BybitSpotRealTimeDataFeed, BybitSpreadRealTimeDataFeed } from './bybit.ts'
17
17
  import { CoinbaseRealTimeFeed } from './coinbase.ts'
18
+ import { CoinbaseDerivativesRealTimeFeed } from './coinbasederivatives.ts'
18
19
  import { CryptofacilitiesRealTimeFeed } from './cryptofacilities.ts'
19
20
  import { DeribitRealTimeDataFeed } from './deribit.ts'
20
21
  import { FtxRealTimeFeed, FtxUSRealTimeFeed } from './ftx.ts'
@@ -78,6 +79,7 @@ const realTimeFeedsMap: {
78
79
  bitstamp: BitstampRealTimeFeed,
79
80
  bitvavo: BitvavoRealTimeFeed,
80
81
  coinbase: CoinbaseRealTimeFeed,
82
+ 'coinbase-derivatives': CoinbaseDerivativesRealTimeFeed,
81
83
  cryptofacilities: CryptofacilitiesRealTimeFeed,
82
84
  deribit: DeribitRealTimeDataFeed,
83
85
  ftx: FtxRealTimeFeed,
@@ -110,6 +112,7 @@ const realTimeFeedsMap: {
110
112
  mango: MangoRealTimeFeed,
111
113
  'bybit-spot': BybitSpotRealTimeDataFeed,
112
114
  'bybit-options': BybitOptionsRealTimeDataFeed,
115
+ 'bybit-spread': BybitSpreadRealTimeDataFeed,
113
116
  'crypto-com': CryptoComRealTimeFeed,
114
117
  kucoin: KucoinRealTimeFeed,
115
118
  bitnomial: BitnomialRealTimeFeed,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-machine",
3
- "version": "18.3.8",
3
+ "version": "18.4.1",
4
4
  "engines": {
5
5
  "node": ">=24.19"
6
6
  },
@@ -76,7 +76,7 @@
76
76
  "license": "MPL-2.0",
77
77
  "dependencies": {
78
78
  "debug": "^4.4.3",
79
- "tardis-dev": "^18.3.8",
79
+ "tardis-dev": "^18.4.1",
80
80
  "ws": "^8.21.3"
81
81
  },
82
82
  "bundleDependencies": true,
@@ -58,6 +58,12 @@ const coinbaseMaper: SubscriptionMapper = {
58
58
  }
59
59
  }
60
60
 
61
+ // https://docs.cdp.coinbase.com/coinbase-app/advanced-trade-apis/websocket/websocket-overview
62
+ const coinbaseDerivativesMapper: SubscriptionMapper = {
63
+ canHandle: (message: any) => message.type === 'subscribe',
64
+ map: (message: any) => [{ channel: message.channel === 'level2' ? 'l2_data' : message.channel, symbols: message.product_ids }]
65
+ }
66
+
61
67
  // https://docs.deribit.com/v2/#subscription-management
62
68
  const deribitMapper: SubscriptionMapper = {
63
69
  canHandle: (message: any) => {
@@ -811,6 +817,7 @@ const polymarketMapper: SubscriptionMapper = {
811
817
  export const subscriptionsMappers: Record<Exchange, SubscriptionMapper> = {
812
818
  bitmex: bitmexMapper,
813
819
  coinbase: coinbaseMaper,
820
+ 'coinbase-derivatives': coinbaseDerivativesMapper,
814
821
  deribit: deribitMapper,
815
822
  cryptofacilities: cryptofacilitiesMapper,
816
823
  bitstamp: bitstampMapper,
@@ -863,6 +870,7 @@ export const subscriptionsMappers: Record<Exchange, SubscriptionMapper> = {
863
870
  'woo-x': wooxMapper,
864
871
  'blockchain-com': blockchainComMapper,
865
872
  'bybit-options': bybitMapper,
873
+ 'bybit-spread': bybitMapper,
866
874
  'binance-european-options': binanceMapper,
867
875
  'okex-spreads': okexMapper,
868
876
  'kucoin-futures': kucoinMapper,