tardis-machine 18.0.1 → 18.2.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.
Files changed (114) hide show
  1. package/dist/ws/subscriptionsmappers.d.ts.map +1 -1
  2. package/dist/ws/subscriptionsmappers.js +3 -1
  3. package/dist/ws/subscriptionsmappers.js.map +1 -1
  4. package/node_modules/tardis-dev/dist/consts.d.ts +3 -1
  5. package/node_modules/tardis-dev/dist/consts.d.ts.map +1 -1
  6. package/node_modules/tardis-dev/dist/consts.js +17 -0
  7. package/node_modules/tardis-dev/dist/consts.js.map +1 -1
  8. package/node_modules/tardis-dev/dist/downloaddatasets.d.ts.map +1 -1
  9. package/node_modules/tardis-dev/dist/downloaddatasets.js +3 -1
  10. package/node_modules/tardis-dev/dist/downloaddatasets.js.map +1 -1
  11. package/node_modules/tardis-dev/dist/handy.d.ts +15 -1
  12. package/node_modules/tardis-dev/dist/handy.d.ts.map +1 -1
  13. package/node_modules/tardis-dev/dist/handy.js +10 -5
  14. package/node_modules/tardis-dev/dist/handy.js.map +1 -1
  15. package/node_modules/tardis-dev/dist/mappers/ascendex.d.ts +4 -4
  16. package/node_modules/tardis-dev/dist/mappers/aster.d.ts +16 -0
  17. package/node_modules/tardis-dev/dist/mappers/aster.d.ts.map +1 -0
  18. package/node_modules/tardis-dev/dist/mappers/aster.js +294 -0
  19. package/node_modules/tardis-dev/dist/mappers/aster.js.map +1 -0
  20. package/node_modules/tardis-dev/dist/mappers/binance.d.ts +18 -18
  21. package/node_modules/tardis-dev/dist/mappers/binance.js +22 -22
  22. package/node_modules/tardis-dev/dist/mappers/binance.js.map +1 -1
  23. package/node_modules/tardis-dev/dist/mappers/binanceeuropeanoptions.d.ts +1 -1
  24. package/node_modules/tardis-dev/dist/mappers/bitfinex.d.ts +8 -8
  25. package/node_modules/tardis-dev/dist/mappers/bitflyer.d.ts +1 -1
  26. package/node_modules/tardis-dev/dist/mappers/bitget.d.ts +1 -1
  27. package/node_modules/tardis-dev/dist/mappers/bitmex.d.ts +2 -2
  28. package/node_modules/tardis-dev/dist/mappers/bitnomial.d.ts +1 -1
  29. package/node_modules/tardis-dev/dist/mappers/bitstamp.d.ts +1 -1
  30. package/node_modules/tardis-dev/dist/mappers/blockchaincom.d.ts +2 -2
  31. package/node_modules/tardis-dev/dist/mappers/bullish.d.ts +5 -5
  32. package/node_modules/tardis-dev/dist/mappers/bybit.d.ts +7 -7
  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/coinbaseinternational.d.ts +2 -2
  36. package/node_modules/tardis-dev/dist/mappers/coinflex.d.ts +1 -1
  37. package/node_modules/tardis-dev/dist/mappers/cryptocom.d.ts +5 -5
  38. package/node_modules/tardis-dev/dist/mappers/delta.d.ts +1 -1
  39. package/node_modules/tardis-dev/dist/mappers/deribit.d.ts +2 -2
  40. package/node_modules/tardis-dev/dist/mappers/dydx.d.ts +3 -3
  41. package/node_modules/tardis-dev/dist/mappers/dydxv4.d.ts +4 -4
  42. package/node_modules/tardis-dev/dist/mappers/ftx.d.ts +8 -8
  43. package/node_modules/tardis-dev/dist/mappers/gateio.d.ts +1 -1
  44. package/node_modules/tardis-dev/dist/mappers/gateiofutures.d.ts +4 -4
  45. package/node_modules/tardis-dev/dist/mappers/gemini.d.ts +1 -1
  46. package/node_modules/tardis-dev/dist/mappers/huobi.d.ts +26 -26
  47. package/node_modules/tardis-dev/dist/mappers/hyperliquid.d.ts +4 -4
  48. package/node_modules/tardis-dev/dist/mappers/hyperliquid.d.ts.map +1 -1
  49. package/node_modules/tardis-dev/dist/mappers/hyperliquid.js +15 -4
  50. package/node_modules/tardis-dev/dist/mappers/hyperliquid.js.map +1 -1
  51. package/node_modules/tardis-dev/dist/mappers/index.d.ts +180 -162
  52. package/node_modules/tardis-dev/dist/mappers/index.d.ts.map +1 -1
  53. package/node_modules/tardis-dev/dist/mappers/index.js +2 -1
  54. package/node_modules/tardis-dev/dist/mappers/index.js.map +1 -1
  55. package/node_modules/tardis-dev/dist/mappers/kucoin.d.ts +3 -3
  56. package/node_modules/tardis-dev/dist/mappers/kucoinfutures.d.ts +4 -4
  57. package/node_modules/tardis-dev/dist/mappers/lighter.d.ts +5 -5
  58. package/node_modules/tardis-dev/dist/mappers/mexc.d.ts +3 -3
  59. package/node_modules/tardis-dev/dist/mappers/mexcfutures.d.ts +3 -3
  60. package/node_modules/tardis-dev/dist/mappers/okex.d.ts +15 -15
  61. package/node_modules/tardis-dev/dist/mappers/phemex.d.ts +1 -1
  62. package/node_modules/tardis-dev/dist/mappers/polymarket.d.ts +3 -3
  63. package/node_modules/tardis-dev/dist/mappers/registry.d.ts.map +1 -1
  64. package/node_modules/tardis-dev/dist/mappers/registry.js.map +1 -1
  65. package/node_modules/tardis-dev/dist/mappers/serum.d.ts +9 -9
  66. package/node_modules/tardis-dev/dist/mappers/upbit.d.ts +2 -2
  67. package/node_modules/tardis-dev/dist/realtimefeeds/aster.d.ts +53 -0
  68. package/node_modules/tardis-dev/dist/realtimefeeds/aster.d.ts.map +1 -0
  69. package/node_modules/tardis-dev/dist/realtimefeeds/aster.js +271 -0
  70. package/node_modules/tardis-dev/dist/realtimefeeds/aster.js.map +1 -0
  71. package/node_modules/tardis-dev/dist/realtimefeeds/binance.d.ts +1 -4
  72. package/node_modules/tardis-dev/dist/realtimefeeds/binance.d.ts.map +1 -1
  73. package/node_modules/tardis-dev/dist/realtimefeeds/binance.js +36 -95
  74. package/node_modules/tardis-dev/dist/realtimefeeds/binance.js.map +1 -1
  75. package/node_modules/tardis-dev/dist/realtimefeeds/index.d.ts.map +1 -1
  76. package/node_modules/tardis-dev/dist/realtimefeeds/index.js +3 -0
  77. package/node_modules/tardis-dev/dist/realtimefeeds/index.js.map +1 -1
  78. package/node_modules/tardis-dev/dist/realtimefeeds/realtimefeed.d.ts.map +1 -1
  79. package/node_modules/tardis-dev/dist/realtimefeeds/realtimefeed.js +12 -3
  80. package/node_modules/tardis-dev/dist/realtimefeeds/realtimefeed.js.map +1 -1
  81. package/node_modules/tardis-dev/dist/realtimefeeds/requestweight.d.ts +14 -0
  82. package/node_modules/tardis-dev/dist/realtimefeeds/requestweight.d.ts.map +1 -0
  83. package/node_modules/tardis-dev/dist/realtimefeeds/requestweight.js +72 -0
  84. package/node_modules/tardis-dev/dist/realtimefeeds/requestweight.js.map +1 -0
  85. package/node_modules/tardis-dev/dist/replay.d.ts.map +1 -1
  86. package/node_modules/tardis-dev/dist/replay.js +6 -4
  87. package/node_modules/tardis-dev/dist/replay.js.map +1 -1
  88. package/node_modules/tardis-dev/dist/worker.d.ts.map +1 -1
  89. package/node_modules/tardis-dev/dist/worker.js +5 -2
  90. package/node_modules/tardis-dev/dist/worker.js.map +1 -1
  91. package/node_modules/tardis-dev/dist/zstd.d.ts +3 -0
  92. package/node_modules/tardis-dev/dist/zstd.d.ts.map +1 -0
  93. package/node_modules/tardis-dev/dist/zstd.js +122 -0
  94. package/node_modules/tardis-dev/dist/zstd.js.map +1 -0
  95. package/node_modules/tardis-dev/package.json +2 -2
  96. package/node_modules/tardis-dev/src/consts.ts +18 -0
  97. package/node_modules/tardis-dev/src/downloaddatasets.ts +3 -1
  98. package/node_modules/tardis-dev/src/handy.ts +13 -5
  99. package/node_modules/tardis-dev/src/mappers/aster.ts +438 -0
  100. package/node_modules/tardis-dev/src/mappers/binance.ts +23 -21
  101. package/node_modules/tardis-dev/src/mappers/bitfinex.ts +1 -2
  102. package/node_modules/tardis-dev/src/mappers/hyperliquid.ts +19 -5
  103. package/node_modules/tardis-dev/src/mappers/index.ts +2 -0
  104. package/node_modules/tardis-dev/src/mappers/registry.ts +1 -2
  105. package/node_modules/tardis-dev/src/realtimefeeds/aster.ts +388 -0
  106. package/node_modules/tardis-dev/src/realtimefeeds/binance.ts +59 -145
  107. package/node_modules/tardis-dev/src/realtimefeeds/index.ts +3 -0
  108. package/node_modules/tardis-dev/src/realtimefeeds/realtimefeed.ts +12 -3
  109. package/node_modules/tardis-dev/src/realtimefeeds/requestweight.ts +91 -0
  110. package/node_modules/tardis-dev/src/replay.ts +6 -4
  111. package/node_modules/tardis-dev/src/worker.ts +5 -2
  112. package/node_modules/tardis-dev/src/zstd.ts +139 -0
  113. package/package.json +4 -4
  114. package/src/ws/subscriptionsmappers.ts +3 -1
@@ -0,0 +1,139 @@
1
+ import { once } from 'node:events'
2
+ import { open, type FileHandle } from 'node:fs/promises'
3
+ import { Readable } from 'node:stream'
4
+ import { createZstdDecompress } from 'node:zlib'
5
+
6
+ const ZSTD_FRAME_MAGIC = 0xfd2fb528
7
+ const DICTIONARY_ID_SIZES = [0, 1, 2, 4]
8
+
9
+ export function createZstdDecompressionStream(path: string, chunkSize: number) {
10
+ return Readable.from(decompressZstdFrames(path, chunkSize), { objectMode: false })
11
+ }
12
+
13
+ async function* decompressZstdFrames(path: string, chunkSize: number) {
14
+ const file = await open(path, 'r')
15
+ try {
16
+ const fileSize = (await file.stat()).size
17
+ const frames = await findZstdFrames(file, path, fileSize)
18
+
19
+ for (const frame of frames) {
20
+ const source = Readable.from(readFileRange(file, frame.offset, frame.length, chunkSize), { objectMode: false })
21
+ const decompressor = createZstdDecompress({ chunkSize })
22
+ source.on('error', (error) => decompressor.destroy(error))
23
+ source.pipe(decompressor)
24
+
25
+ try {
26
+ for await (const chunk of decompressor) {
27
+ yield chunk
28
+ }
29
+
30
+ if (decompressor.bytesWritten !== frame.length) {
31
+ throw new Error(
32
+ `Zstd decoder consumed ${decompressor.bytesWritten} of ${frame.length} bytes at offset ${frame.offset} in ${path}`
33
+ )
34
+ }
35
+ } finally {
36
+ source.unpipe(decompressor)
37
+ source.destroy()
38
+ decompressor.destroy()
39
+ if (!source.closed) {
40
+ await once(source, 'close')
41
+ }
42
+ }
43
+ }
44
+ } finally {
45
+ await file.close()
46
+ }
47
+ }
48
+
49
+ async function findZstdFrames(file: FileHandle, path: string, fileSize: number) {
50
+ if (fileSize === 0) {
51
+ throw new Error(`Empty zstd file: ${path}`)
52
+ }
53
+
54
+ const bytes = Buffer.allocUnsafe(4)
55
+ const frames: { offset: number; length: number }[] = []
56
+ let offset = 0
57
+
58
+ while (offset < fileSize) {
59
+ const frameStart = offset
60
+ await readExactly(file, bytes, 4, offset, fileSize, path)
61
+ if (bytes.readUInt32LE(0) !== ZSTD_FRAME_MAGIC) {
62
+ throw new Error(`Invalid zstd frame magic at offset ${offset} in ${path}`)
63
+ }
64
+ offset += 4
65
+
66
+ await readExactly(file, bytes, 1, offset, fileSize, path)
67
+ const descriptor = bytes[0]
68
+ if ((descriptor & 0x08) !== 0) {
69
+ throw new Error(`Unsupported reserved zstd frame descriptor bit at offset ${offset} in ${path}`)
70
+ }
71
+ offset++
72
+
73
+ const singleSegment = (descriptor & 0x20) !== 0
74
+ const contentChecksum = (descriptor & 0x04) !== 0
75
+ const dictionaryIdSize = DICTIONARY_ID_SIZES[descriptor & 0x03]
76
+ const contentSizeFlag = descriptor >>> 6
77
+ const contentSizeSize = contentSizeFlag === 0 ? (singleSegment ? 1 : 0) : 1 << contentSizeFlag
78
+ const windowDescriptorSize = singleSegment ? 0 : 1
79
+ offset += windowDescriptorSize + dictionaryIdSize + contentSizeSize
80
+ ensureAvailable(offset, 0, fileSize, path)
81
+
82
+ let lastBlock = false
83
+ while (!lastBlock) {
84
+ await readExactly(file, bytes, 3, offset, fileSize, path)
85
+ const blockHeader = bytes.readUIntLE(0, 3)
86
+ offset += 3
87
+ lastBlock = (blockHeader & 1) !== 0
88
+ const blockType = (blockHeader >>> 1) & 3
89
+ if (blockType === 3) {
90
+ throw new Error(`Invalid reserved zstd block type at offset ${offset - 3} in ${path}`)
91
+ }
92
+
93
+ const blockSize = blockHeader >>> 3
94
+ // RLE blocks store one repeated byte; other block types store blockSize bytes.
95
+ offset += blockType === 1 ? 1 : blockSize
96
+ ensureAvailable(offset, 0, fileSize, path)
97
+ }
98
+
99
+ if (contentChecksum) {
100
+ offset += 4
101
+ ensureAvailable(offset, 0, fileSize, path)
102
+ }
103
+ frames.push({ offset: frameStart, length: offset - frameStart })
104
+ }
105
+
106
+ return frames
107
+ }
108
+
109
+ async function* readFileRange(file: FileHandle, position: number, length: number, chunkSize: number) {
110
+ let bytesRemaining = length
111
+ while (bytesRemaining > 0) {
112
+ const buffer = Buffer.allocUnsafe(Math.min(bytesRemaining, chunkSize))
113
+ const { bytesRead } = await file.read(buffer, 0, buffer.length, position)
114
+ if (bytesRead === 0) {
115
+ throw new Error(`Expected ${length} compressed bytes, read ${length - bytesRemaining}`)
116
+ }
117
+ yield bytesRead === buffer.length ? buffer : buffer.subarray(0, bytesRead)
118
+ position += bytesRead
119
+ bytesRemaining -= bytesRead
120
+ }
121
+ }
122
+
123
+ async function readExactly(file: FileHandle, buffer: Buffer, length: number, position: number, fileSize: number, path: string) {
124
+ ensureAvailable(position, length, fileSize, path)
125
+ let bytesRead = 0
126
+ while (bytesRead < length) {
127
+ const result = await file.read(buffer, bytesRead, length - bytesRead, position + bytesRead)
128
+ if (result.bytesRead === 0) {
129
+ throw new Error(`Truncated zstd frame at offset ${position + bytesRead} in ${path}`)
130
+ }
131
+ bytesRead += result.bytesRead
132
+ }
133
+ }
134
+
135
+ function ensureAvailable(position: number, length: number, fileSize: number, path: string) {
136
+ if (position < 0 || length < 0 || position > fileSize - length) {
137
+ throw new Error(`Truncated zstd frame at offset ${position} in ${path}`)
138
+ }
139
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-machine",
3
- "version": "18.0.1",
3
+ "version": "18.2.0",
4
4
  "engines": {
5
5
  "node": ">=24.19"
6
6
  },
@@ -75,8 +75,8 @@
75
75
  ],
76
76
  "license": "MPL-2.0",
77
77
  "dependencies": {
78
- "debug": "^4.4.1",
79
- "tardis-dev": "^18.0.2",
78
+ "debug": "^4.4.3",
79
+ "tardis-dev": "^18.2.0",
80
80
  "ws": "^8.21.1"
81
81
  },
82
82
  "bundleDependencies": true,
@@ -84,7 +84,7 @@
84
84
  "@types/debug": "^4.1.12",
85
85
  "@types/node": "^26.1.2",
86
86
  "@types/ws": "^8.18.1",
87
- "prettier": "^3.8.3",
87
+ "prettier": "3.9.6",
88
88
  "typescript": "^6.0.3"
89
89
  }
90
90
  }
@@ -274,7 +274,7 @@ const bybitMapper: SubscriptionMapper = {
274
274
  const pieces = arg.split('.')
275
275
 
276
276
  return {
277
- channel: pieces[0],
277
+ channel: pieces.slice(0, -1).join('.'),
278
278
  symbols: [pieces[pieces.length - 1]]
279
279
  }
280
280
  })
@@ -806,6 +806,8 @@ export const subscriptionsMappers: Record<Exchange, SubscriptionMapper> = {
806
806
  kraken: krakenMapper,
807
807
  bitflyer: bitflyerMapper,
808
808
  gemini: geminiMapper,
809
+ aster: binanceMapper,
810
+ 'aster-futures': binanceMapper,
809
811
  binance: binanceMapper,
810
812
  'binance-futures': binanceMapper,
811
813
  'binance-delivery': binanceMapper,