tardis-dev 16.5.1 → 16.6.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 (284) hide show
  1. package/README.md +4 -4
  2. package/dist/consts.d.ts +3 -1
  3. package/dist/consts.d.ts.map +1 -1
  4. package/dist/consts.js +21 -1
  5. package/dist/consts.js.map +1 -1
  6. package/dist/handy.d.ts.map +1 -1
  7. package/dist/handy.js +6 -3
  8. package/dist/handy.js.map +1 -1
  9. package/dist/instrumentinfo.d.ts +1 -1
  10. package/dist/instrumentinfo.d.ts.map +1 -1
  11. package/dist/instrumentinfo.js +3 -1
  12. package/dist/instrumentinfo.js.map +1 -1
  13. package/dist/mappers/ascendex.d.ts +6 -99
  14. package/dist/mappers/ascendex.d.ts.map +1 -1
  15. package/dist/mappers/ascendex.js +13 -4
  16. package/dist/mappers/ascendex.js.map +1 -1
  17. package/dist/mappers/binance.d.ts +27 -154
  18. package/dist/mappers/binance.d.ts.map +1 -1
  19. package/dist/mappers/binance.js +49 -15
  20. package/dist/mappers/binance.js.map +1 -1
  21. package/dist/mappers/binancedex.d.ts +7 -4
  22. package/dist/mappers/binancedex.d.ts.map +1 -1
  23. package/dist/mappers/binancedex.js +11 -3
  24. package/dist/mappers/binancedex.js.map +1 -1
  25. package/dist/mappers/binanceeuropeanoptions.d.ts +6 -216
  26. package/dist/mappers/binanceeuropeanoptions.d.ts.map +1 -1
  27. package/dist/mappers/binanceeuropeanoptions.js +26 -7
  28. package/dist/mappers/binanceeuropeanoptions.js.map +1 -1
  29. package/dist/mappers/bitfinex.d.ts +15 -100
  30. package/dist/mappers/bitfinex.d.ts.map +1 -1
  31. package/dist/mappers/bitfinex.js +20 -5
  32. package/dist/mappers/bitfinex.js.map +1 -1
  33. package/dist/mappers/bitflyer.d.ts +5 -41
  34. package/dist/mappers/bitflyer.d.ts.map +1 -1
  35. package/dist/mappers/bitflyer.js +11 -3
  36. package/dist/mappers/bitflyer.js.map +1 -1
  37. package/dist/mappers/bitget.d.ts +12 -269
  38. package/dist/mappers/bitget.d.ts.map +1 -1
  39. package/dist/mappers/bitget.js +46 -9
  40. package/dist/mappers/bitget.js.map +1 -1
  41. package/dist/mappers/bitmex.d.ts +8 -56
  42. package/dist/mappers/bitmex.d.ts.map +1 -1
  43. package/dist/mappers/bitmex.js +15 -5
  44. package/dist/mappers/bitmex.js.map +1 -1
  45. package/dist/mappers/bitnomial.d.ts +4 -44
  46. package/dist/mappers/bitnomial.d.ts.map +1 -1
  47. package/dist/mappers/bitnomial.js +9 -2
  48. package/dist/mappers/bitnomial.js.map +1 -1
  49. package/dist/mappers/bitstamp.d.ts +4 -44
  50. package/dist/mappers/bitstamp.d.ts.map +1 -1
  51. package/dist/mappers/bitstamp.js +9 -2
  52. package/dist/mappers/bitstamp.js.map +1 -1
  53. package/dist/mappers/blockchaincom.d.ts +4 -63
  54. package/dist/mappers/blockchaincom.d.ts.map +1 -1
  55. package/dist/mappers/blockchaincom.js +9 -2
  56. package/dist/mappers/blockchaincom.js.map +1 -1
  57. package/dist/mappers/bullish.d.ts +8 -158
  58. package/dist/mappers/bullish.d.ts.map +1 -1
  59. package/dist/mappers/bullish.js +15 -5
  60. package/dist/mappers/bullish.js.map +1 -1
  61. package/dist/mappers/bybit.d.ts +61 -407
  62. package/dist/mappers/bybit.d.ts.map +1 -1
  63. package/dist/mappers/bybit.js +60 -15
  64. package/dist/mappers/bybit.js.map +1 -1
  65. package/dist/mappers/bybitspot.d.ts +1 -1
  66. package/dist/mappers/coinbase.d.ts +6 -39
  67. package/dist/mappers/coinbase.d.ts.map +1 -1
  68. package/dist/mappers/coinbase.js +11 -3
  69. package/dist/mappers/coinbase.js.map +1 -1
  70. package/dist/mappers/coinbaseinternational.d.ts +7 -78
  71. package/dist/mappers/coinbaseinternational.d.ts.map +1 -1
  72. package/dist/mappers/coinbaseinternational.js +13 -4
  73. package/dist/mappers/coinbaseinternational.js.map +1 -1
  74. package/dist/mappers/coinflex.d.ts +6 -24
  75. package/dist/mappers/coinflex.d.ts.map +1 -1
  76. package/dist/mappers/coinflex.js +11 -3
  77. package/dist/mappers/coinflex.js.map +1 -1
  78. package/dist/mappers/cryptocom.d.ts +22 -328
  79. package/dist/mappers/cryptocom.d.ts.map +1 -1
  80. package/dist/mappers/cryptocom.js +13 -4
  81. package/dist/mappers/cryptocom.js.map +1 -1
  82. package/dist/mappers/cryptofacilities.d.ts +8 -96
  83. package/dist/mappers/cryptofacilities.d.ts.map +1 -1
  84. package/dist/mappers/cryptofacilities.js +24 -7
  85. package/dist/mappers/cryptofacilities.js.map +1 -1
  86. package/dist/mappers/delta.d.ts +7 -114
  87. package/dist/mappers/delta.d.ts.map +1 -1
  88. package/dist/mappers/delta.js +30 -10
  89. package/dist/mappers/delta.js.map +1 -1
  90. package/dist/mappers/deribit.d.ts +8 -66
  91. package/dist/mappers/deribit.d.ts.map +1 -1
  92. package/dist/mappers/deribit.js +17 -6
  93. package/dist/mappers/deribit.js.map +1 -1
  94. package/dist/mappers/dydx.d.ts +5 -146
  95. package/dist/mappers/dydx.d.ts.map +1 -1
  96. package/dist/mappers/dydx.js +11 -3
  97. package/dist/mappers/dydx.js.map +1 -1
  98. package/dist/mappers/dydxv4.d.ts +6 -173
  99. package/dist/mappers/dydxv4.d.ts.map +1 -1
  100. package/dist/mappers/dydxv4.js +13 -4
  101. package/dist/mappers/dydxv4.js.map +1 -1
  102. package/dist/mappers/ftx.d.ts +12 -107
  103. package/dist/mappers/ftx.d.ts.map +1 -1
  104. package/dist/mappers/ftx.js +21 -6
  105. package/dist/mappers/ftx.js.map +1 -1
  106. package/dist/mappers/gateio.d.ts +6 -191
  107. package/dist/mappers/gateio.d.ts.map +1 -1
  108. package/dist/mappers/gateio.js +28 -8
  109. package/dist/mappers/gateio.js.map +1 -1
  110. package/dist/mappers/gateiofutures.d.ts +7 -122
  111. package/dist/mappers/gateiofutures.d.ts.map +1 -1
  112. package/dist/mappers/gateiofutures.js +13 -4
  113. package/dist/mappers/gateiofutures.js.map +1 -1
  114. package/dist/mappers/gemini.d.ts +6 -3
  115. package/dist/mappers/gemini.d.ts.map +1 -1
  116. package/dist/mappers/gemini.js +9 -2
  117. package/dist/mappers/gemini.js.map +1 -1
  118. package/dist/mappers/hitbtc.d.ts +6 -3
  119. package/dist/mappers/hitbtc.d.ts.map +1 -1
  120. package/dist/mappers/hitbtc.js +9 -2
  121. package/dist/mappers/hitbtc.js.map +1 -1
  122. package/dist/mappers/huobi.d.ts +118 -289
  123. package/dist/mappers/huobi.d.ts.map +1 -1
  124. package/dist/mappers/huobi.js +45 -7
  125. package/dist/mappers/huobi.js.map +1 -1
  126. package/dist/mappers/hyperliquid.d.ts +6 -86
  127. package/dist/mappers/hyperliquid.d.ts.map +1 -1
  128. package/dist/mappers/hyperliquid.js +13 -4
  129. package/dist/mappers/hyperliquid.js.map +1 -1
  130. package/dist/mappers/index.d.ts +784 -272
  131. package/dist/mappers/index.d.ts.map +1 -1
  132. package/dist/mappers/index.js +64 -432
  133. package/dist/mappers/index.js.map +1 -1
  134. package/dist/mappers/kraken.d.ts +7 -4
  135. package/dist/mappers/kraken.d.ts.map +1 -1
  136. package/dist/mappers/kraken.js +11 -3
  137. package/dist/mappers/kraken.js.map +1 -1
  138. package/dist/mappers/kucoin.d.ts +6 -122
  139. package/dist/mappers/kucoin.d.ts.map +1 -1
  140. package/dist/mappers/kucoin.js +13 -5
  141. package/dist/mappers/kucoin.js.map +1 -1
  142. package/dist/mappers/kucoinfutures.d.ts +6 -207
  143. package/dist/mappers/kucoinfutures.d.ts.map +1 -1
  144. package/dist/mappers/kucoinfutures.js +15 -6
  145. package/dist/mappers/kucoinfutures.js.map +1 -1
  146. package/dist/mappers/lighter.d.ts +8 -156
  147. package/dist/mappers/lighter.d.ts.map +1 -1
  148. package/dist/mappers/lighter.js +15 -5
  149. package/dist/mappers/lighter.js.map +1 -1
  150. package/dist/mappers/mapper.d.ts +3 -1
  151. package/dist/mappers/mapper.d.ts.map +1 -1
  152. package/dist/mappers/mapper.js.map +1 -1
  153. package/dist/mappers/mexc.d.ts +122 -0
  154. package/dist/mappers/mexc.d.ts.map +1 -0
  155. package/dist/mappers/mexc.js +205 -0
  156. package/dist/mappers/mexc.js.map +1 -0
  157. package/dist/mappers/mexcfutures.d.ts +137 -0
  158. package/dist/mappers/mexcfutures.d.ts.map +1 -0
  159. package/dist/mappers/mexcfutures.js +225 -0
  160. package/dist/mappers/mexcfutures.js.map +1 -0
  161. package/dist/mappers/okex.d.ts +36 -473
  162. package/dist/mappers/okex.d.ts.map +1 -1
  163. package/dist/mappers/okex.js +143 -37
  164. package/dist/mappers/okex.js.map +1 -1
  165. package/dist/mappers/phemex.d.ts +5 -82
  166. package/dist/mappers/phemex.d.ts.map +1 -1
  167. package/dist/mappers/phemex.js +22 -4
  168. package/dist/mappers/phemex.js.map +1 -1
  169. package/dist/mappers/poloniex.d.ts +5 -90
  170. package/dist/mappers/poloniex.d.ts.map +1 -1
  171. package/dist/mappers/poloniex.js +18 -4
  172. package/dist/mappers/poloniex.js.map +1 -1
  173. package/dist/mappers/polymarket.d.ts +7 -31
  174. package/dist/mappers/polymarket.d.ts.map +1 -1
  175. package/dist/mappers/polymarket.js +11 -3
  176. package/dist/mappers/polymarket.js.map +1 -1
  177. package/dist/mappers/registry.d.ts +41 -0
  178. package/dist/mappers/registry.d.ts.map +1 -0
  179. package/dist/mappers/registry.js +111 -0
  180. package/dist/mappers/registry.js.map +1 -0
  181. package/dist/mappers/serum.d.ts +16 -89
  182. package/dist/mappers/serum.d.ts.map +1 -1
  183. package/dist/mappers/serum.js +21 -3
  184. package/dist/mappers/serum.js.map +1 -1
  185. package/dist/mappers/upbit.d.ts +5 -47
  186. package/dist/mappers/upbit.d.ts.map +1 -1
  187. package/dist/mappers/upbit.js +9 -2
  188. package/dist/mappers/upbit.js.map +1 -1
  189. package/dist/mappers/woox.d.ts +6 -107
  190. package/dist/mappers/woox.d.ts.map +1 -1
  191. package/dist/mappers/woox.js +263 -5
  192. package/dist/mappers/woox.js.map +1 -1
  193. package/dist/okexsymbols.d.ts +3 -0
  194. package/dist/okexsymbols.d.ts.map +1 -0
  195. package/dist/okexsymbols.js +10 -0
  196. package/dist/okexsymbols.js.map +1 -0
  197. package/dist/realtimefeeds/hyperliquid.d.ts.map +1 -1
  198. package/dist/realtimefeeds/hyperliquid.js +3 -1
  199. package/dist/realtimefeeds/hyperliquid.js.map +1 -1
  200. package/dist/realtimefeeds/index.d.ts.map +1 -1
  201. package/dist/realtimefeeds/index.js +4 -0
  202. package/dist/realtimefeeds/index.js.map +1 -1
  203. package/dist/realtimefeeds/mexc.d.ts +35 -0
  204. package/dist/realtimefeeds/mexc.d.ts.map +1 -0
  205. package/dist/realtimefeeds/mexc.js +261 -0
  206. package/dist/realtimefeeds/mexc.js.map +1 -0
  207. package/dist/realtimefeeds/mexcfutures.d.ts +25 -0
  208. package/dist/realtimefeeds/mexcfutures.d.ts.map +1 -0
  209. package/dist/realtimefeeds/mexcfutures.js +203 -0
  210. package/dist/realtimefeeds/mexcfutures.js.map +1 -0
  211. package/dist/realtimefeeds/okex.d.ts +1 -0
  212. package/dist/realtimefeeds/okex.d.ts.map +1 -1
  213. package/dist/realtimefeeds/okex.js +7 -5
  214. package/dist/realtimefeeds/okex.js.map +1 -1
  215. package/dist/realtimefeeds/realtimefeed.d.ts +1 -0
  216. package/dist/realtimefeeds/realtimefeed.d.ts.map +1 -1
  217. package/dist/realtimefeeds/realtimefeed.js +4 -1
  218. package/dist/realtimefeeds/realtimefeed.js.map +1 -1
  219. package/dist/realtimefeeds/woox.d.ts +1 -0
  220. package/dist/realtimefeeds/woox.d.ts.map +1 -1
  221. package/dist/realtimefeeds/woox.js +41 -25
  222. package/dist/realtimefeeds/woox.js.map +1 -1
  223. package/dist/replay.d.ts.map +1 -1
  224. package/dist/replay.js +62 -13
  225. package/dist/replay.js.map +1 -1
  226. package/example.js +133 -31
  227. package/package.json +2 -1
  228. package/src/consts.ts +22 -1
  229. package/src/handy.ts +6 -3
  230. package/src/instrumentinfo.ts +5 -2
  231. package/src/mappers/ascendex.ts +14 -4
  232. package/src/mappers/binance.ts +61 -21
  233. package/src/mappers/binancedex.ts +12 -3
  234. package/src/mappers/binanceeuropeanoptions.ts +28 -7
  235. package/src/mappers/bitfinex.ts +21 -5
  236. package/src/mappers/bitflyer.ts +12 -3
  237. package/src/mappers/bitget.ts +48 -9
  238. package/src/mappers/bitmex.ts +16 -5
  239. package/src/mappers/bitnomial.ts +10 -2
  240. package/src/mappers/bitstamp.ts +10 -2
  241. package/src/mappers/blockchaincom.ts +10 -2
  242. package/src/mappers/bullish.ts +16 -5
  243. package/src/mappers/bybit.ts +70 -15
  244. package/src/mappers/coinbase.ts +12 -3
  245. package/src/mappers/coinbaseinternational.ts +14 -4
  246. package/src/mappers/coinflex.ts +12 -3
  247. package/src/mappers/cryptocom.ts +14 -4
  248. package/src/mappers/cryptofacilities.ts +30 -6
  249. package/src/mappers/delta.ts +41 -7
  250. package/src/mappers/deribit.ts +18 -6
  251. package/src/mappers/dydx.ts +12 -3
  252. package/src/mappers/dydxv4.ts +14 -4
  253. package/src/mappers/ftx.ts +22 -6
  254. package/src/mappers/gateio.ts +34 -8
  255. package/src/mappers/gateiofutures.ts +14 -4
  256. package/src/mappers/gemini.ts +10 -2
  257. package/src/mappers/hitbtc.ts +10 -2
  258. package/src/mappers/huobi.ts +47 -10
  259. package/src/mappers/hyperliquid.ts +14 -4
  260. package/src/mappers/index.ts +133 -679
  261. package/src/mappers/kraken.ts +12 -3
  262. package/src/mappers/kucoin.ts +19 -5
  263. package/src/mappers/kucoinfutures.ts +20 -5
  264. package/src/mappers/lighter.ts +16 -5
  265. package/src/mappers/mapper.ts +3 -1
  266. package/src/mappers/mexc.ts +324 -0
  267. package/src/mappers/mexcfutures.ts +352 -0
  268. package/src/mappers/okex.ts +178 -37
  269. package/src/mappers/phemex.ts +25 -4
  270. package/src/mappers/poloniex.ts +20 -4
  271. package/src/mappers/polymarket.ts +12 -3
  272. package/src/mappers/registry.ts +203 -0
  273. package/src/mappers/serum.ts +22 -3
  274. package/src/mappers/upbit.ts +10 -2
  275. package/src/mappers/woox.ts +380 -6
  276. package/src/okexsymbols.ts +10 -0
  277. package/src/realtimefeeds/hyperliquid.ts +4 -1
  278. package/src/realtimefeeds/index.ts +4 -0
  279. package/src/realtimefeeds/mexc.ts +327 -0
  280. package/src/realtimefeeds/mexcfutures.ts +269 -0
  281. package/src/realtimefeeds/okex.ts +7 -5
  282. package/src/realtimefeeds/realtimefeed.ts +5 -1
  283. package/src/realtimefeeds/woox.ts +63 -26
  284. package/src/replay.ts +73 -15
@@ -1,63 +1,73 @@
1
- import { wait } from '../handy.ts'
1
+ import { getJSON } from '../handy.ts'
2
2
  import { Filter } from '../types.ts'
3
3
  import { RealTimeFeedBase } from './realtimefeed.ts'
4
4
 
5
+ const ORDER_BOOK_DEPTH = 50
6
+
5
7
  export class WooxRealTimeFeed extends RealTimeFeedBase {
6
- protected wssURL = 'wss://wss.woo.org/ws/stream/OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY'
8
+ protected wssURL = 'wss://wss.woox.io/v3/public'
9
+ protected readonly httpURL = 'https://api.woox.io'
7
10
 
8
11
  protected mapToSubscribeMessages(filters: Filter<string>[]): any[] {
9
- return filters
12
+ const symbolToTopics = new Map<string, string[]>()
13
+
14
+ filters
10
15
  .filter((filter) => filter.channel !== 'orderbook')
11
- .map((filter) => {
16
+ .forEach((filter) => {
12
17
  if (!filter.symbols || filter.symbols.length === 0) {
13
18
  throw new Error('WooxRealTimeFeed requires explicitly specified symbols when subscribing to live feed')
14
19
  }
15
20
 
16
- return filter.symbols.map((symbol) => {
17
- return {
18
- id: `${symbol}@${filter.channel}`,
19
- topic: `${symbol}@${filter.channel}`,
20
- event: 'subscribe'
21
- }
21
+ filter.symbols.forEach((symbol) => {
22
+ const topics = symbolToTopics.get(symbol) ?? []
23
+ topics.push(buildTopic(symbol, filter.channel))
24
+ symbolToTopics.set(symbol, topics)
22
25
  })
23
26
  })
24
- .flatMap((f) => f)
27
+
28
+ return Array.from(symbolToTopics.entries()).map(([symbol, topics]) => ({
29
+ id: symbol,
30
+ cmd: 'subscribe',
31
+ params: topics
32
+ }))
25
33
  }
26
34
 
27
35
  protected async provideManualSnapshots(filters: Filter<string>[], shouldCancel: () => boolean) {
28
36
  const orderbookFilter = filters.find((f) => f.channel === 'orderbook')
29
- if (!orderbookFilter) {
37
+ if (!orderbookFilter?.symbols) {
30
38
  return
31
39
  }
32
40
 
33
- await wait(200)
34
-
35
41
  for (let symbol of orderbookFilter.symbols!) {
36
42
  if (shouldCancel()) {
37
43
  return
38
44
  }
39
45
 
40
- this.send({
41
- id: `${symbol}@orderbook`,
42
- event: 'request',
43
- params: {
44
- type: 'orderbook',
45
- symbol
46
- }
47
- })
46
+ const response = await getJSON<WooxOrderBookSnapshotResponse>(
47
+ `${this.httpURL}/v3/public/orderbook?symbol=${symbol}&maxLevel=${ORDER_BOOK_DEPTH}`
48
+ )
49
+
50
+ if (response.data.success === false) {
51
+ throw new Error(`Woox orderbook snapshot request failed: ${JSON.stringify(response.data)}`)
52
+ }
48
53
 
49
- await wait(1)
54
+ this.manualSnapshotsBuffer.push({
55
+ topic: buildTopic(symbol, 'orderbook'),
56
+ ts: response.data.timestamp,
57
+ generated: true,
58
+ data: response.data.data
59
+ })
50
60
  }
51
61
 
52
- this.debug('sent orderbook requests for: %s', orderbookFilter.symbols)
62
+ this.debug('fetched orderbook snapshots for: %s', orderbookFilter.symbols)
53
63
  }
54
64
 
55
65
  protected messageIsError(message: any): boolean {
56
- return message.success === false || message.errorMsg !== undefined
66
+ return message.success === false || message.errorMsg !== undefined || message.cmd === 'ERROR'
57
67
  }
58
68
 
59
69
  protected messageIsHeartbeat(message: any): boolean {
60
- return message.event === 'ping'
70
+ return message.event === 'ping' || message.cmd === 'PING'
61
71
  }
62
72
 
63
73
  protected onMessage(msg: any) {
@@ -66,5 +76,32 @@ export class WooxRealTimeFeed extends RealTimeFeedBase {
66
76
  event: 'ping'
67
77
  })
68
78
  }
79
+ if (msg.cmd === 'PING') {
80
+ this.send({
81
+ cmd: 'PONG'
82
+ })
83
+ }
84
+ }
85
+ }
86
+
87
+ function buildTopic(symbol: string, channel: string) {
88
+ if (channel === 'orderbook' || channel === 'orderbookupdate') {
89
+ return `${channel}@${symbol}@${ORDER_BOOK_DEPTH}`
69
90
  }
91
+
92
+ return `${channel}@${symbol}`
93
+ }
94
+
95
+ type WooxOrderBookSnapshotResponse = {
96
+ success: boolean
97
+ timestamp: number
98
+ data: {
99
+ asks: WooxOrderBookSnapshotLevel[]
100
+ bids: WooxOrderBookSnapshotLevel[]
101
+ }
102
+ }
103
+
104
+ type WooxOrderBookSnapshotLevel = {
105
+ price: string
106
+ quantity: string
70
107
  }
package/src/replay.ts CHANGED
@@ -275,27 +275,14 @@ export function replayNormalized<T extends Exchange, U extends MapperFactory<T,
275
275
  ...normalizers: U
276
276
  ): AsyncIterableIterator<ReplayNormalizedMessage<U, Z>> {
277
277
  const fromDate = parseAsUTCDate(from)
278
+ const toDate = parseAsUTCDate(to)
278
279
 
279
280
  validateReplayNormalizedOptions(fromDate, normalizers)
280
281
 
281
- //TODO: zrovi replay dzien po dniu, tak ze kazdego dnia przekazuje swierze filters
282
-
283
282
  const createMappers = (localTimestamp: Date) => normalizers.map((m) => m(exchange, localTimestamp))
284
283
  const mappers = createMappers(fromDate)
285
284
  const filters = getFilters(mappers, symbols)
286
285
 
287
- const messages = replay({
288
- exchange,
289
- from,
290
- to,
291
- withDisconnects: true,
292
- filters,
293
- apiKey,
294
- withMicroseconds: true,
295
- autoCleanup,
296
- waitWhenDataNotYetAvailable
297
- })
298
-
299
286
  // filter normalized messages by symbol as some exchanges do not provide server side filtering so we could end up with messages
300
287
  // for symbols we've not requested for
301
288
  const upperCaseSymbols = symbols !== undefined ? symbols.map((s) => s.toUpperCase()) : undefined
@@ -303,7 +290,78 @@ export function replayNormalized<T extends Exchange, U extends MapperFactory<T,
303
290
  return upperCaseSymbols === undefined || upperCaseSymbols.length === 0 || upperCaseSymbols.includes(symbol)
304
291
  }
305
292
 
306
- return normalizeMessages(exchange, undefined, messages, mappers, createMappers, withDisconnectMessages, filter)
293
+ const segments = getReplayNormalizedSegments(exchange, normalizers, fromDate, toDate)
294
+
295
+ if (segments.length <= 1) {
296
+ const messages = replay({
297
+ exchange,
298
+ from,
299
+ to,
300
+ withDisconnects: true,
301
+ filters,
302
+ apiKey,
303
+ withMicroseconds: true,
304
+ autoCleanup,
305
+ waitWhenDataNotYetAvailable
306
+ })
307
+
308
+ return normalizeMessages(exchange, undefined, messages, mappers, createMappers, withDisconnectMessages, filter)
309
+ }
310
+
311
+ return replayNormalizedSegments()
312
+
313
+ async function* replayNormalizedSegments() {
314
+ for (let i = 0; i < segments.length; i++) {
315
+ const { from: segmentFrom, to: segmentTo } = segments[i]
316
+ const segmentMappers = i === 0 ? mappers : createMappers(segmentFrom)
317
+ const segmentFilters = getFilters(segmentMappers, symbols)
318
+
319
+ const segmentMessages = replay({
320
+ exchange,
321
+ from: segmentFrom.toISOString(),
322
+ to: segmentTo.toISOString(),
323
+ withDisconnects: true,
324
+ filters: segmentFilters,
325
+ apiKey,
326
+ withMicroseconds: true,
327
+ autoCleanup,
328
+ waitWhenDataNotYetAvailable
329
+ })
330
+
331
+ yield* normalizeMessages(exchange, undefined, segmentMessages, segmentMappers, createMappers, withDisconnectMessages, filter)
332
+ }
333
+ }
334
+ }
335
+
336
+ function getReplayNormalizedSegments<T extends Exchange>(exchange: T, normalizers: MapperFactory<T, any>[], fromDate: Date, toDate: Date) {
337
+ const fromTime = fromDate.valueOf()
338
+ const toTime = toDate.valueOf()
339
+ if (Number.isFinite(fromTime) === false || Number.isFinite(toTime) === false || fromTime >= toTime) {
340
+ return [{ from: fromDate, to: toDate }]
341
+ }
342
+
343
+ const switchTimes = new Set<number>()
344
+ for (const normalizer of normalizers) {
345
+ const switchDates = normalizer.getSwitchDates?.(exchange) ?? []
346
+ for (const switchDate of switchDates) {
347
+ const switchTime = switchDate.valueOf()
348
+ if (fromTime < switchTime && switchTime < toTime) {
349
+ switchTimes.add(switchTime)
350
+ }
351
+ }
352
+ }
353
+
354
+ const switchDates = [...switchTimes].sort((a, b) => a - b).map((switchTime) => new Date(switchTime))
355
+ const segments: { from: Date; to: Date }[] = []
356
+ let segmentFrom = fromDate
357
+
358
+ for (const switchDate of switchDates) {
359
+ segments.push({ from: segmentFrom, to: switchDate })
360
+ segmentFrom = switchDate
361
+ }
362
+ segments.push({ from: segmentFrom, to: toDate })
363
+
364
+ return segments
307
365
  }
308
366
 
309
367
  function validateReplayOptions<T extends Exchange>(exchange: T, from: string, to: string, filters: FilterForExchange[T][]) {