tardis-dev 16.5.1 → 16.6.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 (273) hide show
  1. package/dist/consts.d.ts +3 -1
  2. package/dist/consts.d.ts.map +1 -1
  3. package/dist/consts.js +21 -1
  4. package/dist/consts.js.map +1 -1
  5. package/dist/handy.d.ts.map +1 -1
  6. package/dist/handy.js +6 -3
  7. package/dist/handy.js.map +1 -1
  8. package/dist/mappers/ascendex.d.ts +6 -99
  9. package/dist/mappers/ascendex.d.ts.map +1 -1
  10. package/dist/mappers/ascendex.js +13 -4
  11. package/dist/mappers/ascendex.js.map +1 -1
  12. package/dist/mappers/binance.d.ts +27 -154
  13. package/dist/mappers/binance.d.ts.map +1 -1
  14. package/dist/mappers/binance.js +49 -15
  15. package/dist/mappers/binance.js.map +1 -1
  16. package/dist/mappers/binancedex.d.ts +7 -4
  17. package/dist/mappers/binancedex.d.ts.map +1 -1
  18. package/dist/mappers/binancedex.js +11 -3
  19. package/dist/mappers/binancedex.js.map +1 -1
  20. package/dist/mappers/binanceeuropeanoptions.d.ts +6 -216
  21. package/dist/mappers/binanceeuropeanoptions.d.ts.map +1 -1
  22. package/dist/mappers/binanceeuropeanoptions.js +26 -7
  23. package/dist/mappers/binanceeuropeanoptions.js.map +1 -1
  24. package/dist/mappers/bitfinex.d.ts +15 -100
  25. package/dist/mappers/bitfinex.d.ts.map +1 -1
  26. package/dist/mappers/bitfinex.js +20 -5
  27. package/dist/mappers/bitfinex.js.map +1 -1
  28. package/dist/mappers/bitflyer.d.ts +5 -41
  29. package/dist/mappers/bitflyer.d.ts.map +1 -1
  30. package/dist/mappers/bitflyer.js +11 -3
  31. package/dist/mappers/bitflyer.js.map +1 -1
  32. package/dist/mappers/bitget.d.ts +12 -269
  33. package/dist/mappers/bitget.d.ts.map +1 -1
  34. package/dist/mappers/bitget.js +46 -9
  35. package/dist/mappers/bitget.js.map +1 -1
  36. package/dist/mappers/bitmex.d.ts +8 -56
  37. package/dist/mappers/bitmex.d.ts.map +1 -1
  38. package/dist/mappers/bitmex.js +15 -5
  39. package/dist/mappers/bitmex.js.map +1 -1
  40. package/dist/mappers/bitnomial.d.ts +4 -44
  41. package/dist/mappers/bitnomial.d.ts.map +1 -1
  42. package/dist/mappers/bitnomial.js +9 -2
  43. package/dist/mappers/bitnomial.js.map +1 -1
  44. package/dist/mappers/bitstamp.d.ts +4 -44
  45. package/dist/mappers/bitstamp.d.ts.map +1 -1
  46. package/dist/mappers/bitstamp.js +9 -2
  47. package/dist/mappers/bitstamp.js.map +1 -1
  48. package/dist/mappers/blockchaincom.d.ts +4 -63
  49. package/dist/mappers/blockchaincom.d.ts.map +1 -1
  50. package/dist/mappers/blockchaincom.js +9 -2
  51. package/dist/mappers/blockchaincom.js.map +1 -1
  52. package/dist/mappers/bullish.d.ts +8 -158
  53. package/dist/mappers/bullish.d.ts.map +1 -1
  54. package/dist/mappers/bullish.js +15 -5
  55. package/dist/mappers/bullish.js.map +1 -1
  56. package/dist/mappers/bybit.d.ts +61 -407
  57. package/dist/mappers/bybit.d.ts.map +1 -1
  58. package/dist/mappers/bybit.js +60 -15
  59. package/dist/mappers/bybit.js.map +1 -1
  60. package/dist/mappers/bybitspot.d.ts +1 -1
  61. package/dist/mappers/coinbase.d.ts +6 -39
  62. package/dist/mappers/coinbase.d.ts.map +1 -1
  63. package/dist/mappers/coinbase.js +11 -3
  64. package/dist/mappers/coinbase.js.map +1 -1
  65. package/dist/mappers/coinbaseinternational.d.ts +7 -78
  66. package/dist/mappers/coinbaseinternational.d.ts.map +1 -1
  67. package/dist/mappers/coinbaseinternational.js +13 -4
  68. package/dist/mappers/coinbaseinternational.js.map +1 -1
  69. package/dist/mappers/coinflex.d.ts +6 -24
  70. package/dist/mappers/coinflex.d.ts.map +1 -1
  71. package/dist/mappers/coinflex.js +11 -3
  72. package/dist/mappers/coinflex.js.map +1 -1
  73. package/dist/mappers/cryptocom.d.ts +22 -328
  74. package/dist/mappers/cryptocom.d.ts.map +1 -1
  75. package/dist/mappers/cryptocom.js +13 -4
  76. package/dist/mappers/cryptocom.js.map +1 -1
  77. package/dist/mappers/cryptofacilities.d.ts +8 -96
  78. package/dist/mappers/cryptofacilities.d.ts.map +1 -1
  79. package/dist/mappers/cryptofacilities.js +24 -7
  80. package/dist/mappers/cryptofacilities.js.map +1 -1
  81. package/dist/mappers/delta.d.ts +7 -114
  82. package/dist/mappers/delta.d.ts.map +1 -1
  83. package/dist/mappers/delta.js +30 -10
  84. package/dist/mappers/delta.js.map +1 -1
  85. package/dist/mappers/deribit.d.ts +8 -66
  86. package/dist/mappers/deribit.d.ts.map +1 -1
  87. package/dist/mappers/deribit.js +17 -6
  88. package/dist/mappers/deribit.js.map +1 -1
  89. package/dist/mappers/dydx.d.ts +5 -146
  90. package/dist/mappers/dydx.d.ts.map +1 -1
  91. package/dist/mappers/dydx.js +11 -3
  92. package/dist/mappers/dydx.js.map +1 -1
  93. package/dist/mappers/dydxv4.d.ts +6 -173
  94. package/dist/mappers/dydxv4.d.ts.map +1 -1
  95. package/dist/mappers/dydxv4.js +13 -4
  96. package/dist/mappers/dydxv4.js.map +1 -1
  97. package/dist/mappers/ftx.d.ts +12 -107
  98. package/dist/mappers/ftx.d.ts.map +1 -1
  99. package/dist/mappers/ftx.js +21 -6
  100. package/dist/mappers/ftx.js.map +1 -1
  101. package/dist/mappers/gateio.d.ts +6 -191
  102. package/dist/mappers/gateio.d.ts.map +1 -1
  103. package/dist/mappers/gateio.js +28 -8
  104. package/dist/mappers/gateio.js.map +1 -1
  105. package/dist/mappers/gateiofutures.d.ts +7 -122
  106. package/dist/mappers/gateiofutures.d.ts.map +1 -1
  107. package/dist/mappers/gateiofutures.js +13 -4
  108. package/dist/mappers/gateiofutures.js.map +1 -1
  109. package/dist/mappers/gemini.d.ts +6 -3
  110. package/dist/mappers/gemini.d.ts.map +1 -1
  111. package/dist/mappers/gemini.js +9 -2
  112. package/dist/mappers/gemini.js.map +1 -1
  113. package/dist/mappers/hitbtc.d.ts +6 -3
  114. package/dist/mappers/hitbtc.d.ts.map +1 -1
  115. package/dist/mappers/hitbtc.js +9 -2
  116. package/dist/mappers/hitbtc.js.map +1 -1
  117. package/dist/mappers/huobi.d.ts +118 -289
  118. package/dist/mappers/huobi.d.ts.map +1 -1
  119. package/dist/mappers/huobi.js +45 -7
  120. package/dist/mappers/huobi.js.map +1 -1
  121. package/dist/mappers/hyperliquid.d.ts +6 -86
  122. package/dist/mappers/hyperliquid.d.ts.map +1 -1
  123. package/dist/mappers/hyperliquid.js +13 -4
  124. package/dist/mappers/hyperliquid.js.map +1 -1
  125. package/dist/mappers/index.d.ts +784 -272
  126. package/dist/mappers/index.d.ts.map +1 -1
  127. package/dist/mappers/index.js +64 -432
  128. package/dist/mappers/index.js.map +1 -1
  129. package/dist/mappers/kraken.d.ts +7 -4
  130. package/dist/mappers/kraken.d.ts.map +1 -1
  131. package/dist/mappers/kraken.js +11 -3
  132. package/dist/mappers/kraken.js.map +1 -1
  133. package/dist/mappers/kucoin.d.ts +6 -122
  134. package/dist/mappers/kucoin.d.ts.map +1 -1
  135. package/dist/mappers/kucoin.js +13 -5
  136. package/dist/mappers/kucoin.js.map +1 -1
  137. package/dist/mappers/kucoinfutures.d.ts +6 -207
  138. package/dist/mappers/kucoinfutures.d.ts.map +1 -1
  139. package/dist/mappers/kucoinfutures.js +15 -6
  140. package/dist/mappers/kucoinfutures.js.map +1 -1
  141. package/dist/mappers/lighter.d.ts +8 -156
  142. package/dist/mappers/lighter.d.ts.map +1 -1
  143. package/dist/mappers/lighter.js +15 -5
  144. package/dist/mappers/lighter.js.map +1 -1
  145. package/dist/mappers/mapper.d.ts +3 -1
  146. package/dist/mappers/mapper.d.ts.map +1 -1
  147. package/dist/mappers/mapper.js.map +1 -1
  148. package/dist/mappers/mexc.d.ts +122 -0
  149. package/dist/mappers/mexc.d.ts.map +1 -0
  150. package/dist/mappers/mexc.js +205 -0
  151. package/dist/mappers/mexc.js.map +1 -0
  152. package/dist/mappers/mexcfutures.d.ts +137 -0
  153. package/dist/mappers/mexcfutures.d.ts.map +1 -0
  154. package/dist/mappers/mexcfutures.js +225 -0
  155. package/dist/mappers/mexcfutures.js.map +1 -0
  156. package/dist/mappers/okex.d.ts +36 -473
  157. package/dist/mappers/okex.d.ts.map +1 -1
  158. package/dist/mappers/okex.js +143 -37
  159. package/dist/mappers/okex.js.map +1 -1
  160. package/dist/mappers/phemex.d.ts +5 -82
  161. package/dist/mappers/phemex.d.ts.map +1 -1
  162. package/dist/mappers/phemex.js +22 -4
  163. package/dist/mappers/phemex.js.map +1 -1
  164. package/dist/mappers/poloniex.d.ts +5 -90
  165. package/dist/mappers/poloniex.d.ts.map +1 -1
  166. package/dist/mappers/poloniex.js +18 -4
  167. package/dist/mappers/poloniex.js.map +1 -1
  168. package/dist/mappers/polymarket.d.ts +7 -31
  169. package/dist/mappers/polymarket.d.ts.map +1 -1
  170. package/dist/mappers/polymarket.js +11 -3
  171. package/dist/mappers/polymarket.js.map +1 -1
  172. package/dist/mappers/registry.d.ts +41 -0
  173. package/dist/mappers/registry.d.ts.map +1 -0
  174. package/dist/mappers/registry.js +111 -0
  175. package/dist/mappers/registry.js.map +1 -0
  176. package/dist/mappers/serum.d.ts +16 -89
  177. package/dist/mappers/serum.d.ts.map +1 -1
  178. package/dist/mappers/serum.js +21 -3
  179. package/dist/mappers/serum.js.map +1 -1
  180. package/dist/mappers/upbit.d.ts +5 -47
  181. package/dist/mappers/upbit.d.ts.map +1 -1
  182. package/dist/mappers/upbit.js +9 -2
  183. package/dist/mappers/upbit.js.map +1 -1
  184. package/dist/mappers/woox.d.ts +6 -107
  185. package/dist/mappers/woox.d.ts.map +1 -1
  186. package/dist/mappers/woox.js +13 -4
  187. package/dist/mappers/woox.js.map +1 -1
  188. package/dist/okexsymbols.d.ts +3 -0
  189. package/dist/okexsymbols.d.ts.map +1 -0
  190. package/dist/okexsymbols.js +10 -0
  191. package/dist/okexsymbols.js.map +1 -0
  192. package/dist/realtimefeeds/hyperliquid.d.ts.map +1 -1
  193. package/dist/realtimefeeds/hyperliquid.js +3 -1
  194. package/dist/realtimefeeds/hyperliquid.js.map +1 -1
  195. package/dist/realtimefeeds/index.d.ts.map +1 -1
  196. package/dist/realtimefeeds/index.js +4 -0
  197. package/dist/realtimefeeds/index.js.map +1 -1
  198. package/dist/realtimefeeds/mexc.d.ts +35 -0
  199. package/dist/realtimefeeds/mexc.d.ts.map +1 -0
  200. package/dist/realtimefeeds/mexc.js +261 -0
  201. package/dist/realtimefeeds/mexc.js.map +1 -0
  202. package/dist/realtimefeeds/mexcfutures.d.ts +25 -0
  203. package/dist/realtimefeeds/mexcfutures.d.ts.map +1 -0
  204. package/dist/realtimefeeds/mexcfutures.js +203 -0
  205. package/dist/realtimefeeds/mexcfutures.js.map +1 -0
  206. package/dist/realtimefeeds/okex.d.ts +1 -0
  207. package/dist/realtimefeeds/okex.d.ts.map +1 -1
  208. package/dist/realtimefeeds/okex.js +7 -5
  209. package/dist/realtimefeeds/okex.js.map +1 -1
  210. package/dist/realtimefeeds/realtimefeed.d.ts +1 -0
  211. package/dist/realtimefeeds/realtimefeed.d.ts.map +1 -1
  212. package/dist/realtimefeeds/realtimefeed.js +4 -1
  213. package/dist/realtimefeeds/realtimefeed.js.map +1 -1
  214. package/dist/replay.d.ts.map +1 -1
  215. package/dist/replay.js +62 -13
  216. package/dist/replay.js.map +1 -1
  217. package/example.js +133 -31
  218. package/package.json +2 -1
  219. package/src/consts.ts +22 -1
  220. package/src/handy.ts +6 -3
  221. package/src/mappers/ascendex.ts +14 -4
  222. package/src/mappers/binance.ts +61 -21
  223. package/src/mappers/binancedex.ts +12 -3
  224. package/src/mappers/binanceeuropeanoptions.ts +28 -7
  225. package/src/mappers/bitfinex.ts +21 -5
  226. package/src/mappers/bitflyer.ts +12 -3
  227. package/src/mappers/bitget.ts +48 -9
  228. package/src/mappers/bitmex.ts +16 -5
  229. package/src/mappers/bitnomial.ts +10 -2
  230. package/src/mappers/bitstamp.ts +10 -2
  231. package/src/mappers/blockchaincom.ts +10 -2
  232. package/src/mappers/bullish.ts +16 -5
  233. package/src/mappers/bybit.ts +70 -15
  234. package/src/mappers/coinbase.ts +12 -3
  235. package/src/mappers/coinbaseinternational.ts +14 -4
  236. package/src/mappers/coinflex.ts +12 -3
  237. package/src/mappers/cryptocom.ts +14 -4
  238. package/src/mappers/cryptofacilities.ts +30 -6
  239. package/src/mappers/delta.ts +41 -7
  240. package/src/mappers/deribit.ts +18 -6
  241. package/src/mappers/dydx.ts +12 -3
  242. package/src/mappers/dydxv4.ts +14 -4
  243. package/src/mappers/ftx.ts +22 -6
  244. package/src/mappers/gateio.ts +34 -8
  245. package/src/mappers/gateiofutures.ts +14 -4
  246. package/src/mappers/gemini.ts +10 -2
  247. package/src/mappers/hitbtc.ts +10 -2
  248. package/src/mappers/huobi.ts +47 -10
  249. package/src/mappers/hyperliquid.ts +14 -4
  250. package/src/mappers/index.ts +133 -679
  251. package/src/mappers/kraken.ts +12 -3
  252. package/src/mappers/kucoin.ts +19 -5
  253. package/src/mappers/kucoinfutures.ts +20 -5
  254. package/src/mappers/lighter.ts +16 -5
  255. package/src/mappers/mapper.ts +3 -1
  256. package/src/mappers/mexc.ts +324 -0
  257. package/src/mappers/mexcfutures.ts +352 -0
  258. package/src/mappers/okex.ts +178 -37
  259. package/src/mappers/phemex.ts +25 -4
  260. package/src/mappers/poloniex.ts +20 -4
  261. package/src/mappers/polymarket.ts +12 -3
  262. package/src/mappers/registry.ts +203 -0
  263. package/src/mappers/serum.ts +22 -3
  264. package/src/mappers/upbit.ts +10 -2
  265. package/src/mappers/woox.ts +14 -4
  266. package/src/okexsymbols.ts +10 -0
  267. package/src/realtimefeeds/hyperliquid.ts +4 -1
  268. package/src/realtimefeeds/index.ts +4 -0
  269. package/src/realtimefeeds/mexc.ts +327 -0
  270. package/src/realtimefeeds/mexcfutures.ts +269 -0
  271. package/src/realtimefeeds/okex.ts +7 -5
  272. package/src/realtimefeeds/realtimefeed.ts +5 -1
  273. package/src/replay.ts +73 -15
@@ -1,5 +1,14 @@
1
1
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
2
2
  import { Trade, BookChange, DerivativeTicker } from '../types.ts'
3
+ import { exchangeMappers } from './registry.ts'
4
+
5
+ export const phemexMappers = exchangeMappers({
6
+ phemex: {
7
+ trades: () => phemexTradesMapper,
8
+ bookChanges: () => phemexBookChangeMapper,
9
+ derivativeTickers: () => new PhemexDerivativeTickerMapper()
10
+ }
11
+ })
3
12
 
4
13
  // phemex provides timestamps in nanoseconds
5
14
  const fromNanoSecondsToDate = (nanos: number) => {
@@ -45,6 +54,7 @@ const COINS_STARTING_WITH_S = [
45
54
  'STGUSD',
46
55
  'SLPUUSD',
47
56
  'SPELLUSD',
57
+ 'SSVUSDT',
48
58
  'SSVUSD',
49
59
  'STXUSD',
50
60
  'SUIUSD',
@@ -101,7 +111,15 @@ const COINS_STARTING_WITH_S = [
101
111
  'SPORTFUNUSDT',
102
112
  'SKRUSDT',
103
113
  'SPACEUSDT',
114
+ 'SPACEXUSDT',
115
+ 'STARUSDT',
116
+ 'SOXLUSDT',
117
+ 'SPCXUSDT',
118
+ 'SAMSUNGUSDT',
119
+ 'SKHYNIXUSDT',
120
+ 'SLXUSDT',
104
121
  'SPX500USDT',
122
+ 'STXXUSDT',
105
123
  'SPYXUSDT',
106
124
  'SP500USDT',
107
125
  'SNDKUSDT'
@@ -111,7 +129,10 @@ function getInstrumentType(symbol: string) {
111
129
  return 'future'
112
130
  }
113
131
 
114
- if (COINS_STARTING_WITH_S.some((c) => symbol.startsWith(c)) || symbol.startsWith('S') === false) {
132
+ if (
133
+ COINS_STARTING_WITH_S.some((coin) => (coin === 'SUSDT' ? symbol === coin : symbol.startsWith(coin))) ||
134
+ symbol.startsWith('S') === false
135
+ ) {
115
136
  return 'perpetual'
116
137
  }
117
138
 
@@ -144,7 +165,7 @@ function getSymbols(symbols: string[]) {
144
165
  }
145
166
  }
146
167
 
147
- export const phemexTradesMapper: Mapper<'phemex', Trade> = {
168
+ const phemexTradesMapper: Mapper<'phemex', Trade> = {
148
169
  canHandle(message: PhemexTradeMessage) {
149
170
  return message.type === 'incremental' && ('trades' in message || 'trades_p' in message)
150
171
  },
@@ -235,7 +256,7 @@ function mapPerpBookLevel([price, amount]: [string, string]) {
235
256
  }
236
257
  }
237
258
 
238
- export const phemexBookChangeMapper: Mapper<'phemex', BookChange> = {
259
+ const phemexBookChangeMapper: Mapper<'phemex', BookChange> = {
239
260
  canHandle(message: PhemexBookMessage) {
240
261
  return 'book' in message || 'orderbook_p' in message
241
262
  },
@@ -305,7 +326,7 @@ export const phemexBookChangeMapper: Mapper<'phemex', BookChange> = {
305
326
  }
306
327
  }
307
328
 
308
- export class PhemexDerivativeTickerMapper implements Mapper<'phemex', DerivativeTicker> {
329
+ class PhemexDerivativeTickerMapper implements Mapper<'phemex', DerivativeTicker> {
309
330
  private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
310
331
 
311
332
  canHandle(message: PhemexTicker) {
@@ -1,8 +1,24 @@
1
1
  import { upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, Trade } from '../types.ts'
3
3
  import { Mapper } from './mapper.ts'
4
+ import { exchangeMappers, mapper } from './registry.ts'
5
+
6
+ const POLONIEX_V2_API_SWITCH_DATE = new Date('2022-08-02T00:00:00.000Z')
7
+
8
+ export const poloniexMappers = exchangeMappers({
9
+ poloniex: {
10
+ trades: mapper([
11
+ { until: POLONIEX_V2_API_SWITCH_DATE, use: () => new PoloniexTradesMapper() },
12
+ { use: () => new PoloniexV2TradesMapper() }
13
+ ]),
14
+ bookChanges: mapper([
15
+ { until: POLONIEX_V2_API_SWITCH_DATE, use: () => new PoloniexBookChangeMapper() },
16
+ { use: () => new PoloniexV2BookChangeMapper() }
17
+ ])
18
+ }
19
+ })
4
20
 
5
- export class PoloniexV2TradesMapper implements Mapper<'poloniex', Trade> {
21
+ class PoloniexV2TradesMapper implements Mapper<'poloniex', Trade> {
6
22
  canHandle(message: any) {
7
23
  return message.channel === 'trades' && message.data !== undefined && message.data.length > 0
8
24
  }
@@ -41,7 +57,7 @@ const mapBookLevelV2 = (level: [string, string]) => {
41
57
  amount: Number(level[1])
42
58
  }
43
59
  }
44
- export class PoloniexV2BookChangeMapper implements Mapper<'poloniex', BookChange> {
60
+ class PoloniexV2BookChangeMapper implements Mapper<'poloniex', BookChange> {
45
61
  canHandle(message: any) {
46
62
  return message.channel === 'book_lv2' && message.data !== undefined && message.data.length > 0
47
63
  }
@@ -75,7 +91,7 @@ export class PoloniexV2BookChangeMapper implements Mapper<'poloniex', BookChange
75
91
  }
76
92
  }
77
93
 
78
- export class PoloniexTradesMapper implements Mapper<'poloniex', Trade> {
94
+ class PoloniexTradesMapper implements Mapper<'poloniex', Trade> {
79
95
  private readonly _channelIdToSymbolMap: Map<number, string> = new Map()
80
96
 
81
97
  canHandle(message: PoloniexPriceAggreatedMessage) {
@@ -151,7 +167,7 @@ const mapBookLevel = (level: PoloniexBookUpdate) => {
151
167
  }
152
168
  }
153
169
 
154
- export class PoloniexBookChangeMapper implements Mapper<'poloniex', BookChange> {
170
+ class PoloniexBookChangeMapper implements Mapper<'poloniex', BookChange> {
155
171
  private readonly _channelIdToSymbolMap: Map<number, string> = new Map()
156
172
 
157
173
  canHandle(message: PoloniexPriceAggreatedMessage) {
@@ -1,9 +1,18 @@
1
1
  import { BookChange, BookTicker, Trade } from '../types.ts'
2
2
  import { asNonZeroNumberOrUndefined } from '../handy.ts'
3
3
  import { Mapper } from './mapper.ts'
4
+ import { exchangeMappers } from './registry.ts'
5
+
6
+ export const polymarketMappers = exchangeMappers({
7
+ polymarket: {
8
+ trades: () => new PolymarketTradesMapper(),
9
+ bookChanges: () => new PolymarketBookChangeMapper(),
10
+ bookTickers: () => new PolymarketBookTickerMapper()
11
+ }
12
+ })
4
13
 
5
14
  type PolymarketBookChangeMapperMessage = PolymarketClobBookMessage | PolymarketClobBookMessage[] | PolymarketClobPriceChangeMessage
6
- export class PolymarketBookChangeMapper implements Mapper<'polymarket', BookChange> {
15
+ class PolymarketBookChangeMapper implements Mapper<'polymarket', BookChange> {
7
16
  canHandle(message: PolymarketNativeMessage): message is PolymarketBookChangeMapperMessage {
8
17
  if (Array.isArray(message)) {
9
18
  return message.length > 0 && message.every(isPolymarketClobBookMessage)
@@ -76,7 +85,7 @@ export class PolymarketBookChangeMapper implements Mapper<'polymarket', BookChan
76
85
  }
77
86
  }
78
87
 
79
- export class PolymarketTradesMapper implements Mapper<'polymarket', Trade> {
88
+ class PolymarketTradesMapper implements Mapper<'polymarket', Trade> {
80
89
  canHandle(message: any): message is PolymarketClobLastTradePriceMessage {
81
90
  return message.event_type === 'last_trade_price'
82
91
  }
@@ -100,7 +109,7 @@ export class PolymarketTradesMapper implements Mapper<'polymarket', Trade> {
100
109
  }
101
110
  }
102
111
 
103
- export class PolymarketBookTickerMapper implements Mapper<'polymarket', BookTicker> {
112
+ class PolymarketBookTickerMapper implements Mapper<'polymarket', BookTicker> {
104
113
  canHandle(message: any): message is PolymarketClobBestBidAskMessage {
105
114
  return message.event_type === 'best_bid_ask'
106
115
  }
@@ -0,0 +1,203 @@
1
+ import { EXCHANGES } from '../consts.ts'
2
+ import { ONE_SEC_IN_MS } from '../handy.ts'
3
+ import { Exchange, NormalizedData } from '../types.ts'
4
+ import { Mapper } from './mapper.ts'
5
+
6
+ const THREE_MINUTES_IN_MS = 3 * 60 * ONE_SEC_IN_MS
7
+
8
+ export type MapperCreator<T extends Exchange = any, U extends NormalizedData = NormalizedData> = ((
9
+ localTimestamp?: Date
10
+ ) => Mapper<T, U>) & {
11
+ switchDates?: readonly Date[]
12
+ }
13
+ export type MapperCollection = Record<string, MapperCreator>
14
+ export type MapperFactory<T extends Exchange = any, U extends NormalizedData = NormalizedData> = (localTimestamp?: Date) => Mapper<T, U>
15
+ export type MapperDefinition<T extends Exchange = any, U extends NormalizedData = NormalizedData> =
16
+ | MapperCreator<T, U>
17
+ | MapperFactory<T, U>
18
+ export type ExchangeMapperDefinitions = Partial<Record<MapperKind, MapperDefinition>>
19
+ export type ExchangeMappers = Partial<Record<Exchange, Partial<Record<MapperKind, MapperCreator>>>>
20
+ export type ExchangeMapperDefinitionMap = Partial<Record<Exchange, ExchangeMapperDefinitions>>
21
+ type OnlyExchangeKeys<M> = M & Record<Exclude<keyof M, Exchange>, never>
22
+ type OnlyMapperKindKeys<M> = {
23
+ [ExchangeName in keyof M]: M[ExchangeName] & Record<Exclude<keyof M[ExchangeName], MapperKind>, never>
24
+ }
25
+
26
+ export type MapperEntry<T extends Exchange, U extends NormalizedData> = {
27
+ until?: Date
28
+ use: (localTimestamp?: Date) => Mapper<T, U>
29
+ }
30
+
31
+ export type MapperKind = 'trades' | 'bookChanges' | 'derivativeTickers' | 'optionsSummary' | 'liquidations' | 'bookTickers'
32
+
33
+ export const MAPPER_KINDS: readonly MapperKind[] = [
34
+ 'trades',
35
+ 'bookChanges',
36
+ 'derivativeTickers',
37
+ 'optionsSummary',
38
+ 'liquidations',
39
+ 'bookTickers'
40
+ ]
41
+
42
+ type UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (value: infer U) => void ? U : never
43
+
44
+ type MapperForKind<Mappers, Kind extends MapperKind> = Kind extends keyof Mappers ? Mappers[Kind] : never
45
+
46
+ type DefinitionMapperCollection<Definition extends ExchangeMappers, Kind extends MapperKind> = {
47
+ [ExchangeName in keyof Definition as MapperForKind<Definition[ExchangeName], Kind> extends MapperCreator ? ExchangeName : never]: Extract<
48
+ MapperForKind<Definition[ExchangeName], Kind>,
49
+ MapperCreator
50
+ >
51
+ }
52
+
53
+ type MergedExchangeMappers<Definitions extends readonly ExchangeMappers[]> = {
54
+ [Kind in MapperKind]: UnionToIntersection<
55
+ Definitions[number] extends infer Definition
56
+ ? Definition extends ExchangeMappers
57
+ ? DefinitionMapperCollection<Definition, Kind>
58
+ : never
59
+ : never
60
+ >
61
+ }
62
+
63
+ export const isRealTime = (date?: Date) => {
64
+ if (process.env.__NO_REAL_TIME__) {
65
+ return false
66
+ }
67
+ if (date === undefined) {
68
+ return false
69
+ }
70
+ return date.valueOf() + THREE_MINUTES_IN_MS > new Date().valueOf()
71
+ }
72
+
73
+ export function mapper<T extends Exchange, U extends NormalizedData>(entry: MapperEntry<T, U>): MapperCreator<T, U>
74
+ export function mapper<T extends Exchange, U extends NormalizedData>(entries: readonly MapperEntry<T, U>[]): MapperCreator<T, U>
75
+ export function mapper<T extends Exchange, U extends NormalizedData>(
76
+ entryOrEntries: MapperEntry<T, U> | readonly MapperEntry<T, U>[]
77
+ ): MapperCreator<T, U> {
78
+ const entries = Array.isArray(entryOrEntries) ? entryOrEntries : [entryOrEntries]
79
+ validateMapperEntries(entries)
80
+
81
+ const createMapper = ((localTimestamp?: Date) => {
82
+ if (localTimestamp === undefined || isRealTime(localTimestamp)) {
83
+ return entries[entries.length - 1].use(localTimestamp)
84
+ }
85
+
86
+ for (const entry of entries) {
87
+ if (entry.until === undefined || localTimestamp.valueOf() < entry.until.valueOf()) {
88
+ return entry.use(localTimestamp)
89
+ }
90
+ }
91
+
92
+ return entries[entries.length - 1].use(localTimestamp)
93
+ }) as MapperCreator<T, U>
94
+
95
+ createMapper.switchDates = entries.flatMap((entry) => (entry.until === undefined ? [] : [entry.until]))
96
+ return createMapper
97
+ }
98
+
99
+ export function exchangeMappers<M extends ExchangeMapperDefinitionMap>(
100
+ definition: OnlyExchangeKeys<M> & OnlyMapperKindKeys<M>
101
+ ): NormalizeExchangeMappers<M> {
102
+ validateExchangeMapperKeys(definition)
103
+
104
+ const normalized: ExchangeMappers = {}
105
+ for (const [exchange, mappers] of Object.entries(definition) as [Exchange, ExchangeMapperDefinitions][]) {
106
+ normalized[exchange] = {}
107
+
108
+ for (const kind of MAPPER_KINDS) {
109
+ const createMapper = mappers[kind]
110
+ if (createMapper !== undefined) {
111
+ normalized[exchange][kind] = createMapper as MapperCreator
112
+ }
113
+ }
114
+ }
115
+
116
+ return normalized as NormalizeExchangeMappers<M>
117
+ }
118
+
119
+ export function mergeExchangeMappers<Definitions extends readonly ExchangeMappers[]>(
120
+ ...definitions: Definitions
121
+ ): MergedExchangeMappers<Definitions> {
122
+ const merged = MAPPER_KINDS.reduce(
123
+ (result, kind) => {
124
+ result[kind] = {}
125
+ return result
126
+ },
127
+ {} as Record<MapperKind, MapperCollection>
128
+ )
129
+
130
+ for (const definition of definitions) {
131
+ for (const [exchange, mappers] of Object.entries(definition)) {
132
+ for (const kind of MAPPER_KINDS) {
133
+ const createMapper = mappers[kind]
134
+ if (createMapper !== undefined) {
135
+ merged[kind][exchange] = createMapper
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ return merged as MergedExchangeMappers<Definitions>
142
+ }
143
+
144
+ function validateMapperEntries<T extends Exchange, U extends NormalizedData>(entries: readonly MapperEntry<T, U>[]) {
145
+ if (entries.length === 0) {
146
+ throw new Error('mapper requires at least one entry')
147
+ }
148
+
149
+ let previousUntil: Date | undefined
150
+ for (let i = 0; i < entries.length; i++) {
151
+ const { until, use } = entries[i]
152
+
153
+ if (typeof use !== 'function') {
154
+ throw new Error(`mapper entry ${i} requires a use function`)
155
+ }
156
+
157
+ if (i === entries.length - 1) {
158
+ if (until !== undefined) {
159
+ throw new Error('last mapper entry must omit until')
160
+ }
161
+ continue
162
+ }
163
+
164
+ if (until === undefined) {
165
+ throw new Error('only last mapper entry can omit until')
166
+ }
167
+
168
+ if (until instanceof Date === false || Number.isFinite(until.valueOf()) === false) {
169
+ throw new Error(`mapper entry ${i} has an invalid until date`)
170
+ }
171
+
172
+ if (previousUntil !== undefined && previousUntil.valueOf() >= until.valueOf()) {
173
+ throw new Error('mapper until dates must be strictly increasing')
174
+ }
175
+
176
+ previousUntil = until
177
+ }
178
+ }
179
+
180
+ type NormalizeExchangeMappers<M extends ExchangeMapperDefinitionMap> = {
181
+ [ExchangeName in keyof M]: {
182
+ [Kind in keyof M[ExchangeName]]: Extract<M[ExchangeName][Kind], MapperDefinition> extends MapperDefinition<infer T, infer U>
183
+ ? MapperCreator<T, U>
184
+ : never
185
+ }
186
+ }
187
+
188
+ const exchangeIds = new Set<string>(EXCHANGES)
189
+ const mapperKindIds = new Set<string>(MAPPER_KINDS)
190
+
191
+ function validateExchangeMapperKeys(definition: ExchangeMapperDefinitionMap) {
192
+ for (const [exchange, mappers] of Object.entries(definition)) {
193
+ if (exchangeIds.has(exchange) === false) {
194
+ throw new Error(`Unsupported exchange mapper key: ${exchange}`)
195
+ }
196
+
197
+ for (const kind of Object.keys(mappers ?? {})) {
198
+ if (mapperKindIds.has(kind) === false) {
199
+ throw new Error(`Unsupported mapper key for ${exchange}: ${kind}`)
200
+ }
201
+ }
202
+ }
203
+ }
@@ -1,8 +1,27 @@
1
1
  import { asNonZeroNumberOrUndefined, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, Exchange, Trade } from '../types.ts'
3
3
  import { Mapper } from './mapper.ts'
4
+ import { exchangeMappers } from './registry.ts'
5
+
6
+ export const serumMappers = exchangeMappers({
7
+ serum: {
8
+ trades: () => new SerumTradesMapper('serum'),
9
+ bookChanges: () => new SerumBookChangeMapper('serum'),
10
+ bookTickers: () => new SerumBookTickerMapper('serum')
11
+ },
12
+ 'star-atlas': {
13
+ trades: () => new SerumTradesMapper('star-atlas'),
14
+ bookChanges: () => new SerumBookChangeMapper('star-atlas'),
15
+ bookTickers: () => new SerumBookTickerMapper('star-atlas')
16
+ },
17
+ mango: {
18
+ trades: () => new SerumTradesMapper('mango'),
19
+ bookChanges: () => new SerumBookChangeMapper('mango'),
20
+ bookTickers: () => new SerumBookTickerMapper('mango')
21
+ }
22
+ })
4
23
 
5
- export class SerumTradesMapper implements Mapper<'serum' | 'star-atlas', Trade> {
24
+ class SerumTradesMapper implements Mapper<'serum' | 'star-atlas', Trade> {
6
25
  constructor(private readonly _exchange: Exchange) {}
7
26
 
8
27
  canHandle(message: SerumVialTrade) {
@@ -37,7 +56,7 @@ export class SerumTradesMapper implements Mapper<'serum' | 'star-atlas', Trade>
37
56
  }
38
57
  }
39
58
 
40
- export class SerumBookChangeMapper implements Mapper<'serum' | 'star-atlas', BookChange> {
59
+ class SerumBookChangeMapper implements Mapper<'serum' | 'star-atlas', BookChange> {
41
60
  constructor(private readonly _exchange: Exchange) {}
42
61
 
43
62
  canHandle(message: SerumVialL2Snapshot | SerumVialL2Update) {
@@ -81,7 +100,7 @@ export class SerumBookChangeMapper implements Mapper<'serum' | 'star-atlas', Boo
81
100
  }
82
101
  }
83
102
 
84
- export class SerumBookTickerMapper implements Mapper<'serum' | 'star-atlas', BookTicker> {
103
+ class SerumBookTickerMapper implements Mapper<'serum' | 'star-atlas', BookTicker> {
85
104
  constructor(private readonly _exchange: Exchange) {}
86
105
 
87
106
  canHandle(message: SerumVialQuote) {
@@ -1,8 +1,16 @@
1
1
  import { fromMicroSecondsToDate, upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookPriceLevel, Trade } from '../types.ts'
3
3
  import { Mapper } from './mapper.ts'
4
+ import { exchangeMappers } from './registry.ts'
4
5
 
5
- export class UpbitTradesMapper implements Mapper<'upbit', Trade> {
6
+ export const upbitMappers = exchangeMappers({
7
+ upbit: {
8
+ trades: () => new UpbitTradesMapper(),
9
+ bookChanges: () => new UpbitBookChangeMapper()
10
+ }
11
+ })
12
+
13
+ class UpbitTradesMapper implements Mapper<'upbit', Trade> {
6
14
  canHandle(message: UpbitTrade) {
7
15
  return message.type === 'trade'
8
16
  }
@@ -33,7 +41,7 @@ export class UpbitTradesMapper implements Mapper<'upbit', Trade> {
33
41
  }
34
42
  }
35
43
 
36
- export class UpbitBookChangeMapper implements Mapper<'upbit', BookChange> {
44
+ class UpbitBookChangeMapper implements Mapper<'upbit', BookChange> {
37
45
  canHandle(message: UpbitOrderBook) {
38
46
  return message.type === 'orderbook'
39
47
  }
@@ -1,8 +1,18 @@
1
1
  import { upperCaseSymbols } from '../handy.ts'
2
2
  import { BookChange, BookTicker, DerivativeTicker, Exchange, FilterForExchange, Liquidation, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
+ import { exchangeMappers } from './registry.ts'
5
+
6
+ export const wooxMappers = exchangeMappers({
7
+ 'woo-x': {
8
+ trades: () => wooxTradesMapper,
9
+ bookChanges: () => new WooxBookChangeMapper(),
10
+ derivativeTickers: () => new WooxDerivativeTickerMapper(),
11
+ bookTickers: () => new WooxBookTickerMapper()
12
+ }
13
+ })
4
14
 
5
- export const wooxTradesMapper: Mapper<'woo-x', Trade> = {
15
+ const wooxTradesMapper: Mapper<'woo-x', Trade> = {
6
16
  canHandle(message: WooxTradeMessage) {
7
17
  return message.topic !== undefined && message.topic.endsWith('@trade')
8
18
  },
@@ -39,7 +49,7 @@ export const wooxTradesMapper: Mapper<'woo-x', Trade> = {
39
49
  }
40
50
  }
41
51
 
42
- export class WooxBookChangeMapper implements Mapper<'woo-x', BookChange> {
52
+ class WooxBookChangeMapper implements Mapper<'woo-x', BookChange> {
43
53
  private readonly _symbolToDepthInfoMapping: { [key: string]: LocalDepthInfo } = {}
44
54
 
45
55
  canHandle(message: WooxOrderbookMessage | WooxOrderbookupdateMessage) {
@@ -149,7 +159,7 @@ export class WooxBookChangeMapper implements Mapper<'woo-x', BookChange> {
149
159
  }
150
160
  }
151
161
 
152
- export class WooxDerivativeTickerMapper implements Mapper<'woo-x', DerivativeTicker> {
162
+ class WooxDerivativeTickerMapper implements Mapper<'woo-x', DerivativeTicker> {
153
163
  private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
154
164
  private readonly _indexPrices = new Map<string, number>()
155
165
 
@@ -236,7 +246,7 @@ export class WooxDerivativeTickerMapper implements Mapper<'woo-x', DerivativeTic
236
246
  }
237
247
  }
238
248
 
239
- export class WooxBookTickerMapper implements Mapper<'woo-x', BookTicker> {
249
+ class WooxBookTickerMapper implements Mapper<'woo-x', BookTicker> {
240
250
  canHandle(message: WooxTradeMessage) {
241
251
  return message.topic !== undefined && message.topic.endsWith('@bbo')
242
252
  }
@@ -0,0 +1,10 @@
1
+ export function getOkexOptionsFamilyOrIndex(symbol: string) {
2
+ const symbolParts = symbol.split('-')
3
+ return `${symbolParts[0]}-${symbolParts[1]}`
4
+ }
5
+
6
+ export function getOkexOptionsUnderlyingIndex(symbol: string) {
7
+ const symbolParts = symbol.split('-')
8
+ const quote = symbolParts[1].split('_')[0]
9
+ return `${symbolParts[0]}-${quote}`
10
+ }
@@ -12,11 +12,14 @@ export class HyperliquidRealTimeFeed extends RealTimeFeedBase {
12
12
  }
13
13
 
14
14
  return filter.symbols.map((symbol) => {
15
+ const isFastBook = filter.channel === 'fastBook'
16
+
15
17
  return {
16
18
  method: 'subscribe',
17
19
  subscription: {
18
20
  coin: symbol,
19
- type: filter.channel
21
+ type: isFastBook ? 'l2Book' : filter.channel,
22
+ fast: isFastBook ? true : undefined
20
23
  }
21
24
  }
22
25
  })
@@ -54,6 +54,8 @@ import { CoinbaseInternationalRealTimeFeed } from './coinbaseinternational.ts'
54
54
  import { HyperliquidRealTimeFeed } from './hyperliquid.ts'
55
55
  import { LighterRealTimeFeed } from './lighter.ts'
56
56
  import { BullishRealTimeFeed } from './bullish.ts'
57
+ import { MexcFuturesRealTimeFeed } from './mexcfutures.ts'
58
+ import { MexcRealTimeFeed } from './mexc.ts'
57
59
  import { PolymarketRealTimeFeed } from './polymarket.ts'
58
60
 
59
61
  export * from './realtimefeed.ts'
@@ -94,6 +96,7 @@ const realTimeFeedsMap: {
94
96
  delta: DeltaRealTimeFeed,
95
97
  'gate-io': GateIORealTimeFeed,
96
98
  'gate-io-futures': GateIOFuturesRealTimeFeed,
99
+ 'mexc-futures': MexcFuturesRealTimeFeed,
97
100
  poloniex: PoloniexRealTimeFeed,
98
101
  coinflex: CoinflexRealTimeFeed,
99
102
  upbit: UpbitRealTimeFeed,
@@ -120,6 +123,7 @@ const realTimeFeedsMap: {
120
123
  hyperliquid: HyperliquidRealTimeFeed,
121
124
  lighter: LighterRealTimeFeed,
122
125
  bullish: BullishRealTimeFeed,
126
+ mexc: MexcRealTimeFeed,
123
127
  polymarket: PolymarketRealTimeFeed
124
128
  }
125
129