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.
- package/dist/consts.d.ts +3 -1
- package/dist/consts.d.ts.map +1 -1
- package/dist/consts.js +21 -1
- package/dist/consts.js.map +1 -1
- package/dist/handy.d.ts.map +1 -1
- package/dist/handy.js +6 -3
- package/dist/handy.js.map +1 -1
- package/dist/mappers/ascendex.d.ts +6 -99
- package/dist/mappers/ascendex.d.ts.map +1 -1
- package/dist/mappers/ascendex.js +13 -4
- package/dist/mappers/ascendex.js.map +1 -1
- package/dist/mappers/binance.d.ts +27 -154
- package/dist/mappers/binance.d.ts.map +1 -1
- package/dist/mappers/binance.js +49 -15
- package/dist/mappers/binance.js.map +1 -1
- package/dist/mappers/binancedex.d.ts +7 -4
- package/dist/mappers/binancedex.d.ts.map +1 -1
- package/dist/mappers/binancedex.js +11 -3
- package/dist/mappers/binancedex.js.map +1 -1
- package/dist/mappers/binanceeuropeanoptions.d.ts +6 -216
- package/dist/mappers/binanceeuropeanoptions.d.ts.map +1 -1
- package/dist/mappers/binanceeuropeanoptions.js +26 -7
- package/dist/mappers/binanceeuropeanoptions.js.map +1 -1
- package/dist/mappers/bitfinex.d.ts +15 -100
- package/dist/mappers/bitfinex.d.ts.map +1 -1
- package/dist/mappers/bitfinex.js +20 -5
- package/dist/mappers/bitfinex.js.map +1 -1
- package/dist/mappers/bitflyer.d.ts +5 -41
- package/dist/mappers/bitflyer.d.ts.map +1 -1
- package/dist/mappers/bitflyer.js +11 -3
- package/dist/mappers/bitflyer.js.map +1 -1
- package/dist/mappers/bitget.d.ts +12 -269
- package/dist/mappers/bitget.d.ts.map +1 -1
- package/dist/mappers/bitget.js +46 -9
- package/dist/mappers/bitget.js.map +1 -1
- package/dist/mappers/bitmex.d.ts +8 -56
- package/dist/mappers/bitmex.d.ts.map +1 -1
- package/dist/mappers/bitmex.js +15 -5
- package/dist/mappers/bitmex.js.map +1 -1
- package/dist/mappers/bitnomial.d.ts +4 -44
- package/dist/mappers/bitnomial.d.ts.map +1 -1
- package/dist/mappers/bitnomial.js +9 -2
- package/dist/mappers/bitnomial.js.map +1 -1
- package/dist/mappers/bitstamp.d.ts +4 -44
- package/dist/mappers/bitstamp.d.ts.map +1 -1
- package/dist/mappers/bitstamp.js +9 -2
- package/dist/mappers/bitstamp.js.map +1 -1
- package/dist/mappers/blockchaincom.d.ts +4 -63
- package/dist/mappers/blockchaincom.d.ts.map +1 -1
- package/dist/mappers/blockchaincom.js +9 -2
- package/dist/mappers/blockchaincom.js.map +1 -1
- package/dist/mappers/bullish.d.ts +8 -158
- package/dist/mappers/bullish.d.ts.map +1 -1
- package/dist/mappers/bullish.js +15 -5
- package/dist/mappers/bullish.js.map +1 -1
- package/dist/mappers/bybit.d.ts +61 -407
- package/dist/mappers/bybit.d.ts.map +1 -1
- package/dist/mappers/bybit.js +60 -15
- package/dist/mappers/bybit.js.map +1 -1
- package/dist/mappers/bybitspot.d.ts +1 -1
- package/dist/mappers/coinbase.d.ts +6 -39
- package/dist/mappers/coinbase.d.ts.map +1 -1
- package/dist/mappers/coinbase.js +11 -3
- package/dist/mappers/coinbase.js.map +1 -1
- package/dist/mappers/coinbaseinternational.d.ts +7 -78
- package/dist/mappers/coinbaseinternational.d.ts.map +1 -1
- package/dist/mappers/coinbaseinternational.js +13 -4
- package/dist/mappers/coinbaseinternational.js.map +1 -1
- package/dist/mappers/coinflex.d.ts +6 -24
- package/dist/mappers/coinflex.d.ts.map +1 -1
- package/dist/mappers/coinflex.js +11 -3
- package/dist/mappers/coinflex.js.map +1 -1
- package/dist/mappers/cryptocom.d.ts +22 -328
- package/dist/mappers/cryptocom.d.ts.map +1 -1
- package/dist/mappers/cryptocom.js +13 -4
- package/dist/mappers/cryptocom.js.map +1 -1
- package/dist/mappers/cryptofacilities.d.ts +8 -96
- package/dist/mappers/cryptofacilities.d.ts.map +1 -1
- package/dist/mappers/cryptofacilities.js +24 -7
- package/dist/mappers/cryptofacilities.js.map +1 -1
- package/dist/mappers/delta.d.ts +7 -114
- package/dist/mappers/delta.d.ts.map +1 -1
- package/dist/mappers/delta.js +30 -10
- package/dist/mappers/delta.js.map +1 -1
- package/dist/mappers/deribit.d.ts +8 -66
- package/dist/mappers/deribit.d.ts.map +1 -1
- package/dist/mappers/deribit.js +17 -6
- package/dist/mappers/deribit.js.map +1 -1
- package/dist/mappers/dydx.d.ts +5 -146
- package/dist/mappers/dydx.d.ts.map +1 -1
- package/dist/mappers/dydx.js +11 -3
- package/dist/mappers/dydx.js.map +1 -1
- package/dist/mappers/dydxv4.d.ts +6 -173
- package/dist/mappers/dydxv4.d.ts.map +1 -1
- package/dist/mappers/dydxv4.js +13 -4
- package/dist/mappers/dydxv4.js.map +1 -1
- package/dist/mappers/ftx.d.ts +12 -107
- package/dist/mappers/ftx.d.ts.map +1 -1
- package/dist/mappers/ftx.js +21 -6
- package/dist/mappers/ftx.js.map +1 -1
- package/dist/mappers/gateio.d.ts +6 -191
- package/dist/mappers/gateio.d.ts.map +1 -1
- package/dist/mappers/gateio.js +28 -8
- package/dist/mappers/gateio.js.map +1 -1
- package/dist/mappers/gateiofutures.d.ts +7 -122
- package/dist/mappers/gateiofutures.d.ts.map +1 -1
- package/dist/mappers/gateiofutures.js +13 -4
- package/dist/mappers/gateiofutures.js.map +1 -1
- package/dist/mappers/gemini.d.ts +6 -3
- package/dist/mappers/gemini.d.ts.map +1 -1
- package/dist/mappers/gemini.js +9 -2
- package/dist/mappers/gemini.js.map +1 -1
- package/dist/mappers/hitbtc.d.ts +6 -3
- package/dist/mappers/hitbtc.d.ts.map +1 -1
- package/dist/mappers/hitbtc.js +9 -2
- package/dist/mappers/hitbtc.js.map +1 -1
- package/dist/mappers/huobi.d.ts +118 -289
- package/dist/mappers/huobi.d.ts.map +1 -1
- package/dist/mappers/huobi.js +45 -7
- package/dist/mappers/huobi.js.map +1 -1
- package/dist/mappers/hyperliquid.d.ts +6 -86
- package/dist/mappers/hyperliquid.d.ts.map +1 -1
- package/dist/mappers/hyperliquid.js +13 -4
- package/dist/mappers/hyperliquid.js.map +1 -1
- package/dist/mappers/index.d.ts +784 -272
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +64 -432
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/kraken.d.ts +7 -4
- package/dist/mappers/kraken.d.ts.map +1 -1
- package/dist/mappers/kraken.js +11 -3
- package/dist/mappers/kraken.js.map +1 -1
- package/dist/mappers/kucoin.d.ts +6 -122
- package/dist/mappers/kucoin.d.ts.map +1 -1
- package/dist/mappers/kucoin.js +13 -5
- package/dist/mappers/kucoin.js.map +1 -1
- package/dist/mappers/kucoinfutures.d.ts +6 -207
- package/dist/mappers/kucoinfutures.d.ts.map +1 -1
- package/dist/mappers/kucoinfutures.js +15 -6
- package/dist/mappers/kucoinfutures.js.map +1 -1
- package/dist/mappers/lighter.d.ts +8 -156
- package/dist/mappers/lighter.d.ts.map +1 -1
- package/dist/mappers/lighter.js +15 -5
- package/dist/mappers/lighter.js.map +1 -1
- package/dist/mappers/mapper.d.ts +3 -1
- package/dist/mappers/mapper.d.ts.map +1 -1
- package/dist/mappers/mapper.js.map +1 -1
- package/dist/mappers/mexc.d.ts +122 -0
- package/dist/mappers/mexc.d.ts.map +1 -0
- package/dist/mappers/mexc.js +205 -0
- package/dist/mappers/mexc.js.map +1 -0
- package/dist/mappers/mexcfutures.d.ts +137 -0
- package/dist/mappers/mexcfutures.d.ts.map +1 -0
- package/dist/mappers/mexcfutures.js +225 -0
- package/dist/mappers/mexcfutures.js.map +1 -0
- package/dist/mappers/okex.d.ts +36 -473
- package/dist/mappers/okex.d.ts.map +1 -1
- package/dist/mappers/okex.js +143 -37
- package/dist/mappers/okex.js.map +1 -1
- package/dist/mappers/phemex.d.ts +5 -82
- package/dist/mappers/phemex.d.ts.map +1 -1
- package/dist/mappers/phemex.js +22 -4
- package/dist/mappers/phemex.js.map +1 -1
- package/dist/mappers/poloniex.d.ts +5 -90
- package/dist/mappers/poloniex.d.ts.map +1 -1
- package/dist/mappers/poloniex.js +18 -4
- package/dist/mappers/poloniex.js.map +1 -1
- package/dist/mappers/polymarket.d.ts +7 -31
- package/dist/mappers/polymarket.d.ts.map +1 -1
- package/dist/mappers/polymarket.js +11 -3
- package/dist/mappers/polymarket.js.map +1 -1
- package/dist/mappers/registry.d.ts +41 -0
- package/dist/mappers/registry.d.ts.map +1 -0
- package/dist/mappers/registry.js +111 -0
- package/dist/mappers/registry.js.map +1 -0
- package/dist/mappers/serum.d.ts +16 -89
- package/dist/mappers/serum.d.ts.map +1 -1
- package/dist/mappers/serum.js +21 -3
- package/dist/mappers/serum.js.map +1 -1
- package/dist/mappers/upbit.d.ts +5 -47
- package/dist/mappers/upbit.d.ts.map +1 -1
- package/dist/mappers/upbit.js +9 -2
- package/dist/mappers/upbit.js.map +1 -1
- package/dist/mappers/woox.d.ts +6 -107
- package/dist/mappers/woox.d.ts.map +1 -1
- package/dist/mappers/woox.js +13 -4
- package/dist/mappers/woox.js.map +1 -1
- package/dist/okexsymbols.d.ts +3 -0
- package/dist/okexsymbols.d.ts.map +1 -0
- package/dist/okexsymbols.js +10 -0
- package/dist/okexsymbols.js.map +1 -0
- package/dist/realtimefeeds/hyperliquid.d.ts.map +1 -1
- package/dist/realtimefeeds/hyperliquid.js +3 -1
- package/dist/realtimefeeds/hyperliquid.js.map +1 -1
- package/dist/realtimefeeds/index.d.ts.map +1 -1
- package/dist/realtimefeeds/index.js +4 -0
- package/dist/realtimefeeds/index.js.map +1 -1
- package/dist/realtimefeeds/mexc.d.ts +35 -0
- package/dist/realtimefeeds/mexc.d.ts.map +1 -0
- package/dist/realtimefeeds/mexc.js +261 -0
- package/dist/realtimefeeds/mexc.js.map +1 -0
- package/dist/realtimefeeds/mexcfutures.d.ts +25 -0
- package/dist/realtimefeeds/mexcfutures.d.ts.map +1 -0
- package/dist/realtimefeeds/mexcfutures.js +203 -0
- package/dist/realtimefeeds/mexcfutures.js.map +1 -0
- package/dist/realtimefeeds/okex.d.ts +1 -0
- package/dist/realtimefeeds/okex.d.ts.map +1 -1
- package/dist/realtimefeeds/okex.js +7 -5
- package/dist/realtimefeeds/okex.js.map +1 -1
- package/dist/realtimefeeds/realtimefeed.d.ts +1 -0
- package/dist/realtimefeeds/realtimefeed.d.ts.map +1 -1
- package/dist/realtimefeeds/realtimefeed.js +4 -1
- package/dist/realtimefeeds/realtimefeed.js.map +1 -1
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +62 -13
- package/dist/replay.js.map +1 -1
- package/example.js +133 -31
- package/package.json +2 -1
- package/src/consts.ts +22 -1
- package/src/handy.ts +6 -3
- package/src/mappers/ascendex.ts +14 -4
- package/src/mappers/binance.ts +61 -21
- package/src/mappers/binancedex.ts +12 -3
- package/src/mappers/binanceeuropeanoptions.ts +28 -7
- package/src/mappers/bitfinex.ts +21 -5
- package/src/mappers/bitflyer.ts +12 -3
- package/src/mappers/bitget.ts +48 -9
- package/src/mappers/bitmex.ts +16 -5
- package/src/mappers/bitnomial.ts +10 -2
- package/src/mappers/bitstamp.ts +10 -2
- package/src/mappers/blockchaincom.ts +10 -2
- package/src/mappers/bullish.ts +16 -5
- package/src/mappers/bybit.ts +70 -15
- package/src/mappers/coinbase.ts +12 -3
- package/src/mappers/coinbaseinternational.ts +14 -4
- package/src/mappers/coinflex.ts +12 -3
- package/src/mappers/cryptocom.ts +14 -4
- package/src/mappers/cryptofacilities.ts +30 -6
- package/src/mappers/delta.ts +41 -7
- package/src/mappers/deribit.ts +18 -6
- package/src/mappers/dydx.ts +12 -3
- package/src/mappers/dydxv4.ts +14 -4
- package/src/mappers/ftx.ts +22 -6
- package/src/mappers/gateio.ts +34 -8
- package/src/mappers/gateiofutures.ts +14 -4
- package/src/mappers/gemini.ts +10 -2
- package/src/mappers/hitbtc.ts +10 -2
- package/src/mappers/huobi.ts +47 -10
- package/src/mappers/hyperliquid.ts +14 -4
- package/src/mappers/index.ts +133 -679
- package/src/mappers/kraken.ts +12 -3
- package/src/mappers/kucoin.ts +19 -5
- package/src/mappers/kucoinfutures.ts +20 -5
- package/src/mappers/lighter.ts +16 -5
- package/src/mappers/mapper.ts +3 -1
- package/src/mappers/mexc.ts +324 -0
- package/src/mappers/mexcfutures.ts +352 -0
- package/src/mappers/okex.ts +178 -37
- package/src/mappers/phemex.ts +25 -4
- package/src/mappers/poloniex.ts +20 -4
- package/src/mappers/polymarket.ts +12 -3
- package/src/mappers/registry.ts +203 -0
- package/src/mappers/serum.ts +22 -3
- package/src/mappers/upbit.ts +10 -2
- package/src/mappers/woox.ts +14 -4
- package/src/okexsymbols.ts +10 -0
- package/src/realtimefeeds/hyperliquid.ts +4 -1
- package/src/realtimefeeds/index.ts +4 -0
- package/src/realtimefeeds/mexc.ts +327 -0
- package/src/realtimefeeds/mexcfutures.ts +269 -0
- package/src/realtimefeeds/okex.ts +7 -5
- package/src/realtimefeeds/realtimefeed.ts +5 -1
- package/src/replay.ts +73 -15
package/src/mappers/phemex.ts
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
329
|
+
class PhemexDerivativeTickerMapper implements Mapper<'phemex', DerivativeTicker> {
|
|
309
330
|
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
310
331
|
|
|
311
332
|
canHandle(message: PhemexTicker) {
|
package/src/mappers/poloniex.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|
package/src/mappers/serum.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
+
class SerumBookTickerMapper implements Mapper<'serum' | 'star-atlas', BookTicker> {
|
|
85
104
|
constructor(private readonly _exchange: Exchange) {}
|
|
86
105
|
|
|
87
106
|
canHandle(message: SerumVialQuote) {
|
package/src/mappers/upbit.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
44
|
+
class UpbitBookChangeMapper implements Mapper<'upbit', BookChange> {
|
|
37
45
|
canHandle(message: UpbitOrderBook) {
|
|
38
46
|
return message.type === 'orderbook'
|
|
39
47
|
}
|
package/src/mappers/woox.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|