tardis-dev 16.6.3 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/binarysplit.d.ts +1 -2
- package/dist/binarysplit.d.ts.map +1 -1
- package/dist/binarysplit.js +20 -20
- package/dist/binarysplit.js.map +1 -1
- package/dist/consts.d.ts +1 -1
- package/dist/consts.js +1 -1
- package/dist/consts.js.map +1 -1
- package/dist/handy.d.ts.map +1 -1
- package/dist/handy.js +6 -0
- package/dist/handy.js.map +1 -1
- package/dist/mappers/bullish.js +6 -2
- package/dist/mappers/bullish.js.map +1 -1
- package/dist/mappers/coinbase.js +13 -2
- package/dist/mappers/coinbase.js.map +1 -1
- package/dist/mappers/gemini.d.ts +2 -1
- package/dist/mappers/gemini.d.ts.map +1 -1
- package/dist/mappers/gemini.js +82 -5
- package/dist/mappers/gemini.js.map +1 -1
- package/dist/mappers/index.d.ts +1 -1
- package/dist/mappers/phemex.js +73 -21
- package/dist/mappers/phemex.js.map +1 -1
- package/dist/realtimefeeds/gemini.d.ts +1 -0
- package/dist/realtimefeeds/gemini.d.ts.map +1 -1
- package/dist/realtimefeeds/gemini.js +14 -14
- package/dist/realtimefeeds/gemini.js.map +1 -1
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +156 -70
- package/dist/replay.js.map +1 -1
- package/package.json +15 -18
- package/src/binarysplit.ts +21 -23
- package/src/consts.ts +1 -1
- package/src/handy.ts +7 -0
- package/src/mappers/bullish.ts +7 -2
- package/src/mappers/coinbase.ts +13 -2
- package/src/mappers/gemini.ts +132 -8
- package/src/mappers/phemex.ts +80 -21
- package/src/realtimefeeds/gemini.ts +15 -14
- package/src/replay.ts +216 -77
package/dist/mappers/phemex.js
CHANGED
|
@@ -30,6 +30,9 @@ function isExcludedFromNormalizedOutput(symbol) {
|
|
|
30
30
|
// Matches tardis-api metadata: Phemex spot OL/USDT uses sOLUSDT, which collides with SOLUSDT when normalized.
|
|
31
31
|
return symbol === 'sOLUSDT';
|
|
32
32
|
}
|
|
33
|
+
// Uppercase normalized spot symbols can be indistinguishable from native Phemex perpetual symbols.
|
|
34
|
+
// Keep this list aligned with tardis-api and tardis-exporter so aliases such as SBTCUSDT can be
|
|
35
|
+
// converted back to sBTCUSDT without changing native perpetual symbols such as SPKUSDT.
|
|
33
36
|
const COINS_STARTING_WITH_S = [
|
|
34
37
|
'SOLUSD',
|
|
35
38
|
'SUSHIUSD',
|
|
@@ -111,12 +114,42 @@ const COINS_STARTING_WITH_S = [
|
|
|
111
114
|
'STXXUSDT',
|
|
112
115
|
'SPYXUSDT',
|
|
113
116
|
'SP500USDT',
|
|
114
|
-
'SNDKUSDT'
|
|
117
|
+
'SNDKUSDT',
|
|
118
|
+
'SKHYUSDT',
|
|
119
|
+
'SMCIUSDT',
|
|
120
|
+
'SONYUSDT',
|
|
121
|
+
'SQQQUSDT',
|
|
122
|
+
'STRCUSDT'
|
|
115
123
|
];
|
|
124
|
+
// Phemex used the V2 `_p` channels for this short-lived, now delisted PerpetualPilot market family.
|
|
125
|
+
// Exact casing matters: SIRENPUSD was a pilot, while sIRENPUSD was a separate spot instrument.
|
|
126
|
+
const PERPETUAL_PILOT_SYMBOLS = new Set([
|
|
127
|
+
'ANGLERFISHPUSD',
|
|
128
|
+
'BNBCARDPUSD',
|
|
129
|
+
'BNBXBTPUSD',
|
|
130
|
+
'BUTTCOINPUSD',
|
|
131
|
+
'CRYPTOAIPUSD',
|
|
132
|
+
'CTDPUSD',
|
|
133
|
+
'DOGEAIPUSD',
|
|
134
|
+
'FULLSENDPUSD',
|
|
135
|
+
'GHIBLIPUSD',
|
|
136
|
+
'GREED3PUSD',
|
|
137
|
+
'IMGPUSD',
|
|
138
|
+
'MCPOSPUSD',
|
|
139
|
+
'PAINPUSD',
|
|
140
|
+
'PERRYPUSD',
|
|
141
|
+
'SIRENPUSD',
|
|
142
|
+
'TITCOINPUSD',
|
|
143
|
+
'TOLYPUSD',
|
|
144
|
+
'WILDNOUTPUSD'
|
|
145
|
+
]);
|
|
116
146
|
function getInstrumentType(symbol) {
|
|
117
147
|
if (/\d+$/.test(symbol)) {
|
|
118
148
|
return 'future';
|
|
119
149
|
}
|
|
150
|
+
if (symbol.startsWith('s')) {
|
|
151
|
+
return 'spot';
|
|
152
|
+
}
|
|
120
153
|
if (COINS_STARTING_WITH_S.some((coin) => (coin === 'SUSDT' ? symbol === coin : symbol.startsWith(coin))) ||
|
|
121
154
|
symbol.startsWith('S') === false) {
|
|
122
155
|
return 'perpetual';
|
|
@@ -124,6 +157,14 @@ function getInstrumentType(symbol) {
|
|
|
124
157
|
return 'spot';
|
|
125
158
|
}
|
|
126
159
|
function getApiSymbolId(symbolId) {
|
|
160
|
+
// These are already exchange-native mixed-case identifiers.
|
|
161
|
+
if (symbolId.startsWith('s') || symbolId.startsWith('u100') || symbolId.startsWith('c')) {
|
|
162
|
+
return symbolId;
|
|
163
|
+
}
|
|
164
|
+
// SIRENPUSD must not be mistaken for the uppercase alias of spot sIRENPUSD.
|
|
165
|
+
if (PERPETUAL_PILOT_SYMBOLS.has(symbolId)) {
|
|
166
|
+
return symbolId;
|
|
167
|
+
}
|
|
127
168
|
const type = getInstrumentType(symbolId);
|
|
128
169
|
if (type === 'spot' && symbolId.startsWith('S')) {
|
|
129
170
|
return symbolId.charAt(0).toLowerCase() + symbolId.slice(1);
|
|
@@ -136,12 +177,23 @@ function getApiSymbolId(symbolId) {
|
|
|
136
177
|
}
|
|
137
178
|
return symbolId;
|
|
138
179
|
}
|
|
139
|
-
function
|
|
140
|
-
const
|
|
141
|
-
const
|
|
180
|
+
function splitSymbolsByChannelFamily(symbols) {
|
|
181
|
+
const v2Symbols = [];
|
|
182
|
+
const legacySymbols = [];
|
|
183
|
+
for (const symbol of symbols) {
|
|
184
|
+
const apiSymbolId = getApiSymbolId(symbol);
|
|
185
|
+
const usesV2Channels = PERPETUAL_PILOT_SYMBOLS.has(apiSymbolId) ||
|
|
186
|
+
(getInstrumentType(symbol) === 'perpetual' && (apiSymbolId.endsWith('USDT') || apiSymbolId.endsWith('USDC')));
|
|
187
|
+
if (usesV2Channels) {
|
|
188
|
+
v2Symbols.push(apiSymbolId);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
legacySymbols.push(apiSymbolId);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
142
194
|
return {
|
|
143
|
-
|
|
144
|
-
|
|
195
|
+
v2Symbols,
|
|
196
|
+
legacySymbols
|
|
145
197
|
};
|
|
146
198
|
}
|
|
147
199
|
const phemexTradesMapper = {
|
|
@@ -159,18 +211,18 @@ const phemexTradesMapper = {
|
|
|
159
211
|
}
|
|
160
212
|
];
|
|
161
213
|
}
|
|
162
|
-
const {
|
|
214
|
+
const { v2Symbols, legacySymbols } = splitSymbolsByChannelFamily(symbols);
|
|
163
215
|
const filters = [];
|
|
164
|
-
if (
|
|
216
|
+
if (v2Symbols.length > 0) {
|
|
165
217
|
filters.push({
|
|
166
218
|
channel: 'trades_p',
|
|
167
|
-
symbols:
|
|
219
|
+
symbols: v2Symbols
|
|
168
220
|
});
|
|
169
221
|
}
|
|
170
|
-
if (
|
|
222
|
+
if (legacySymbols.length > 0) {
|
|
171
223
|
filters.push({
|
|
172
224
|
channel: 'trades',
|
|
173
|
-
symbols:
|
|
225
|
+
symbols: legacySymbols
|
|
174
226
|
});
|
|
175
227
|
}
|
|
176
228
|
return filters;
|
|
@@ -239,18 +291,18 @@ const phemexBookChangeMapper = {
|
|
|
239
291
|
}
|
|
240
292
|
];
|
|
241
293
|
}
|
|
242
|
-
const {
|
|
294
|
+
const { v2Symbols, legacySymbols } = splitSymbolsByChannelFamily(symbols);
|
|
243
295
|
const filters = [];
|
|
244
|
-
if (
|
|
296
|
+
if (v2Symbols.length > 0) {
|
|
245
297
|
filters.push({
|
|
246
298
|
channel: 'orderbook_p',
|
|
247
|
-
symbols:
|
|
299
|
+
symbols: v2Symbols
|
|
248
300
|
});
|
|
249
301
|
}
|
|
250
|
-
if (
|
|
302
|
+
if (legacySymbols.length > 0) {
|
|
251
303
|
filters.push({
|
|
252
304
|
channel: 'book',
|
|
253
|
-
symbols:
|
|
305
|
+
symbols: legacySymbols
|
|
254
306
|
});
|
|
255
307
|
}
|
|
256
308
|
return filters;
|
|
@@ -303,18 +355,18 @@ class PhemexDerivativeTickerMapper {
|
|
|
303
355
|
}
|
|
304
356
|
];
|
|
305
357
|
}
|
|
306
|
-
const {
|
|
358
|
+
const { v2Symbols, legacySymbols } = splitSymbolsByChannelFamily(symbols);
|
|
307
359
|
const filters = [];
|
|
308
|
-
if (
|
|
360
|
+
if (v2Symbols.length > 0) {
|
|
309
361
|
filters.push({
|
|
310
362
|
channel: 'perp_market24h_pack_p',
|
|
311
|
-
symbols:
|
|
363
|
+
symbols: v2Symbols
|
|
312
364
|
});
|
|
313
365
|
}
|
|
314
|
-
if (
|
|
366
|
+
if (legacySymbols.length > 0) {
|
|
315
367
|
filters.push({
|
|
316
368
|
channel: 'market24h',
|
|
317
|
-
symbols:
|
|
369
|
+
symbols: legacySymbols
|
|
318
370
|
});
|
|
319
371
|
}
|
|
320
372
|
return filters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phemex.js","sourceRoot":"","sources":["../../src/mappers/phemex.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"phemex.js","sourceRoot":"","sources":["../../src/mappers/phemex.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 GeminiRealTimeFeed extends RealTimeFeedBase {
|
|
4
4
|
protected wssURL: string;
|
|
5
|
+
private readonly channels;
|
|
5
6
|
protected mapToSubscribeMessages(filters: Filter<string>[]): any[];
|
|
6
7
|
protected messageIsError(message: any): boolean;
|
|
7
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,SAAS,CAAC,MAAM,SAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IAErE,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;IA2BlE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;CAGhD"}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { RealTimeFeedBase } from "./realtimefeed.js";
|
|
2
2
|
export class GeminiRealTimeFeed extends RealTimeFeedBase {
|
|
3
|
-
wssURL = 'wss://
|
|
3
|
+
wssURL = 'wss://ws.gemini.com?snapshot=-1';
|
|
4
|
+
channels = new Set(['trade', 'depth', 'bookTicker']);
|
|
4
5
|
mapToSubscribeMessages(filters) {
|
|
5
|
-
const
|
|
6
|
-
.
|
|
7
|
-
if (!
|
|
6
|
+
const params = filters
|
|
7
|
+
.flatMap((filter) => {
|
|
8
|
+
if (!this.channels.has(filter.channel)) {
|
|
9
|
+
throw new Error(`GeminiRealTimeFeed unsupported channel ${filter.channel}`);
|
|
10
|
+
}
|
|
11
|
+
if (!Array.isArray(filter.symbols) || filter.symbols.length === 0) {
|
|
8
12
|
throw new Error('GeminiRealTimeFeed requires explicitly specified symbols when subscribing to live feed');
|
|
9
13
|
}
|
|
10
|
-
|
|
14
|
+
const channel = filter.channel === 'depth' ? 'depth@100ms' : filter.channel;
|
|
15
|
+
return filter.symbols.map((symbol) => `${symbol.toLowerCase()}@${channel}`);
|
|
11
16
|
})
|
|
12
|
-
.flatMap((s) => s)
|
|
13
17
|
.filter((value, index, self) => {
|
|
14
18
|
return self.indexOf(value) === index;
|
|
15
19
|
});
|
|
16
20
|
return [
|
|
17
21
|
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
name: 'l2',
|
|
22
|
-
symbols
|
|
23
|
-
}
|
|
24
|
-
]
|
|
22
|
+
method: 'SUBSCRIBE',
|
|
23
|
+
params,
|
|
24
|
+
id: 1
|
|
25
25
|
}
|
|
26
26
|
];
|
|
27
27
|
}
|
|
28
28
|
messageIsError(message) {
|
|
29
|
-
return message.result === 'error';
|
|
29
|
+
return message.result === 'error' || message.error !== undefined || message.status >= 400;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IAC5C,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IAC5C,MAAM,GAAG,iCAAiC,CAAA;IACnC,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;IAE3D,sBAAsB,CAAC,OAAyB;QACxD,MAAM,MAAM,GAAG,OAAO;aACnB,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;YAC7E,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAA;YAC3G,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAA;YAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC,CAAA;QAC7E,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAA;QACtC,CAAC,CAAC,CAAA;QAEJ,OAAO;YACL;gBACE,MAAM,EAAE,WAAW;gBACnB,MAAM;gBACN,EAAE,EAAE,CAAC;aACN;SACF,CAAA;IACH,CAAC;IAES,cAAc,CAAC,OAAY;QACnC,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,CAAA;IAC3F,CAAC;CACF"}
|
package/dist/replay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAUA,OAAO,
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
package/dist/replay.js
CHANGED
|
@@ -1,16 +1,61 @@
|
|
|
1
1
|
import { createReadStream } from 'node:fs';
|
|
2
2
|
import { rm } from 'node:fs/promises';
|
|
3
|
-
import { EventEmitter } from 'events';
|
|
3
|
+
import { EventEmitter, once } from 'events';
|
|
4
4
|
import { Worker } from 'worker_threads';
|
|
5
5
|
import { constants, createGunzip, createZstdDecompress } from 'zlib';
|
|
6
|
-
import {
|
|
6
|
+
import { BinarySplitBatchStream } from "./binarysplit.js";
|
|
7
7
|
import { clearCacheSync } from "./clearcache.js";
|
|
8
8
|
import { EXCHANGES, EXCHANGE_CHANNELS_INFO } from "./consts.js";
|
|
9
9
|
import { debug } from "./debug.js";
|
|
10
|
-
import { addDays, createNormalizedSymbolFilter, getFilters,
|
|
10
|
+
import { addDays, createNormalizedSymbolFilter, getFilters, parseAsUTCDate, wait } from "./handy.js";
|
|
11
11
|
import { normalizeBookChanges } from "./mappers/index.js";
|
|
12
12
|
import { getOptions } from "./options.js";
|
|
13
|
+
const DATE_MESSAGE_SPLIT_INDEX = 28;
|
|
14
|
+
const CHUNK_SIZE = 256 * 1024;
|
|
15
|
+
// Keep decompression lenient for partial gzip responses.
|
|
16
|
+
// See https://github.com/request/request/pull/2492 and https://github.com/node-fetch/node-fetch/pull/239.
|
|
17
|
+
const GZIP_OPTIONS = {
|
|
18
|
+
chunkSize: CHUNK_SIZE,
|
|
19
|
+
flush: constants.Z_SYNC_FLUSH,
|
|
20
|
+
finishFlush: constants.Z_SYNC_FLUSH
|
|
21
|
+
};
|
|
13
22
|
export async function* replay({ exchange, from, to, filters, skipDecoding = undefined, withDisconnects = undefined, apiKey = undefined, withMicroseconds = undefined, autoCleanup = undefined, waitWhenDataNotYetAvailable = undefined }) {
|
|
23
|
+
let lastMessageWasUndefined = false;
|
|
24
|
+
const lineBatches = replayLineBatches({ exchange, from, to, filters, apiKey, autoCleanup, waitWhenDataNotYetAvailable });
|
|
25
|
+
for await (const bufferLines of lineBatches) {
|
|
26
|
+
// Decode one line batch in a tight loop, then preserve the public one-message-at-a-time iterator.
|
|
27
|
+
const messages = [];
|
|
28
|
+
for (let i = 0; i < bufferLines.length; i++) {
|
|
29
|
+
const bufferLine = bufferLines[i];
|
|
30
|
+
if (bufferLine.length > 0) {
|
|
31
|
+
lastMessageWasUndefined = false;
|
|
32
|
+
if (skipDecoding === true) {
|
|
33
|
+
messages.push({
|
|
34
|
+
localTimestamp: bufferLine.slice(0, DATE_MESSAGE_SPLIT_INDEX),
|
|
35
|
+
message: bufferLine.slice(DATE_MESSAGE_SPLIT_INDEX + 1)
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const message = parseReplayMessage(exchange, bufferLine);
|
|
40
|
+
const localTimestamp = parseReplayTimestamp(bufferLine);
|
|
41
|
+
if (withMicroseconds) {
|
|
42
|
+
localTimestamp.μs = parseReplayMicroseconds(bufferLine);
|
|
43
|
+
}
|
|
44
|
+
messages.push({ localTimestamp, message });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (withDisconnects === true && lastMessageWasUndefined === false) {
|
|
48
|
+
lastMessageWasUndefined = true;
|
|
49
|
+
messages.push(undefined);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Drain a batch already received from the stream; its iterator surfaces later stream errors on the next read.
|
|
53
|
+
for (let i = 0; i < messages.length; i++) {
|
|
54
|
+
yield messages[i];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function* replayLineBatches({ exchange, from, to, filters, apiKey = undefined, autoCleanup = undefined, waitWhenDataNotYetAvailable = undefined }) {
|
|
14
59
|
validateReplayOptions(exchange, from, to, filters);
|
|
15
60
|
const fromDate = parseAsUTCDate(from);
|
|
16
61
|
const toDate = parseAsUTCDate(to);
|
|
@@ -43,19 +88,6 @@ export async function* replay({ exchange, from, to, filters, skipDecoding = unde
|
|
|
43
88
|
replayError = err;
|
|
44
89
|
});
|
|
45
90
|
try {
|
|
46
|
-
// date is always formatted to have length of 28 so we can skip looking for first space in line and use it
|
|
47
|
-
// as hardcoded value
|
|
48
|
-
const DATE_MESSAGE_SPLIT_INDEX = 28;
|
|
49
|
-
// more lenient gzip decompression
|
|
50
|
-
// see https://github.com/request/request/pull/2492 and https://github.com/node-fetch/node-fetch/pull/239
|
|
51
|
-
const CHUNK_SIZE = 256 * 1024;
|
|
52
|
-
const GZIP_OPTIONS = {
|
|
53
|
-
chunkSize: CHUNK_SIZE,
|
|
54
|
-
flush: constants.Z_SYNC_FLUSH,
|
|
55
|
-
finishFlush: constants.Z_SYNC_FLUSH
|
|
56
|
-
};
|
|
57
|
-
// helper flag that helps us not yielding two subsequent undefined/disconnect messages
|
|
58
|
-
let lastMessageWasUndefined = false;
|
|
59
91
|
let currentSliceDate = new Date(fromDate);
|
|
60
92
|
// iterate over every minute in <=from,to> date range
|
|
61
93
|
// get cached slice paths, read them as file streams, decompress, split by new lines and yield as messages
|
|
@@ -70,9 +102,9 @@ export async function* replay({ exchange, from, to, filters, skipDecoding = unde
|
|
|
70
102
|
throw replayError;
|
|
71
103
|
}
|
|
72
104
|
if (cachedSlice === undefined) {
|
|
73
|
-
// if
|
|
105
|
+
// if the requested slice is not ready yet, wait for the worker to report another cached slice
|
|
74
106
|
debug('waiting for slice: %s, exchange: %s', sliceKey, exchange);
|
|
75
|
-
await
|
|
107
|
+
await once(worker, 'message');
|
|
76
108
|
}
|
|
77
109
|
}
|
|
78
110
|
// response is a path to file on disk let' read it as stream
|
|
@@ -86,51 +118,15 @@ export async function* replay({ exchange, from, to, filters, skipDecoding = unde
|
|
|
86
118
|
linesStream.destroy(err);
|
|
87
119
|
})
|
|
88
120
|
// and split by new line
|
|
89
|
-
.pipe(new
|
|
121
|
+
.pipe(new BinarySplitBatchStream())
|
|
90
122
|
.on('error', function onBinarySplitStreamError(err) {
|
|
91
123
|
debug('binary split stream error %o', err);
|
|
92
124
|
linesStream.destroy(err);
|
|
93
125
|
});
|
|
94
126
|
let linesCount = 0;
|
|
95
|
-
for await (const
|
|
96
|
-
linesCount
|
|
97
|
-
|
|
98
|
-
lastMessageWasUndefined = false;
|
|
99
|
-
// as any due to https://github.com/Microsoft/TypeScript/issues/24929
|
|
100
|
-
if (skipDecoding === true) {
|
|
101
|
-
yield {
|
|
102
|
-
localTimestamp: bufferLine.slice(0, DATE_MESSAGE_SPLIT_INDEX),
|
|
103
|
-
message: bufferLine.slice(DATE_MESSAGE_SPLIT_INDEX + 1)
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
let messageString = bufferLine.toString('utf8', DATE_MESSAGE_SPLIT_INDEX + 1);
|
|
108
|
-
// hack to handle huobi long numeric id for trades
|
|
109
|
-
if (exchange.startsWith('huobi-') && messageString.includes('.trade.detail')) {
|
|
110
|
-
messageString = messageString.replace(/"id":([0-9]+),/g, '"id":"$1",');
|
|
111
|
-
}
|
|
112
|
-
// hack to handle upbit long numeric id for trades
|
|
113
|
-
if (exchange === 'upbit' && messageString.includes('sequential_id')) {
|
|
114
|
-
messageString = messageString.replace(/"sequential_id":([0-9]+),/g, '"sequential_id":"$1",');
|
|
115
|
-
}
|
|
116
|
-
const message = JSON.parse(messageString);
|
|
117
|
-
const localTimestamp = new Date(bufferLine.toString('utf8', 0, DATE_MESSAGE_SPLIT_INDEX));
|
|
118
|
-
if (withMicroseconds) {
|
|
119
|
-
localTimestamp.μs = parseReplayMicroseconds(bufferLine);
|
|
120
|
-
}
|
|
121
|
-
yield {
|
|
122
|
-
// when skipDecoding is not set, decode timestamp to Date and message to object
|
|
123
|
-
localTimestamp,
|
|
124
|
-
message
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
// ignore empty lines unless withDisconnects is set to true
|
|
128
|
-
// do not yield subsequent undefined messages
|
|
129
|
-
}
|
|
130
|
-
else if (withDisconnects === true && lastMessageWasUndefined === false) {
|
|
131
|
-
lastMessageWasUndefined = true;
|
|
132
|
-
yield undefined;
|
|
133
|
-
}
|
|
127
|
+
for await (const bufferLines of linesStream) {
|
|
128
|
+
linesCount += bufferLines.length;
|
|
129
|
+
yield bufferLines;
|
|
134
130
|
}
|
|
135
131
|
debug('processed slice: %s, exchange: %s, count: %d', sliceKey, exchange, linesCount);
|
|
136
132
|
// remove slice key from the map as it's already processed
|
|
@@ -159,6 +155,18 @@ export async function* replay({ exchange, from, to, filters, skipDecoding = unde
|
|
|
159
155
|
}
|
|
160
156
|
}
|
|
161
157
|
}
|
|
158
|
+
function parseReplayMessage(exchange, bufferLine) {
|
|
159
|
+
let messageString = bufferLine.toString('utf8', DATE_MESSAGE_SPLIT_INDEX + 1);
|
|
160
|
+
// hack to handle huobi long numeric id for trades
|
|
161
|
+
if (exchange.startsWith('huobi-') && messageString.includes('.trade.detail')) {
|
|
162
|
+
messageString = messageString.replace(/"id":([0-9]+),/g, '"id":"$1",');
|
|
163
|
+
}
|
|
164
|
+
// hack to handle upbit long numeric id for trades
|
|
165
|
+
if (exchange === 'upbit' && messageString.includes('sequential_id')) {
|
|
166
|
+
messageString = messageString.replace(/"sequential_id":([0-9]+),/g, '"sequential_id":"$1",');
|
|
167
|
+
}
|
|
168
|
+
return JSON.parse(messageString);
|
|
169
|
+
}
|
|
162
170
|
async function cleanupSlice(slicePath) {
|
|
163
171
|
try {
|
|
164
172
|
await rm(slicePath, { force: true });
|
|
@@ -170,6 +178,16 @@ async function cleanupSlice(slicePath) {
|
|
|
170
178
|
function parseReplayMicroseconds(bufferLine) {
|
|
171
179
|
return (bufferLine[23] - 48) * 100 + (bufferLine[24] - 48) * 10 + (bufferLine[25] - 48);
|
|
172
180
|
}
|
|
181
|
+
function parseReplayTimestamp(bufferLine) {
|
|
182
|
+
// Recorder writes yyyy-MM-ddTHH:mm:ss.fffffffZ.
|
|
183
|
+
return new Date(Date.UTC(parseReplayTwoDigits(bufferLine, 0) * 100 + parseReplayTwoDigits(bufferLine, 2), parseReplayTwoDigits(bufferLine, 5) - 1, parseReplayTwoDigits(bufferLine, 8), parseReplayTwoDigits(bufferLine, 11), parseReplayTwoDigits(bufferLine, 14), parseReplayTwoDigits(bufferLine, 17), parseReplayThreeDigits(bufferLine, 20)));
|
|
184
|
+
}
|
|
185
|
+
function parseReplayTwoDigits(bufferLine, start) {
|
|
186
|
+
return (bufferLine[start] - 48) * 10 + (bufferLine[start + 1] - 48);
|
|
187
|
+
}
|
|
188
|
+
function parseReplayThreeDigits(bufferLine, start) {
|
|
189
|
+
return (bufferLine[start] - 48) * 100 + (bufferLine[start + 1] - 48) * 10 + (bufferLine[start + 2] - 48);
|
|
190
|
+
}
|
|
173
191
|
// gracefully terminate worker
|
|
174
192
|
async function terminateWorker(worker, waitTimeout) {
|
|
175
193
|
let cancelWait = () => { };
|
|
@@ -188,46 +206,114 @@ export function replayNormalized({ exchange, symbols, from, to, withDisconnectMe
|
|
|
188
206
|
const fromDate = parseAsUTCDate(from);
|
|
189
207
|
const toDate = parseAsUTCDate(to);
|
|
190
208
|
validateReplayNormalizedOptions(fromDate, normalizers);
|
|
191
|
-
const
|
|
192
|
-
const
|
|
193
|
-
const filters = getFilters(
|
|
209
|
+
const createMappersAt = (localTimestamp) => normalizers.map((normalizer) => normalizer(exchange, localTimestamp));
|
|
210
|
+
const initialMappers = createMappersAt(fromDate);
|
|
211
|
+
const filters = getFilters(initialMappers, symbols);
|
|
194
212
|
// filter normalized messages by symbol as some exchanges do not provide server side filtering so we could end up with messages
|
|
195
213
|
// for symbols we've not requested for
|
|
196
214
|
const segments = getReplayNormalizedSegments(exchange, normalizers, fromDate, toDate);
|
|
197
215
|
if (segments.length <= 1) {
|
|
198
216
|
const filter = createNormalizedSymbolFilter(symbols, filters);
|
|
199
|
-
const
|
|
217
|
+
const lineBatches = replayLineBatches({
|
|
200
218
|
exchange,
|
|
201
219
|
from,
|
|
202
220
|
to,
|
|
203
|
-
withDisconnects: true,
|
|
204
221
|
filters,
|
|
205
222
|
apiKey,
|
|
206
|
-
withMicroseconds: true,
|
|
207
223
|
autoCleanup,
|
|
208
224
|
waitWhenDataNotYetAvailable
|
|
209
225
|
});
|
|
210
|
-
return
|
|
226
|
+
return normalizeReplayLineBatches(exchange, undefined, lineBatches, initialMappers, createMappersAt, withDisconnectMessages, filter);
|
|
211
227
|
}
|
|
212
228
|
return replayNormalizedSegments();
|
|
213
229
|
async function* replayNormalizedSegments() {
|
|
214
230
|
for (let i = 0; i < segments.length; i++) {
|
|
215
231
|
const { from: segmentFrom, to: segmentTo } = segments[i];
|
|
216
|
-
const segmentMappers = i === 0 ?
|
|
232
|
+
const segmentMappers = i === 0 ? initialMappers : createMappersAt(segmentFrom);
|
|
217
233
|
const segmentFilters = getFilters(segmentMappers, symbols);
|
|
218
234
|
const segmentFilter = createNormalizedSymbolFilter(symbols, segmentFilters);
|
|
219
|
-
const
|
|
235
|
+
const segmentLineBatches = replayLineBatches({
|
|
220
236
|
exchange,
|
|
221
237
|
from: segmentFrom.toISOString(),
|
|
222
238
|
to: segmentTo.toISOString(),
|
|
223
|
-
withDisconnects: true,
|
|
224
239
|
filters: segmentFilters,
|
|
225
240
|
apiKey,
|
|
226
|
-
withMicroseconds: true,
|
|
227
241
|
autoCleanup,
|
|
228
242
|
waitWhenDataNotYetAvailable
|
|
229
243
|
});
|
|
230
|
-
yield*
|
|
244
|
+
yield* normalizeReplayLineBatches(exchange, undefined, segmentLineBatches, segmentMappers, createMappersAt, withDisconnectMessages, segmentFilter);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async function* normalizeReplayLineBatches(exchange, symbols, lineBatches, initialMappers, createMappersAt, withDisconnectMessages, filter) {
|
|
249
|
+
// This intentionally keeps mapper calls lazy. Custom normalizers must not process later raw messages before the consumer asks for them.
|
|
250
|
+
let previousLocalTimestamp;
|
|
251
|
+
let activeMappers = initialMappers;
|
|
252
|
+
if (activeMappers.length === 0) {
|
|
253
|
+
throw new Error(`Can't normalize data without any normalizers provided`);
|
|
254
|
+
}
|
|
255
|
+
for await (const bufferLines of lineBatches) {
|
|
256
|
+
const decodedMessages = [];
|
|
257
|
+
let decodingFailed = false;
|
|
258
|
+
let decodingError;
|
|
259
|
+
try {
|
|
260
|
+
for (let i = 0; i < bufferLines.length; i++) {
|
|
261
|
+
const bufferLine = bufferLines[i];
|
|
262
|
+
if (bufferLine.length === 0) {
|
|
263
|
+
decodedMessages.push(undefined);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
const message = parseReplayMessage(exchange, bufferLine);
|
|
267
|
+
const localTimestamp = parseReplayTimestamp(bufferLine);
|
|
268
|
+
localTimestamp.μs = parseReplayMicroseconds(bufferLine);
|
|
269
|
+
decodedMessages.push({ localTimestamp, message });
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
decodingFailed = true;
|
|
275
|
+
decodingError = error;
|
|
276
|
+
}
|
|
277
|
+
for (let i = 0; i < decodedMessages.length; i++) {
|
|
278
|
+
const decodedMessage = decodedMessages[i];
|
|
279
|
+
if (decodedMessage === undefined) {
|
|
280
|
+
if (activeMappers === undefined) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
activeMappers = undefined;
|
|
284
|
+
if (withDisconnectMessages === true && previousLocalTimestamp !== undefined) {
|
|
285
|
+
const disconnect = {
|
|
286
|
+
type: 'disconnect',
|
|
287
|
+
exchange,
|
|
288
|
+
localTimestamp: previousLocalTimestamp,
|
|
289
|
+
symbols
|
|
290
|
+
};
|
|
291
|
+
yield disconnect;
|
|
292
|
+
}
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const { localTimestamp, message } = decodedMessage;
|
|
296
|
+
if (activeMappers === undefined) {
|
|
297
|
+
activeMappers = createMappersAt(localTimestamp);
|
|
298
|
+
}
|
|
299
|
+
previousLocalTimestamp = localTimestamp;
|
|
300
|
+
for (let mapperIndex = 0; mapperIndex < activeMappers.length; mapperIndex++) {
|
|
301
|
+
const mapper = activeMappers[mapperIndex];
|
|
302
|
+
if (mapper.canHandle(message)) {
|
|
303
|
+
const mappedMessages = mapper.map(message, localTimestamp);
|
|
304
|
+
if (!mappedMessages) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
for (const normalizedMessage of mappedMessages) {
|
|
308
|
+
if (filter === undefined || filter(normalizedMessage.symbol)) {
|
|
309
|
+
yield normalizedMessage;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (decodingFailed) {
|
|
316
|
+
throw decodingError;
|
|
231
317
|
}
|
|
232
318
|
}
|
|
233
319
|
}
|