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.
@@ -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 getSymbols(symbols) {
140
- const perpV2Symbols = symbols.filter((s) => getInstrumentType(s) === 'perpetual' && s.endsWith('USDT')).map(getApiSymbolId);
141
- const otherSymbols = symbols.filter((s) => getInstrumentType(s) !== 'perpetual' || s.endsWith('USDT') == false).map(getApiSymbolId);
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
- perpV2Symbols,
144
- otherSymbols
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 { perpV2Symbols, otherSymbols } = getSymbols(symbols);
214
+ const { v2Symbols, legacySymbols } = splitSymbolsByChannelFamily(symbols);
163
215
  const filters = [];
164
- if (perpV2Symbols.length > 0) {
216
+ if (v2Symbols.length > 0) {
165
217
  filters.push({
166
218
  channel: 'trades_p',
167
- symbols: perpV2Symbols
219
+ symbols: v2Symbols
168
220
  });
169
221
  }
170
- if (otherSymbols.length > 0) {
222
+ if (legacySymbols.length > 0) {
171
223
  filters.push({
172
224
  channel: 'trades',
173
- symbols: otherSymbols
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 { perpV2Symbols, otherSymbols } = getSymbols(symbols);
294
+ const { v2Symbols, legacySymbols } = splitSymbolsByChannelFamily(symbols);
243
295
  const filters = [];
244
- if (perpV2Symbols.length > 0) {
296
+ if (v2Symbols.length > 0) {
245
297
  filters.push({
246
298
  channel: 'orderbook_p',
247
- symbols: perpV2Symbols
299
+ symbols: v2Symbols
248
300
  });
249
301
  }
250
- if (otherSymbols.length > 0) {
302
+ if (legacySymbols.length > 0) {
251
303
  filters.push({
252
304
  channel: 'book',
253
- symbols: otherSymbols
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 { perpV2Symbols, otherSymbols } = getSymbols(symbols);
358
+ const { v2Symbols, legacySymbols } = splitSymbolsByChannelFamily(symbols);
307
359
  const filters = [];
308
- if (perpV2Symbols.length > 0) {
360
+ if (v2Symbols.length > 0) {
309
361
  filters.push({
310
362
  channel: 'perp_market24h_pack_p',
311
- symbols: perpV2Symbols
363
+ symbols: v2Symbols
312
364
  });
313
365
  }
314
- if (otherSymbols.length > 0) {
366
+ if (legacySymbols.length > 0) {
315
367
  filters.push({
316
368
  channel: 'market24h',
317
- symbols: otherSymbols
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,SAAuC;IAEvD,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
+ {"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://api.gemini.com/v2/marketdata';
3
+ wssURL = 'wss://ws.gemini.com?snapshot=-1';
4
+ channels = new Set(['trade', 'depth', 'bookTicker']);
4
5
  mapToSubscribeMessages(filters) {
5
- const symbols = filters
6
- .map((filter) => {
7
- if (!filter.symbols || filter.symbols.length === 0) {
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
- return filter.symbols;
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
- type: 'subscribe',
19
- subscriptions: [
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,oCAAoC,CAAA;IAE7C,sBAAsB,CAAC,OAAyB;QACxD,MAAM,OAAO,GAAG,OAAO;aACpB,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,wFAAwF,CAAC,CAAA;YAC3G,CAAC;YAED,OAAO,MAAM,CAAC,OAAO,CAAA;QACvB,CAAC,CAAC;aACD,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aACjB,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,IAAI,EAAE,WAAW;gBACjB,aAAa,EAAE;oBACb;wBACE,IAAI,EAAE,IAAI;wBACV,OAAO;qBACR;iBACF;aACF;SACF,CAAA;IACH,CAAC;IAES,cAAc,CAAC,OAAY;QACnC,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,CAAA;IACnC,CAAC;CACF"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
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 { BinarySplitStream } from "./binarysplit.js";
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, normalizeMessages, parseAsUTCDate, wait } from "./handy.js";
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 response for requested date is not ready yet wait 100ms and try again
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 wait(100);
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 BinarySplitStream())
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 bufferLine of linesStream) {
96
- linesCount++;
97
- if (bufferLine.length > 0) {
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 createMappers = (localTimestamp) => normalizers.map((m) => m(exchange, localTimestamp));
192
- const mappers = createMappers(fromDate);
193
- const filters = getFilters(mappers, symbols);
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 messages = replay({
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 normalizeMessages(exchange, undefined, messages, mappers, createMappers, withDisconnectMessages, filter);
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 ? mappers : createMappers(segmentFrom);
232
+ const segmentMappers = i === 0 ? initialMappers : createMappersAt(segmentFrom);
217
233
  const segmentFilters = getFilters(segmentMappers, symbols);
218
234
  const segmentFilter = createNormalizedSymbolFilter(symbols, segmentFilters);
219
- const segmentMessages = replay({
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* normalizeMessages(exchange, undefined, segmentMessages, segmentMappers, createMappers, withDisconnectMessages, segmentFilter);
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
  }