tardis-dev 16.6.3 → 17.0.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/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/phemex.js +73 -21
- package/dist/mappers/phemex.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 +1 -1
- package/src/binarysplit.ts +21 -23
- package/src/handy.ts +7 -0
- package/src/mappers/bullish.ts +7 -2
- package/src/mappers/coinbase.ts +13 -2
- package/src/mappers/phemex.ts +80 -21
- package/src/replay.ts +216 -77
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
|
}
|
package/dist/replay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/binarysplit.ts
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
import { Transform } from 'stream'
|
|
2
2
|
import type { TransformCallback } from 'stream'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const NEW_LINE_BYTE = 10
|
|
5
|
+
|
|
6
|
+
// Inspired by https://github.com/maxogden/binary-split/blob/master/index.js.
|
|
7
|
+
// Batching lines lets replay cross the object-mode async iterator boundary once per decompressed chunk.
|
|
8
|
+
export class BinarySplitBatchStream extends Transform {
|
|
7
9
|
private _buffered?: Buffer
|
|
8
10
|
|
|
9
11
|
constructor() {
|
|
10
12
|
super({
|
|
11
|
-
readableObjectMode: true
|
|
13
|
+
readableObjectMode: true,
|
|
14
|
+
// A batch can hold a full decompression chunk, so keep read-ahead deliberately small.
|
|
15
|
+
readableHighWaterMark: 2
|
|
12
16
|
})
|
|
13
|
-
|
|
14
|
-
this._NEW_LINE_BYTE = 10
|
|
15
|
-
this._buffered = undefined
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
_transform(chunk: Buffer, _: string, callback: TransformCallback) {
|
|
19
|
-
|
|
20
|
+
const lines: Buffer[] = []
|
|
21
|
+
let lineStart = 0
|
|
20
22
|
|
|
21
23
|
if (this._buffered !== undefined) {
|
|
22
|
-
const firstNewLineIndex = chunk.indexOf(
|
|
24
|
+
const firstNewLineIndex = chunk.indexOf(NEW_LINE_BYTE)
|
|
23
25
|
|
|
24
26
|
if (firstNewLineIndex === -1) {
|
|
25
27
|
this._buffered = Buffer.concat([this._buffered, chunk])
|
|
@@ -27,26 +29,22 @@ export class BinarySplitStream extends Transform {
|
|
|
27
29
|
return
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
lines.push(Buffer.concat([this._buffered, chunk.subarray(0, firstNewLineIndex)]))
|
|
31
33
|
this._buffered = undefined
|
|
32
|
-
|
|
34
|
+
lineStart = firstNewLineIndex + 1
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
let
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (newLineIndex === -1) {
|
|
41
|
-
break
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
this.push(chunk.subarray(lineStart, newLineIndex))
|
|
45
|
-
offset = newLineIndex + 1
|
|
46
|
-
lineStart = offset
|
|
37
|
+
let newLineIndex = chunk.indexOf(NEW_LINE_BYTE, lineStart)
|
|
38
|
+
while (newLineIndex !== -1) {
|
|
39
|
+
lines.push(chunk.subarray(lineStart, newLineIndex))
|
|
40
|
+
lineStart = newLineIndex + 1
|
|
41
|
+
newLineIndex = chunk.indexOf(NEW_LINE_BYTE, lineStart)
|
|
47
42
|
}
|
|
48
43
|
|
|
49
44
|
this._buffered = lineStart < chunk.length ? chunk.subarray(lineStart) : undefined
|
|
45
|
+
if (lines.length > 0) {
|
|
46
|
+
this.push(lines)
|
|
47
|
+
}
|
|
50
48
|
callback()
|
|
51
49
|
}
|
|
52
50
|
}
|
package/src/handy.ts
CHANGED
|
@@ -208,6 +208,13 @@ export function parseμs(dateString: string): number {
|
|
|
208
208
|
// check if we have ISO 8601 format date string, e.g: 2019-06-01T00:03:03.1238784Z or 2020-07-22T00:09:16.836773Z
|
|
209
209
|
// or 2020-03-01T00:00:24.893456+00:00
|
|
210
210
|
if (dateString.length === 27 || dateString.length === 28 || dateString.length === 32 || dateString.length === 30) {
|
|
211
|
+
const hundreds = dateString.charCodeAt(23) - 48
|
|
212
|
+
const tens = dateString.charCodeAt(24) - 48
|
|
213
|
+
const ones = dateString.charCodeAt(25) - 48
|
|
214
|
+
if (hundreds >= 0 && hundreds <= 9 && tens >= 0 && tens <= 9 && ones >= 0 && ones <= 9) {
|
|
215
|
+
return hundreds * 100 + tens * 10 + ones
|
|
216
|
+
}
|
|
217
|
+
|
|
211
218
|
return Number(dateString.slice(23, 26))
|
|
212
219
|
}
|
|
213
220
|
|
package/src/mappers/bullish.ts
CHANGED
|
@@ -13,6 +13,11 @@ export const bullishMappers = exchangeMappers({
|
|
|
13
13
|
}
|
|
14
14
|
})
|
|
15
15
|
|
|
16
|
+
function getBullishOrderBookTimestamp(value: string, localTimestamp: Date) {
|
|
17
|
+
const timestamp = Number(value)
|
|
18
|
+
return value.length === 13 && Number.isSafeInteger(timestamp) ? new Date(timestamp) : localTimestamp
|
|
19
|
+
}
|
|
20
|
+
|
|
16
21
|
class BullishTradesMapper implements Mapper<'bullish', Trade> {
|
|
17
22
|
canHandle(message: BullishMessage): message is BullishAnonymousTradeUpdateMessage {
|
|
18
23
|
return message.dataType === 'V1TAAnonymousTradeUpdate' && message.type === 'update'
|
|
@@ -76,7 +81,7 @@ class BullishBookChangeMapper implements Mapper<'bullish', BookChange> {
|
|
|
76
81
|
isSnapshot: message.type === 'snapshot',
|
|
77
82
|
bids: this.mapLevels(message.data.bids),
|
|
78
83
|
asks: this.mapLevels(message.data.asks),
|
|
79
|
-
timestamp:
|
|
84
|
+
timestamp: getBullishOrderBookTimestamp(message.data.timestamp, localTimestamp),
|
|
80
85
|
localTimestamp
|
|
81
86
|
}
|
|
82
87
|
}
|
|
@@ -117,7 +122,7 @@ class BullishBookTickerMapper implements Mapper<'bullish', BookTicker> {
|
|
|
117
122
|
bidAmount: asNonZeroNumberOrUndefined(message.data.bid[1]),
|
|
118
123
|
askPrice: asNonZeroNumberOrUndefined(message.data.ask[0]),
|
|
119
124
|
askAmount: asNonZeroNumberOrUndefined(message.data.ask[1]),
|
|
120
|
-
timestamp:
|
|
125
|
+
timestamp: getBullishOrderBookTimestamp(message.data.timestamp, localTimestamp),
|
|
121
126
|
localTimestamp
|
|
122
127
|
}
|
|
123
128
|
}
|
package/src/mappers/coinbase.ts
CHANGED
|
@@ -133,13 +133,24 @@ class CoinbaseBookChangMapper implements Mapper<'coinbase', BookChange> {
|
|
|
133
133
|
this._symbolLastTimestampMap.set(message.product_id, timestamp)
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
const bids: BookPriceLevel[] = []
|
|
137
|
+
const asks: BookPriceLevel[] = []
|
|
138
|
+
for (let i = 0; i < message.changes.length; i++) {
|
|
139
|
+
const change = message.changes[i]
|
|
140
|
+
if (change[0] === 'buy') {
|
|
141
|
+
bids.push(mapUpdateBookLevel(change))
|
|
142
|
+
} else if (change[0] === 'sell') {
|
|
143
|
+
asks.push(mapUpdateBookLevel(change))
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
136
147
|
yield {
|
|
137
148
|
type: 'book_change',
|
|
138
149
|
symbol: message.product_id,
|
|
139
150
|
exchange: 'coinbase',
|
|
140
151
|
isSnapshot: false,
|
|
141
|
-
bids
|
|
142
|
-
asks
|
|
152
|
+
bids,
|
|
153
|
+
asks,
|
|
143
154
|
timestamp,
|
|
144
155
|
localTimestamp: localTimestamp
|
|
145
156
|
}
|