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/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
  }
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-dev",
3
- "version": "16.6.3",
3
+ "version": "17.0.0",
4
4
  "engines": {
5
5
  "node": ">=25"
6
6
  },
@@ -1,25 +1,27 @@
1
1
  import { Transform } from 'stream'
2
2
  import type { TransformCallback } from 'stream'
3
3
 
4
- // Inspired by https://github.com/maxogden/binary-split/blob/master/index.js
5
- export class BinarySplitStream extends Transform {
6
- private readonly _NEW_LINE_BYTE: number
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
- let chunkStart = 0
20
+ const lines: Buffer[] = []
21
+ let lineStart = 0
20
22
 
21
23
  if (this._buffered !== undefined) {
22
- const firstNewLineIndex = chunk.indexOf(this._NEW_LINE_BYTE)
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
- this.push(Buffer.concat([this._buffered, chunk.subarray(0, firstNewLineIndex)]))
32
+ lines.push(Buffer.concat([this._buffered, chunk.subarray(0, firstNewLineIndex)]))
31
33
  this._buffered = undefined
32
- chunkStart = firstNewLineIndex + 1
34
+ lineStart = firstNewLineIndex + 1
33
35
  }
34
36
 
35
- let offset = chunkStart
36
- let lineStart = chunkStart
37
-
38
- while (true) {
39
- const newLineIndex = chunk.indexOf(this._NEW_LINE_BYTE, offset)
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
 
@@ -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: new Date(message.data.datetime),
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: new Date(message.data.datetime),
125
+ timestamp: getBullishOrderBookTimestamp(message.data.timestamp, localTimestamp),
121
126
  localTimestamp
122
127
  }
123
128
  }
@@ -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: message.changes.filter((c) => c[0] === 'buy').map(mapUpdateBookLevel),
142
- asks: message.changes.filter((c) => c[0] === 'sell').map(mapUpdateBookLevel),
152
+ bids,
153
+ asks,
143
154
  timestamp,
144
155
  localTimestamp: localTimestamp
145
156
  }