tardis-dev 16.6.0 → 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.
package/README.md CHANGED
@@ -128,7 +128,7 @@ const realTimeStreams = exchangesToStream.map((e) => {
128
128
  // combine all real-time message streams into one
129
129
  const messages = combine(...realTimeStreams)
130
130
 
131
- // create book snapshots with depth1 that are produced
131
+ // create depth-1 book snapshots that are produced
132
132
  // every time best bid/ask info is changed
133
133
  // effectively computing real-time quotes
134
134
  const realTimeQuoteComputable = computeBookSnapshots({
@@ -137,7 +137,7 @@ const realTimeQuoteComputable = computeBookSnapshots({
137
137
  name: 'realtime_quote'
138
138
  })
139
139
 
140
- // compute real-time quotes for combines real-time messages
140
+ // compute real-time quotes for combined real-time messages
141
141
  const messagesWithQuotes = compute(messages, realTimeQuoteComputable)
142
142
 
143
143
  const spreads = {}
@@ -164,7 +164,7 @@ for await (const message of messagesWithQuotes) {
164
164
 
165
165
  ### Seamless switching between real-time streaming and historical market data replay
166
166
 
167
- Example showing simple pattern of providing `async iterable` of market data messages to the function that can process them no matter if it's is real-time or historical market data. That effectively enables having the same 'data pipeline' for backtesting and live trading.
167
+ Example showing a simple pattern of providing an `async iterable` of market data messages to a function that can process real-time or historical market data. That enables the same data pipeline for backtesting and live trading.
168
168
 
169
169
  ```javascript
170
170
  import { replayNormalized, streamNormalized, normalizeTrades, compute, computeTradeBars } from 'tardis-dev'
@@ -205,7 +205,7 @@ async function produceVolumeBasedTradeBars(messages) {
205
205
 
206
206
  await produceVolumeBasedTradeBars(historicalMessages)
207
207
 
208
- // or for real time data
208
+ // or for real-time data
209
209
  // await produceVolumeBasedTradeBars(realTimeMessages)
210
210
  ```
211
211
 
@@ -24,7 +24,7 @@ export type UnderlyingType = 'native' | 'equity' | 'commodity' | 'fixed_income'
24
24
  export interface InstrumentInfo {
25
25
  /** symbol id */
26
26
  id: string;
27
- /** dataset symbol id, may differ from id */
27
+ /** dataset symbol id, present after the symbol appears in exported dataset metadata */
28
28
  datasetId?: string;
29
29
  /** exchange id */
30
30
  exchange: string;
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentinfo.d.ts","sourceRoot":"","sources":["../src/instrumentinfo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instrumentinfo.d.ts","sourceRoot":"","sources":["../src/instrumentinfo.ts"],"names":[],"mappings":"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"}
@@ -50,7 +50,9 @@ export async function findInstrumentSymbols(exchanges, filter, selector = 'id')
50
50
  const instruments = (await getInstrumentInfoForExchange(exchange, filter));
51
51
  return {
52
52
  exchange,
53
- symbols: instruments.map((instrument) => (selector === 'datasetId' ? (instrument.datasetId ?? instrument.id) : instrument.id))
53
+ symbols: selector === 'datasetId'
54
+ ? instruments.flatMap((instrument) => instrument.datasetId ?? [])
55
+ : instruments.map((instrument) => instrument.id)
54
56
  };
55
57
  }));
56
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentinfo.js","sourceRoot":"","sources":["../src/instrumentinfo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instrumentinfo.js","sourceRoot":"","sources":["../src/instrumentinfo.ts"],"names":[],"mappings":"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"}
@@ -363,7 +363,7 @@ export declare const normalizeBookChanges: Normalizer<{
363
363
  } & {
364
364
  upbit: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookChange>;
365
365
  } & {
366
- 'woo-x': import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookChange>;
366
+ 'woo-x': import("./registry.ts").MapperCreator<any, BookChange>;
367
367
  }, BookChange>;
368
368
  export declare const normalizeDerivativeTickers: Normalizer<{
369
369
  ascendex: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", DerivativeTicker>;
@@ -468,7 +468,7 @@ export declare const normalizeDerivativeTickers: Normalizer<{
468
468
  } & {
469
469
  upbit: never;
470
470
  } & {
471
- 'woo-x': import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", DerivativeTicker>;
471
+ 'woo-x': import("./registry.ts").MapperCreator<any, DerivativeTicker>;
472
472
  }, DerivativeTicker>;
473
473
  export declare const normalizeOptionsSummary: Normalizer<{
474
474
  ascendex: never;
@@ -783,6 +783,6 @@ export declare const normalizeBookTickers: Normalizer<{
783
783
  } & {
784
784
  upbit: never;
785
785
  } & {
786
- 'woo-x': import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookTicker>;
786
+ 'woo-x': import("./registry.ts").MapperCreator<any, BookTicker>;
787
787
  }, BookTicker>;
788
788
  //# sourceMappingURL=index.d.ts.map
@@ -2,9 +2,9 @@ import { BookChange, BookTicker, DerivativeTicker, Trade } from '../types.ts';
2
2
  export declare const wooxMappers: {
3
3
  'woo-x': {
4
4
  trades: import("./registry.ts").MapperCreator<"woo-x", Trade>;
5
- bookChanges: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookChange>;
6
- derivativeTickers: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", DerivativeTicker>;
7
- bookTickers: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookTicker>;
5
+ bookChanges: import("./registry.ts").MapperCreator<any, BookChange>;
6
+ derivativeTickers: import("./registry.ts").MapperCreator<any, DerivativeTicker>;
7
+ bookTickers: import("./registry.ts").MapperCreator<any, BookTicker>;
8
8
  };
9
9
  };
10
10
  //# sourceMappingURL=woox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"woox.d.ts","sourceRoot":"","sources":["../../src/mappers/woox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAA4C,KAAK,EAAE,MAAM,aAAa,CAAA;AAIvH,eAAO,MAAM,WAAW;;;;;;;CAOtB,CAAA"}
1
+ {"version":3,"file":"woox.d.ts","sourceRoot":"","sources":["../../src/mappers/woox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAQ7E,eAAO,MAAM,WAAW;;;;;;;CAgBtB,CAAA"}
@@ -1,12 +1,24 @@
1
- import { upperCaseSymbols } from "../handy.js";
1
+ import { asNumberOrUndefined, upperCaseSymbols } from "../handy.js";
2
2
  import { PendingTickerInfoHelper } from "./mapper.js";
3
- import { exchangeMappers } from "./registry.js";
3
+ import { exchangeMappers, mapper } from "./registry.js";
4
+ const WOOX_V3_SWITCH_DATE = new Date('2026-06-29T22:02:00.000Z');
5
+ // WOO X kept Tardis channel names during the V3 rollout, but changed raw topic layout and payload fields.
6
+ // Keep old and V3 mappers separate so replay uses the schema that was actually recorded at the message time.
4
7
  export const wooxMappers = exchangeMappers({
5
8
  'woo-x': {
6
- trades: () => wooxTradesMapper,
7
- bookChanges: () => new WooxBookChangeMapper(),
8
- derivativeTickers: () => new WooxDerivativeTickerMapper(),
9
- bookTickers: () => new WooxBookTickerMapper()
9
+ trades: mapper([{ until: WOOX_V3_SWITCH_DATE, use: () => wooxTradesMapper }, { use: () => wooxV3TradesMapper }]),
10
+ bookChanges: mapper([
11
+ { until: WOOX_V3_SWITCH_DATE, use: () => new WooxBookChangeMapper() },
12
+ { use: () => new WooxV3BookChangeMapper() }
13
+ ]),
14
+ derivativeTickers: mapper([
15
+ { until: WOOX_V3_SWITCH_DATE, use: () => new WooxDerivativeTickerMapper() },
16
+ { use: () => new WooxV3DerivativeTickerMapper() }
17
+ ]),
18
+ bookTickers: mapper([
19
+ { until: WOOX_V3_SWITCH_DATE, use: () => new WooxBookTickerMapper() },
20
+ { use: () => new WooxV3BookTickerMapper() }
21
+ ])
10
22
  }
11
23
  });
12
24
  const wooxTradesMapper = {
@@ -41,6 +53,36 @@ const wooxTradesMapper = {
41
53
  };
42
54
  }
43
55
  };
56
+ const wooxV3TradesMapper = {
57
+ canHandle(message) {
58
+ return message.topic !== undefined && message.topic.startsWith('trade@');
59
+ },
60
+ getFilters(symbols) {
61
+ symbols = upperCaseSymbols(symbols);
62
+ return [
63
+ {
64
+ channel: 'trade',
65
+ symbols
66
+ }
67
+ ];
68
+ },
69
+ *map(message, localTimestamp) {
70
+ if (message.data.src === 0) {
71
+ return;
72
+ }
73
+ yield {
74
+ type: 'trade',
75
+ symbol: message.data.s,
76
+ exchange: 'woo-x',
77
+ id: undefined,
78
+ price: Number(message.data.px),
79
+ amount: Number(message.data.sx),
80
+ side: message.data.sd === 'SELL' ? 'sell' : 'buy',
81
+ timestamp: new Date(message.data.ts),
82
+ localTimestamp
83
+ };
84
+ }
85
+ };
44
86
  class WooxBookChangeMapper {
45
87
  _symbolToDepthInfoMapping = {};
46
88
  canHandle(message) {
@@ -132,6 +174,104 @@ class WooxBookChangeMapper {
132
174
  return { price, amount };
133
175
  }
134
176
  }
177
+ class WooxV3BookChangeMapper {
178
+ _symbolToDepthInfoMapping = {};
179
+ canHandle(message) {
180
+ if (message.topic === undefined) {
181
+ return false;
182
+ }
183
+ if (message.topic.startsWith('orderbook@')) {
184
+ return 'generated' in message && message.generated === true;
185
+ }
186
+ return message.topic.startsWith('orderbookupdate@');
187
+ }
188
+ getFilters(symbols) {
189
+ symbols = upperCaseSymbols(symbols);
190
+ return [
191
+ {
192
+ channel: 'orderbook',
193
+ symbols
194
+ },
195
+ {
196
+ channel: 'orderbookupdate',
197
+ symbols
198
+ }
199
+ ];
200
+ }
201
+ *map(message, localTimestamp) {
202
+ if ('generated' in message) {
203
+ const symbol = message.data.s ?? message.topic.split('@')[1];
204
+ const timestamp = message.data.ts ?? message.ts;
205
+ if (this._symbolToDepthInfoMapping[symbol] === undefined) {
206
+ this._symbolToDepthInfoMapping[symbol] = {
207
+ bufferedUpdates: []
208
+ };
209
+ }
210
+ const symbolDepthInfo = this._symbolToDepthInfoMapping[symbol];
211
+ yield {
212
+ type: 'book_change',
213
+ symbol,
214
+ exchange: 'woo-x',
215
+ isSnapshot: true,
216
+ bids: message.data.bids.map(this._mapSnapshotLevel),
217
+ asks: message.data.asks.map(this._mapSnapshotLevel),
218
+ timestamp: new Date(timestamp),
219
+ localTimestamp
220
+ };
221
+ symbolDepthInfo.lastUpdateTimestamp = timestamp;
222
+ symbolDepthInfo.snapshotProcessed = true;
223
+ for (const update of symbolDepthInfo.bufferedUpdates) {
224
+ const bookChange = this._mapBookDepthUpdate(update, localTimestamp, symbolDepthInfo, symbol);
225
+ if (bookChange !== undefined) {
226
+ yield bookChange;
227
+ }
228
+ }
229
+ symbolDepthInfo.bufferedUpdates = [];
230
+ return;
231
+ }
232
+ const symbol = message.data.s;
233
+ if (this._symbolToDepthInfoMapping[symbol] === undefined) {
234
+ this._symbolToDepthInfoMapping[symbol] = {
235
+ bufferedUpdates: []
236
+ };
237
+ }
238
+ const symbolDepthInfo = this._symbolToDepthInfoMapping[symbol];
239
+ const snapshotAlreadyProcessed = symbolDepthInfo.snapshotProcessed;
240
+ if (snapshotAlreadyProcessed) {
241
+ const bookChange = this._mapBookDepthUpdate(message, localTimestamp, symbolDepthInfo, symbol);
242
+ if (bookChange !== undefined) {
243
+ yield bookChange;
244
+ }
245
+ }
246
+ else {
247
+ symbolDepthInfo.bufferedUpdates.push(message);
248
+ }
249
+ }
250
+ _mapBookDepthUpdate(wooxBookUpdate, localTimestamp, depthInfo, symbol) {
251
+ if (wooxBookUpdate.data.prevTs < depthInfo.lastUpdateTimestamp) {
252
+ return;
253
+ }
254
+ return {
255
+ type: 'book_change',
256
+ symbol,
257
+ exchange: 'woo-x',
258
+ isSnapshot: false,
259
+ bids: wooxBookUpdate.data.bids.map(this._mapUpdateLevel),
260
+ asks: wooxBookUpdate.data.asks.map(this._mapUpdateLevel),
261
+ timestamp: new Date(wooxBookUpdate.data.ts),
262
+ localTimestamp
263
+ };
264
+ }
265
+ _mapSnapshotLevel(level) {
266
+ if (Array.isArray(level)) {
267
+ return { price: Number(level[0]), amount: Number(level[1]) };
268
+ }
269
+ return { price: Number(level.price), amount: Number(level.quantity) };
270
+ }
271
+ _mapUpdateLevel(level) {
272
+ return { price: Number(level[0]), amount: Number(level[1]) };
273
+ }
274
+ }
135
275
  class WooxDerivativeTickerMapper {
136
276
  pendingTickerInfoHelper = new PendingTickerInfoHelper();
137
277
  _indexPrices = new Map();
@@ -207,6 +347,86 @@ class WooxDerivativeTickerMapper {
207
347
  }
208
348
  }
209
349
  }
350
+ class WooxV3DerivativeTickerMapper {
351
+ pendingTickerInfoHelper = new PendingTickerInfoHelper();
352
+ _indexPrices = new Map();
353
+ canHandle(message) {
354
+ if (message.topic === undefined) {
355
+ return false;
356
+ }
357
+ const symbol = (message.data && message.data.s) || '';
358
+ const isPerp = symbol.startsWith('PERP_');
359
+ return ((message.topic.startsWith('trade@') && isPerp) ||
360
+ (message.topic.startsWith('markprice@') && isPerp) ||
361
+ (message.topic.startsWith('estfundingrate@') && isPerp) ||
362
+ message.topic.startsWith('indexprice@') ||
363
+ (message.topic.startsWith('openinterest@') && isPerp));
364
+ }
365
+ getFilters(symbols) {
366
+ symbols = upperCaseSymbols(symbols);
367
+ const spotSymbols = symbols !== undefined ? symbols.map((s) => s.replace('PERP_', 'SPOT_')) : [];
368
+ return [
369
+ {
370
+ channel: 'trade',
371
+ symbols
372
+ },
373
+ {
374
+ channel: 'markprice',
375
+ symbols
376
+ },
377
+ {
378
+ channel: 'estfundingrate',
379
+ symbols
380
+ },
381
+ {
382
+ channel: 'openinterest',
383
+ symbols
384
+ },
385
+ {
386
+ channel: 'indexprice',
387
+ symbols: spotSymbols
388
+ }
389
+ ];
390
+ }
391
+ *map(message, localTimestamp) {
392
+ if (message.topic.startsWith('indexprice@')) {
393
+ const data = message.data;
394
+ this._indexPrices.set(data.s.replace('SPOT_', 'PERP_'), Number(data.px));
395
+ }
396
+ else {
397
+ const symbol = message.data.s;
398
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(symbol, 'woo-x');
399
+ const lastIndexPrice = this._indexPrices.get(symbol);
400
+ if (lastIndexPrice !== undefined) {
401
+ pendingTickerInfo.updateIndexPrice(lastIndexPrice);
402
+ }
403
+ if (message.topic.startsWith('markprice@')) {
404
+ const data = message.data;
405
+ pendingTickerInfo.updateMarkPrice(Number(data.px));
406
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts));
407
+ }
408
+ if (message.topic.startsWith('trade@')) {
409
+ const data = message.data;
410
+ pendingTickerInfo.updateLastPrice(Number(data.px));
411
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts));
412
+ }
413
+ if (message.topic.startsWith('estfundingrate@')) {
414
+ const data = message.data;
415
+ pendingTickerInfo.updateFundingRate(Number(data.r));
416
+ pendingTickerInfo.updateFundingTimestamp(new Date(Number(data.ft)));
417
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts));
418
+ }
419
+ if (message.topic.startsWith('openinterest@')) {
420
+ const data = message.data;
421
+ pendingTickerInfo.updateOpenInterest(Number(data.oi));
422
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts));
423
+ }
424
+ if (pendingTickerInfo.hasChanged()) {
425
+ yield pendingTickerInfo.getSnapshot(localTimestamp);
426
+ }
427
+ }
428
+ }
429
+ }
210
430
  class WooxBookTickerMapper {
211
431
  canHandle(message) {
212
432
  return message.topic !== undefined && message.topic.endsWith('@bbo');
@@ -236,4 +456,33 @@ class WooxBookTickerMapper {
236
456
  yield ticker;
237
457
  }
238
458
  }
459
+ class WooxV3BookTickerMapper {
460
+ canHandle(message) {
461
+ return message.topic !== undefined && message.topic.startsWith('bbo@');
462
+ }
463
+ getFilters(symbols) {
464
+ symbols = upperCaseSymbols(symbols);
465
+ return [
466
+ {
467
+ channel: 'bbo',
468
+ symbols
469
+ }
470
+ ];
471
+ }
472
+ *map(wooxBBOMessage, localTimestamp) {
473
+ const wooxBookTicker = wooxBBOMessage.data;
474
+ const ticker = {
475
+ type: 'book_ticker',
476
+ symbol: wooxBookTicker.s,
477
+ exchange: 'woo-x',
478
+ askAmount: asNumberOrUndefined(wooxBookTicker.aq),
479
+ askPrice: asNumberOrUndefined(wooxBookTicker.ap),
480
+ bidPrice: asNumberOrUndefined(wooxBookTicker.bp),
481
+ bidAmount: asNumberOrUndefined(wooxBookTicker.bq),
482
+ timestamp: new Date(wooxBookTicker.ts),
483
+ localTimestamp: localTimestamp
484
+ };
485
+ yield ticker;
486
+ }
487
+ }
239
488
  //# sourceMappingURL=woox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"woox.js","sourceRoot":"","sources":["../../src/mappers/woox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"woox.js","sourceRoot":"","sources":["../../src/mappers/woox.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Filter } from '../types.ts';
2
2
  import { RealTimeFeedBase } from './realtimefeed.ts';
3
3
  export declare class WooxRealTimeFeed extends RealTimeFeedBase {
4
4
  protected wssURL: string;
5
+ protected readonly httpURL = "https://api.woox.io";
5
6
  protected mapToSubscribeMessages(filters: Filter<string>[]): any[];
6
7
  protected provideManualSnapshots(filters: Filter<string>[], shouldCancel: () => boolean): Promise<void>;
7
8
  protected messageIsError(message: any): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"woox.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/woox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,SAAS,CAAC,MAAM,SAAyE;IAEzF,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;cAmBlD,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO;IA4B7F,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAI/C,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAInD,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG;CAO7B"}
1
+ {"version":3,"file":"woox.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/woox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIpD,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,SAAS,CAAC,MAAM,SAAgC;IAChD,SAAS,CAAC,QAAQ,CAAC,OAAO,yBAAwB;IAElD,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;cAwBlD,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO;IA8B7F,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAI/C,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAInD,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG;CAY7B"}
@@ -1,51 +1,56 @@
1
- import { wait } from "../handy.js";
1
+ import { getJSON } from "../handy.js";
2
2
  import { RealTimeFeedBase } from "./realtimefeed.js";
3
+ const ORDER_BOOK_DEPTH = 50;
3
4
  export class WooxRealTimeFeed extends RealTimeFeedBase {
4
- wssURL = 'wss://wss.woo.org/ws/stream/OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY';
5
+ wssURL = 'wss://wss.woox.io/v3/public';
6
+ httpURL = 'https://api.woox.io';
5
7
  mapToSubscribeMessages(filters) {
6
- return filters
8
+ const symbolToTopics = new Map();
9
+ filters
7
10
  .filter((filter) => filter.channel !== 'orderbook')
8
- .map((filter) => {
11
+ .forEach((filter) => {
9
12
  if (!filter.symbols || filter.symbols.length === 0) {
10
13
  throw new Error('WooxRealTimeFeed requires explicitly specified symbols when subscribing to live feed');
11
14
  }
12
- return filter.symbols.map((symbol) => {
13
- return {
14
- id: `${symbol}@${filter.channel}`,
15
- topic: `${symbol}@${filter.channel}`,
16
- event: 'subscribe'
17
- };
15
+ filter.symbols.forEach((symbol) => {
16
+ const topics = symbolToTopics.get(symbol) ?? [];
17
+ topics.push(buildTopic(symbol, filter.channel));
18
+ symbolToTopics.set(symbol, topics);
18
19
  });
19
- })
20
- .flatMap((f) => f);
20
+ });
21
+ return Array.from(symbolToTopics.entries()).map(([symbol, topics]) => ({
22
+ id: symbol,
23
+ cmd: 'subscribe',
24
+ params: topics
25
+ }));
21
26
  }
22
27
  async provideManualSnapshots(filters, shouldCancel) {
23
28
  const orderbookFilter = filters.find((f) => f.channel === 'orderbook');
24
- if (!orderbookFilter) {
29
+ if (!orderbookFilter?.symbols) {
25
30
  return;
26
31
  }
27
- await wait(200);
28
32
  for (let symbol of orderbookFilter.symbols) {
29
33
  if (shouldCancel()) {
30
34
  return;
31
35
  }
32
- this.send({
33
- id: `${symbol}@orderbook`,
34
- event: 'request',
35
- params: {
36
- type: 'orderbook',
37
- symbol
38
- }
36
+ const response = await getJSON(`${this.httpURL}/v3/public/orderbook?symbol=${symbol}&maxLevel=${ORDER_BOOK_DEPTH}`);
37
+ if (response.data.success === false) {
38
+ throw new Error(`Woox orderbook snapshot request failed: ${JSON.stringify(response.data)}`);
39
+ }
40
+ this.manualSnapshotsBuffer.push({
41
+ topic: buildTopic(symbol, 'orderbook'),
42
+ ts: response.data.timestamp,
43
+ generated: true,
44
+ data: response.data.data
39
45
  });
40
- await wait(1);
41
46
  }
42
- this.debug('sent orderbook requests for: %s', orderbookFilter.symbols);
47
+ this.debug('fetched orderbook snapshots for: %s', orderbookFilter.symbols);
43
48
  }
44
49
  messageIsError(message) {
45
- return message.success === false || message.errorMsg !== undefined;
50
+ return message.success === false || message.errorMsg !== undefined || message.cmd === 'ERROR';
46
51
  }
47
52
  messageIsHeartbeat(message) {
48
- return message.event === 'ping';
53
+ return message.event === 'ping' || message.cmd === 'PING';
49
54
  }
50
55
  onMessage(msg) {
51
56
  if (msg.event === 'ping') {
@@ -53,6 +58,17 @@ export class WooxRealTimeFeed extends RealTimeFeedBase {
53
58
  event: 'ping'
54
59
  });
55
60
  }
61
+ if (msg.cmd === 'PING') {
62
+ this.send({
63
+ cmd: 'PONG'
64
+ });
65
+ }
66
+ }
67
+ }
68
+ function buildTopic(symbol, channel) {
69
+ if (channel === 'orderbook' || channel === 'orderbookupdate') {
70
+ return `${channel}@${symbol}@${ORDER_BOOK_DEPTH}`;
56
71
  }
72
+ return `${channel}@${symbol}`;
57
73
  }
58
74
  //# sourceMappingURL=woox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"woox.js","sourceRoot":"","sources":["../../src/realtimefeeds/woox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IAC1C,MAAM,GAAG,sEAAsE,CAAA;IAE/E,sBAAsB,CAAC,OAAyB;QACxD,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,WAAW,CAAC;aAClD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;YACzG,CAAC;YAED,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACnC,OAAO;oBACL,EAAE,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;oBACjC,KAAK,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;oBACpC,KAAK,EAAE,WAAW;iBACnB,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC;aACD,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC;IAES,KAAK,CAAC,sBAAsB,CAAC,OAAyB,EAAE,YAA2B;QAC3F,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAA;QACtE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;QAEf,KAAK,IAAI,MAAM,IAAI,eAAe,CAAC,OAAQ,EAAE,CAAC;YAC5C,IAAI,YAAY,EAAE,EAAE,CAAC;gBACnB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,GAAG,MAAM,YAAY;gBACzB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE;oBACN,IAAI,EAAE,WAAW;oBACjB,MAAM;iBACP;aACF,CAAC,CAAA;YAEF,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;QACf,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,iCAAiC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IACxE,CAAC;IAES,cAAc,CAAC,OAAY;QACnC,OAAO,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAA;IACpE,CAAC;IAES,kBAAkB,CAAC,OAAY;QACvC,OAAO,OAAO,CAAC,KAAK,KAAK,MAAM,CAAA;IACjC,CAAC;IAES,SAAS,CAAC,GAAQ;QAC1B,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,MAAM;aACd,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"woox.js","sourceRoot":"","sources":["../../src/realtimefeeds/woox.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-dev",
3
- "version": "16.6.0",
3
+ "version": "16.6.1",
4
4
  "engines": {
5
5
  "node": ">=25"
6
6
  },
@@ -66,7 +66,10 @@ export async function findInstrumentSymbols(
66
66
 
67
67
  return {
68
68
  exchange,
69
- symbols: instruments.map((instrument) => (selector === 'datasetId' ? (instrument.datasetId ?? instrument.id) : instrument.id))
69
+ symbols:
70
+ selector === 'datasetId'
71
+ ? instruments.flatMap((instrument) => instrument.datasetId ?? [])
72
+ : instruments.map((instrument) => instrument.id)
70
73
  }
71
74
  })
72
75
  )
@@ -112,7 +115,7 @@ export type UnderlyingType = 'native' | 'equity' | 'commodity' | 'fixed_income'
112
115
  export interface InstrumentInfo {
113
116
  /** symbol id */
114
117
  id: string
115
- /** dataset symbol id, may differ from id */
118
+ /** dataset symbol id, present after the symbol appears in exported dataset metadata */
116
119
  datasetId?: string
117
120
  /** exchange id */
118
121
  exchange: string
@@ -1,14 +1,27 @@
1
- import { upperCaseSymbols } from '../handy.ts'
2
- import { BookChange, BookTicker, DerivativeTicker, Exchange, FilterForExchange, Liquidation, Trade } from '../types.ts'
1
+ import { asNumberOrUndefined, upperCaseSymbols } from '../handy.ts'
2
+ import { BookChange, BookTicker, DerivativeTicker, Trade } from '../types.ts'
3
3
  import { Mapper, PendingTickerInfoHelper } from './mapper.ts'
4
- import { exchangeMappers } from './registry.ts'
4
+ import { exchangeMappers, mapper } from './registry.ts'
5
5
 
6
+ const WOOX_V3_SWITCH_DATE = new Date('2026-06-29T22:02:00.000Z')
7
+
8
+ // WOO X kept Tardis channel names during the V3 rollout, but changed raw topic layout and payload fields.
9
+ // Keep old and V3 mappers separate so replay uses the schema that was actually recorded at the message time.
6
10
  export const wooxMappers = exchangeMappers({
7
11
  'woo-x': {
8
- trades: () => wooxTradesMapper,
9
- bookChanges: () => new WooxBookChangeMapper(),
10
- derivativeTickers: () => new WooxDerivativeTickerMapper(),
11
- bookTickers: () => new WooxBookTickerMapper()
12
+ trades: mapper([{ until: WOOX_V3_SWITCH_DATE, use: () => wooxTradesMapper }, { use: () => wooxV3TradesMapper }]),
13
+ bookChanges: mapper([
14
+ { until: WOOX_V3_SWITCH_DATE, use: () => new WooxBookChangeMapper() },
15
+ { use: () => new WooxV3BookChangeMapper() }
16
+ ]),
17
+ derivativeTickers: mapper([
18
+ { until: WOOX_V3_SWITCH_DATE, use: () => new WooxDerivativeTickerMapper() },
19
+ { use: () => new WooxV3DerivativeTickerMapper() }
20
+ ]),
21
+ bookTickers: mapper([
22
+ { until: WOOX_V3_SWITCH_DATE, use: () => new WooxBookTickerMapper() },
23
+ { use: () => new WooxV3BookTickerMapper() }
24
+ ])
12
25
  }
13
26
  })
14
27
 
@@ -49,6 +62,41 @@ const wooxTradesMapper: Mapper<'woo-x', Trade> = {
49
62
  }
50
63
  }
51
64
 
65
+ const wooxV3TradesMapper: Mapper<'woo-x', Trade> = {
66
+ canHandle(message: WooxV3TradeMessage) {
67
+ return message.topic !== undefined && message.topic.startsWith('trade@')
68
+ },
69
+
70
+ getFilters(symbols?: string[]) {
71
+ symbols = upperCaseSymbols(symbols)
72
+
73
+ return [
74
+ {
75
+ channel: 'trade',
76
+ symbols
77
+ }
78
+ ]
79
+ },
80
+
81
+ *map(message: WooxV3TradeMessage, localTimestamp: Date): IterableIterator<Trade> {
82
+ if (message.data.src === 0) {
83
+ return
84
+ }
85
+
86
+ yield {
87
+ type: 'trade',
88
+ symbol: message.data.s,
89
+ exchange: 'woo-x',
90
+ id: undefined,
91
+ price: Number(message.data.px),
92
+ amount: Number(message.data.sx),
93
+ side: message.data.sd === 'SELL' ? 'sell' : 'buy',
94
+ timestamp: new Date(message.data.ts),
95
+ localTimestamp
96
+ }
97
+ }
98
+ }
99
+
52
100
  class WooxBookChangeMapper implements Mapper<'woo-x', BookChange> {
53
101
  private readonly _symbolToDepthInfoMapping: { [key: string]: LocalDepthInfo } = {}
54
102
 
@@ -159,6 +207,129 @@ class WooxBookChangeMapper implements Mapper<'woo-x', BookChange> {
159
207
  }
160
208
  }
161
209
 
210
+ class WooxV3BookChangeMapper implements Mapper<'woo-x', BookChange> {
211
+ private readonly _symbolToDepthInfoMapping: { [key: string]: WooxV3LocalDepthInfo } = {}
212
+
213
+ canHandle(message: WooxV3OrderbookMessage | WooxV3OrderbookupdateMessage) {
214
+ if (message.topic === undefined) {
215
+ return false
216
+ }
217
+
218
+ if (message.topic.startsWith('orderbook@')) {
219
+ return 'generated' in message && message.generated === true
220
+ }
221
+
222
+ return message.topic.startsWith('orderbookupdate@')
223
+ }
224
+
225
+ getFilters(symbols?: string[]) {
226
+ symbols = upperCaseSymbols(symbols)
227
+
228
+ return [
229
+ {
230
+ channel: 'orderbook',
231
+ symbols
232
+ },
233
+ {
234
+ channel: 'orderbookupdate',
235
+ symbols
236
+ }
237
+ ]
238
+ }
239
+
240
+ *map(message: WooxV3OrderbookMessage | WooxV3OrderbookupdateMessage, localTimestamp: Date): IterableIterator<BookChange> {
241
+ if ('generated' in message) {
242
+ const symbol = message.data.s ?? message.topic.split('@')[1]
243
+ const timestamp = message.data.ts ?? message.ts
244
+
245
+ if (this._symbolToDepthInfoMapping[symbol] === undefined) {
246
+ this._symbolToDepthInfoMapping[symbol] = {
247
+ bufferedUpdates: []
248
+ }
249
+ }
250
+
251
+ const symbolDepthInfo = this._symbolToDepthInfoMapping[symbol]
252
+
253
+ yield {
254
+ type: 'book_change',
255
+ symbol,
256
+ exchange: 'woo-x',
257
+ isSnapshot: true,
258
+ bids: message.data.bids.map(this._mapSnapshotLevel),
259
+ asks: message.data.asks.map(this._mapSnapshotLevel),
260
+ timestamp: new Date(timestamp),
261
+ localTimestamp
262
+ }
263
+
264
+ symbolDepthInfo.lastUpdateTimestamp = timestamp
265
+ symbolDepthInfo.snapshotProcessed = true
266
+
267
+ for (const update of symbolDepthInfo.bufferedUpdates) {
268
+ const bookChange = this._mapBookDepthUpdate(update, localTimestamp, symbolDepthInfo, symbol)
269
+ if (bookChange !== undefined) {
270
+ yield bookChange
271
+ }
272
+ }
273
+ symbolDepthInfo.bufferedUpdates = []
274
+ return
275
+ }
276
+
277
+ const symbol = message.data.s
278
+
279
+ if (this._symbolToDepthInfoMapping[symbol] === undefined) {
280
+ this._symbolToDepthInfoMapping[symbol] = {
281
+ bufferedUpdates: []
282
+ }
283
+ }
284
+
285
+ const symbolDepthInfo = this._symbolToDepthInfoMapping[symbol]
286
+ const snapshotAlreadyProcessed = symbolDepthInfo.snapshotProcessed
287
+
288
+ if (snapshotAlreadyProcessed) {
289
+ const bookChange = this._mapBookDepthUpdate(message, localTimestamp, symbolDepthInfo, symbol)
290
+ if (bookChange !== undefined) {
291
+ yield bookChange
292
+ }
293
+ } else {
294
+ symbolDepthInfo.bufferedUpdates.push(message)
295
+ }
296
+ }
297
+
298
+ private _mapBookDepthUpdate(
299
+ wooxBookUpdate: WooxV3OrderbookupdateMessage,
300
+ localTimestamp: Date,
301
+ depthInfo: WooxV3LocalDepthInfo,
302
+ symbol: string
303
+ ): BookChange | undefined {
304
+ if (wooxBookUpdate.data.prevTs < depthInfo.lastUpdateTimestamp!) {
305
+ return
306
+ }
307
+
308
+ return {
309
+ type: 'book_change',
310
+ symbol,
311
+ exchange: 'woo-x',
312
+ isSnapshot: false,
313
+ bids: wooxBookUpdate.data.bids.map(this._mapUpdateLevel),
314
+ asks: wooxBookUpdate.data.asks.map(this._mapUpdateLevel),
315
+ timestamp: new Date(wooxBookUpdate.data.ts),
316
+ localTimestamp
317
+ }
318
+ }
319
+
320
+ private _mapSnapshotLevel(level: WooxV3OrderbookSnapshotLevel): { price: number; amount: number } {
321
+ if (Array.isArray(level)) {
322
+ return { price: Number(level[0]), amount: Number(level[1]) }
323
+ }
324
+
325
+ return { price: Number(level.price), amount: Number(level.quantity) }
326
+ }
327
+
328
+ private _mapUpdateLevel(level: WooxV3BookLevel) {
329
+ return { price: Number(level[0]), amount: Number(level[1]) }
330
+ }
331
+ }
332
+
162
333
  class WooxDerivativeTickerMapper implements Mapper<'woo-x', DerivativeTicker> {
163
334
  private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
164
335
  private readonly _indexPrices = new Map<string, number>()
@@ -246,6 +417,99 @@ class WooxDerivativeTickerMapper implements Mapper<'woo-x', DerivativeTicker> {
246
417
  }
247
418
  }
248
419
 
420
+ class WooxV3DerivativeTickerMapper implements Mapper<'woo-x', DerivativeTicker> {
421
+ private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
422
+ private readonly _indexPrices = new Map<string, number>()
423
+
424
+ canHandle(message: WooxV3TradeMessage | WooxV3EstFundingRate | WooxV3MarkPrice | WooxV3IndexPrice | WooxV3OpenInterest) {
425
+ if (message.topic === undefined) {
426
+ return false
427
+ }
428
+ const symbol = (message.data && message.data.s) || ''
429
+ const isPerp = symbol.startsWith('PERP_')
430
+
431
+ return (
432
+ (message.topic.startsWith('trade@') && isPerp) ||
433
+ (message.topic.startsWith('markprice@') && isPerp) ||
434
+ (message.topic.startsWith('estfundingrate@') && isPerp) ||
435
+ message.topic.startsWith('indexprice@') ||
436
+ (message.topic.startsWith('openinterest@') && isPerp)
437
+ )
438
+ }
439
+
440
+ getFilters(symbols?: string[]) {
441
+ symbols = upperCaseSymbols(symbols)
442
+ const spotSymbols = symbols !== undefined ? symbols.map((s) => s.replace('PERP_', 'SPOT_')) : []
443
+
444
+ return [
445
+ {
446
+ channel: 'trade',
447
+ symbols
448
+ },
449
+ {
450
+ channel: 'markprice',
451
+ symbols
452
+ },
453
+ {
454
+ channel: 'estfundingrate',
455
+ symbols
456
+ },
457
+ {
458
+ channel: 'openinterest',
459
+ symbols
460
+ },
461
+ {
462
+ channel: 'indexprice',
463
+ symbols: spotSymbols
464
+ }
465
+ ]
466
+ }
467
+
468
+ *map(message: WooxV3TradeMessage | WooxV3EstFundingRate | WooxV3MarkPrice | WooxV3IndexPrice | WooxV3OpenInterest, localTimestamp: Date) {
469
+ if (message.topic.startsWith('indexprice@')) {
470
+ const data = message.data as WooxV3IndexPrice['data']
471
+ this._indexPrices.set(data.s.replace('SPOT_', 'PERP_'), Number(data.px))
472
+ } else {
473
+ const symbol = message.data.s
474
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(symbol, 'woo-x')
475
+
476
+ const lastIndexPrice = this._indexPrices.get(symbol)
477
+ if (lastIndexPrice !== undefined) {
478
+ pendingTickerInfo.updateIndexPrice(lastIndexPrice)
479
+ }
480
+
481
+ if (message.topic.startsWith('markprice@')) {
482
+ const data = message.data as WooxV3MarkPrice['data']
483
+ pendingTickerInfo.updateMarkPrice(Number(data.px))
484
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts))
485
+ }
486
+
487
+ if (message.topic.startsWith('trade@')) {
488
+ const data = message.data as WooxV3TradeMessage['data']
489
+ pendingTickerInfo.updateLastPrice(Number(data.px))
490
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts))
491
+ }
492
+
493
+ if (message.topic.startsWith('estfundingrate@')) {
494
+ const data = message.data as WooxV3EstFundingRate['data']
495
+ pendingTickerInfo.updateFundingRate(Number(data.r))
496
+ pendingTickerInfo.updateFundingTimestamp(new Date(Number(data.ft)))
497
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts))
498
+ }
499
+
500
+ if (message.topic.startsWith('openinterest@')) {
501
+ const data = message.data as WooxV3OpenInterest['data']
502
+ pendingTickerInfo.updateOpenInterest(Number(data.oi))
503
+ pendingTickerInfo.updateTimestamp(new Date(message.data.ts))
504
+ }
505
+
506
+ if (pendingTickerInfo.hasChanged()) {
507
+ yield pendingTickerInfo.getSnapshot(localTimestamp)
508
+ }
509
+ }
510
+ }
511
+ }
512
+
249
513
  class WooxBookTickerMapper implements Mapper<'woo-x', BookTicker> {
250
514
  canHandle(message: WooxTradeMessage) {
251
515
  return message.topic !== undefined && message.topic.endsWith('@bbo')
@@ -282,6 +546,42 @@ class WooxBookTickerMapper implements Mapper<'woo-x', BookTicker> {
282
546
  }
283
547
  }
284
548
 
549
+ class WooxV3BookTickerMapper implements Mapper<'woo-x', BookTicker> {
550
+ canHandle(message: WooxV3BBOMessage) {
551
+ return message.topic !== undefined && message.topic.startsWith('bbo@')
552
+ }
553
+
554
+ getFilters(symbols?: string[]) {
555
+ symbols = upperCaseSymbols(symbols)
556
+
557
+ return [
558
+ {
559
+ channel: 'bbo',
560
+ symbols
561
+ }
562
+ ]
563
+ }
564
+
565
+ *map(wooxBBOMessage: WooxV3BBOMessage, localTimestamp: Date) {
566
+ const wooxBookTicker = wooxBBOMessage.data
567
+
568
+ const ticker: BookTicker = {
569
+ type: 'book_ticker',
570
+ symbol: wooxBookTicker.s,
571
+ exchange: 'woo-x',
572
+ askAmount: asNumberOrUndefined(wooxBookTicker.aq),
573
+ askPrice: asNumberOrUndefined(wooxBookTicker.ap),
574
+
575
+ bidPrice: asNumberOrUndefined(wooxBookTicker.bp),
576
+ bidAmount: asNumberOrUndefined(wooxBookTicker.bq),
577
+ timestamp: new Date(wooxBookTicker.ts),
578
+ localTimestamp: localTimestamp
579
+ }
580
+
581
+ yield ticker
582
+ }
583
+ }
584
+
285
585
  type LocalDepthInfo = {
286
586
  bufferedUpdates: WooxOrderbookupdateMessage[]
287
587
  snapshotProcessed?: boolean
@@ -294,6 +594,12 @@ type WooxTradeMessage = {
294
594
  data: { symbol: 'PERP_GALA_USDT'; price: 0.048756; size: 4109; side: 'SELL'; source: 0 }
295
595
  }
296
596
 
597
+ type WooxV3TradeMessage = {
598
+ topic: string
599
+ ts: number
600
+ data: { s: string; px: string; sx: string; sd: 'BUY' | 'SELL'; src: number; ts: number }
601
+ }
602
+
297
603
  type WooxOrderbookupdateMessage = {
298
604
  topic: 'PERP_BTC_USDT@orderbookupdate'
299
605
  ts: 1674432000020
@@ -318,19 +624,77 @@ type WooxOrderbookMessage = {
318
624
  }
319
625
  }
320
626
 
627
+ type WooxV3LocalDepthInfo = {
628
+ bufferedUpdates: WooxV3OrderbookupdateMessage[]
629
+ snapshotProcessed?: boolean
630
+ lastUpdateTimestamp?: number
631
+ }
632
+
633
+ type WooxV3BookLevel = [string, string]
634
+
635
+ type WooxV3OrderbookupdateMessage = {
636
+ topic: string
637
+ ts: number
638
+ data: {
639
+ s: string
640
+ prevTs: number
641
+ ts: number
642
+ asks: WooxV3BookLevel[]
643
+ bids: WooxV3BookLevel[]
644
+ }
645
+ }
646
+
647
+ type WooxV3OrderbookRestSnapshotLevel = {
648
+ price: string
649
+ quantity: string
650
+ }
651
+
652
+ type WooxV3OrderbookSnapshotLevel = WooxV3BookLevel | WooxV3OrderbookRestSnapshotLevel
653
+
654
+ type WooxV3OrderbookMessage = {
655
+ topic: string
656
+ ts: number
657
+ generated: true
658
+ data: {
659
+ s?: string
660
+ ts?: number
661
+ asks: WooxV3OrderbookSnapshotLevel[]
662
+ bids: WooxV3OrderbookSnapshotLevel[]
663
+ }
664
+ }
665
+
321
666
  type WooxBBOMessage = {
322
667
  topic: 'SPOT_ETH_USDT@bbo'
323
668
  ts: 1674431999996
324
669
  data: { symbol: 'SPOT_ETH_USDT'; ask: 1627.61; askSize: 38.3755; bid: 1627.26; bidSize: 20.424926 }
325
670
  }
326
671
 
672
+ type WooxV3BBOMessage = {
673
+ topic: string
674
+ ts: number
675
+ data: { s: string; ts: number; ap?: string; aq?: string; bp?: string; bq?: string }
676
+ }
677
+
327
678
  type WooxMarkPrice = { topic: 'PERP_BTC_USDT@markprice'; ts: 1674432000007; data: { symbol: 'PERP_BTC_USDT'; price: 22711.11 } }
328
679
 
680
+ type WooxV3MarkPrice = { topic: string; ts: number; data: { s: string; ts: number; px: string } }
681
+
329
682
  type WooxEstFundingRate = {
330
683
  topic: 'PERP_BTC_USDT@estfundingrate'
331
684
  ts: 1674432059002
332
685
  data: { symbol: 'PERP_BTC_USDT'; fundingRate: 0.00000782; fundingTs: 1674435600005 }
333
686
  }
334
687
 
688
+ type WooxV3EstFundingRate = {
689
+ topic: string
690
+ ts: number
691
+ data: { s: string; ts: number; r: string; ft: number | string }
692
+ }
693
+
335
694
  type WooxIndexPrice = { topic: 'SPOT_BTC_USDT@indexprice'; ts: 1674432000024; data: { symbol: 'SPOT_BTC_USDT'; price: 22708.44 } }
695
+
696
+ type WooxV3IndexPrice = { topic: string; ts: number; data: { s: string; ts: number; px: string } }
697
+
336
698
  type WooxOpenInterest = { topic: 'PERP_BTC_USDT@openinterest'; ts: 1674432013624; data: { symbol: 'PERP_BTC_USDT'; openInterest: 83.2241 } }
699
+
700
+ type WooxV3OpenInterest = { topic: string; ts: number; data: { s: string; ts: number; oi: string } }
@@ -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
  }