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 +4 -4
- package/dist/instrumentinfo.d.ts +1 -1
- package/dist/instrumentinfo.d.ts.map +1 -1
- package/dist/instrumentinfo.js +3 -1
- package/dist/instrumentinfo.js.map +1 -1
- package/dist/mappers/index.d.ts +3 -3
- package/dist/mappers/woox.d.ts +3 -3
- package/dist/mappers/woox.d.ts.map +1 -1
- package/dist/mappers/woox.js +255 -6
- package/dist/mappers/woox.js.map +1 -1
- package/dist/realtimefeeds/woox.d.ts +1 -0
- package/dist/realtimefeeds/woox.d.ts.map +1 -1
- package/dist/realtimefeeds/woox.js +41 -25
- package/dist/realtimefeeds/woox.js.map +1 -1
- package/package.json +1 -1
- package/src/instrumentinfo.ts +5 -2
- package/src/mappers/woox.ts +371 -7
- package/src/realtimefeeds/woox.ts +63 -26
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
|
|
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
|
|
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
|
|
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
|
|
208
|
+
// or for real-time data
|
|
209
209
|
// await produceVolumeBasedTradeBars(realTimeMessages)
|
|
210
210
|
```
|
|
211
211
|
|
package/dist/instrumentinfo.d.ts
CHANGED
|
@@ -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,
|
|
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":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;AACtF,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;AACjI,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AA8CpG,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,GAAE,wBAA+B,GACxC,OAAO,CAAC,iBAAiB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"instrumentinfo.d.ts","sourceRoot":"","sources":["../src/instrumentinfo.ts"],"names":[],"mappings":"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"}
|
package/dist/instrumentinfo.js
CHANGED
|
@@ -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:
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAMpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAA+B,EAAE,cAA8C;IACrH,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,QAAQ,CAAA;QAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,4BAA4B,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;QAExG,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,4BAA4B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,QAAkB,EAAE,cAA8C;IAC5G,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAE5B,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,gBAAgB,QAAQ,EAAE,CAAA;IACvD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,GAAG,IAAI,IAAI,kBAAkB,CAAC,cAAc,CAAC,EAAE,CAAA;IACjD,CAAC;SAAM,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC9C,GAAG,IAAI,WAAW,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,CAAA;IACxE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAClC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,EAAE;SACvD,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,uCAAuC;QACvC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;YACnC,IAAI,GAAsC,CAAA;YAC1C,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,CAAA;YACT,CAAC;YAED,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAqB,EACrB,MAA4B,EAC5B,WAAqC,IAAI;IAEzC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IAED,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,MAAM,WAAW,GAAG,CAAC,MAAM,4BAA4B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAqB,CAAA;QAE9F,OAAO;YACL,QAAQ;YACR,OAAO,
|
|
1
|
+
{"version":3,"file":"instrumentinfo.js","sourceRoot":"","sources":["../src/instrumentinfo.ts"],"names":[],"mappings":"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"}
|
package/dist/mappers/index.d.ts
CHANGED
|
@@ -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<
|
|
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<
|
|
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<
|
|
786
|
+
'woo-x': import("./registry.ts").MapperCreator<any, BookTicker>;
|
|
787
787
|
}, BookTicker>;
|
|
788
788
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mappers/woox.d.ts
CHANGED
|
@@ -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<
|
|
6
|
-
derivativeTickers: import("./registry.ts").MapperCreator<
|
|
7
|
-
bookTickers: import("./registry.ts").MapperCreator<
|
|
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,
|
|
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"}
|
package/dist/mappers/woox.js
CHANGED
|
@@ -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: (
|
|
8
|
-
|
|
9
|
-
|
|
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
|
package/dist/mappers/woox.js.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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.
|
|
5
|
+
wssURL = 'wss://wss.woox.io/v3/public';
|
|
6
|
+
httpURL = 'https://api.woox.io';
|
|
5
7
|
mapToSubscribeMessages(filters) {
|
|
6
|
-
|
|
8
|
+
const symbolToTopics = new Map();
|
|
9
|
+
filters
|
|
7
10
|
.filter((filter) => filter.channel !== 'orderbook')
|
|
8
|
-
.
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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('
|
|
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,
|
|
1
|
+
{"version":3,"file":"woox.js","sourceRoot":"","sources":["../../src/realtimefeeds/woox.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/instrumentinfo.ts
CHANGED
|
@@ -66,7 +66,10 @@ export async function findInstrumentSymbols(
|
|
|
66
66
|
|
|
67
67
|
return {
|
|
68
68
|
exchange,
|
|
69
|
-
symbols:
|
|
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,
|
|
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
|
package/src/mappers/woox.ts
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
|
-
import { upperCaseSymbols } from '../handy.ts'
|
|
2
|
-
import { BookChange, BookTicker, DerivativeTicker,
|
|
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: (
|
|
10
|
-
|
|
11
|
-
|
|
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 {
|
|
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.
|
|
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
|
-
|
|
12
|
+
const symbolToTopics = new Map<string, string[]>()
|
|
13
|
+
|
|
14
|
+
filters
|
|
10
15
|
.filter((filter) => filter.channel !== 'orderbook')
|
|
11
|
-
.
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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('
|
|
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
|
}
|