tardis-machine 14.3.1 → 15.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/README.md +5 -5
- package/benchmark.js +3 -0
- package/bin/tardis-machine.js +10 -8
- package/dist/debug.js +2 -8
- package/dist/debug.js.map +1 -1
- package/dist/helpers.js +15 -22
- package/dist/helpers.js.map +1 -1
- package/dist/http/healthCheck.d.ts +1 -1
- package/dist/http/healthCheck.d.ts.map +1 -1
- package/dist/http/healthCheck.js +1 -5
- package/dist/http/healthCheck.js.map +1 -1
- package/dist/http/index.d.ts +3 -3
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +3 -19
- package/dist/http/index.js.map +1 -1
- package/dist/http/replay.d.ts +1 -1
- package/dist/http/replay.d.ts.map +1 -1
- package/dist/http/replay.js +11 -19
- package/dist/http/replay.js.map +1 -1
- package/dist/http/replaynormalized.d.ts +1 -1
- package/dist/http/replaynormalized.d.ts.map +1 -1
- package/dist/http/replaynormalized.js +16 -24
- package/dist/http/replaynormalized.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/tardismachine.d.ts.map +1 -1
- package/dist/tardismachine.js +25 -30
- package/dist/tardismachine.js.map +1 -1
- package/dist/ws/index.d.ts +3 -3
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js +3 -19
- package/dist/ws/index.js.map +1 -1
- package/dist/ws/replay.d.ts +1 -1
- package/dist/ws/replay.d.ts.map +1 -1
- package/dist/ws/replay.js +26 -32
- package/dist/ws/replay.js.map +1 -1
- package/dist/ws/replaynormalized.d.ts +1 -1
- package/dist/ws/replaynormalized.d.ts.map +1 -1
- package/dist/ws/replaynormalized.js +16 -22
- package/dist/ws/replaynormalized.js.map +1 -1
- package/dist/ws/streamnormalized.d.ts +1 -1
- package/dist/ws/streamnormalized.d.ts.map +1 -1
- package/dist/ws/streamnormalized.js +19 -25
- package/dist/ws/streamnormalized.js.map +1 -1
- package/dist/ws/subscriptionsmappers.js +1 -4
- package/dist/ws/subscriptionsmappers.js.map +1 -1
- package/package.json +26 -5
- package/src/http/healthCheck.ts +1 -1
- package/src/http/index.ts +3 -3
- package/src/http/replay.ts +6 -7
- package/src/http/replaynormalized.ts +7 -8
- package/src/index.ts +1 -1
- package/src/tardismachine.ts +9 -7
- package/src/ws/index.ts +3 -3
- package/src/ws/replay.ts +6 -6
- package/src/ws/replaynormalized.ts +5 -5
- package/src/ws/streamnormalized.ts +5 -5
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.org/package/tardis-machine)
|
|
4
4
|
|
|
5
|
-
[Tardis Machine](https://docs.tardis.dev/
|
|
5
|
+
[Tardis Machine](https://docs.tardis.dev/tardis-machine/quickstart) is a locally runnable server with built-in data caching that uses the [Tardis.dev HTTP API](https://docs.tardis.dev/api/http-api-reference) under the hood. It provides both **tick-level historical** and **consolidated real-time cryptocurrency market data** via HTTP and WebSocket APIs. Available via [npm and Docker](https://docs.tardis.dev/tardis-machine/quickstart#installation).
|
|
6
6
|
|
|
7
7
|
<br/>
|
|
8
8
|
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
- efficient data replay API endpoints returning historical market data for entire time periods
|
|
12
12
|
|
|
13
|
-
- [exchange-native market data APIs](https://docs.tardis.dev/
|
|
13
|
+
- [exchange-native market data APIs](https://docs.tardis.dev/tardis-machine/replaying-historical-data#exchange-native-market-data-apis) — tick-by-tick historical replay in exchange-native format via HTTP and WebSocket endpoints. The WebSocket API replays data with the same format and subscribe logic as real-time exchange APIs — existing exchange WebSocket clients can connect to this endpoint.
|
|
14
14
|
|
|
15
|
-
- [normalized market data APIs](https://docs.tardis.dev/
|
|
15
|
+
- [normalized market data APIs](https://docs.tardis.dev/tardis-machine/replaying-historical-data#normalized-market-data-apis) — consistent format across all exchanges via HTTP and WebSocket endpoints. Includes synchronized multi-exchange replay, real-time streaming, customizable order book snapshots and trade bars.
|
|
16
16
|
|
|
17
|
-
- [seamless switching](https://docs.tardis.dev/
|
|
17
|
+
- [seamless switching](https://docs.tardis.dev/tardis-machine/replaying-historical-data#normalized-market-data-apis) between real-time streaming and historical replay
|
|
18
18
|
|
|
19
19
|
- transparent local data caching (compressed GZIP on disk, decompressed on demand)
|
|
20
20
|
|
|
@@ -24,6 +24,6 @@
|
|
|
24
24
|
|
|
25
25
|
## Documentation
|
|
26
26
|
|
|
27
|
-
### [See official docs](https://docs.tardis.dev/
|
|
27
|
+
### [See official docs](https://docs.tardis.dev/tardis-machine/quickstart).
|
|
28
28
|
|
|
29
29
|
<br/>
|
package/benchmark.js
CHANGED
package/bin/tardis-machine.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
process.env.UWS_HTTP_MAX_HEADERS_SIZE = '20000'
|
|
3
|
+
import { createRequire } from 'node:module'
|
|
4
|
+
|
|
5
|
+
const require = createRequire(import.meta.url)
|
|
3
6
|
const yargs = require('yargs')
|
|
4
|
-
const os = require('os')
|
|
5
|
-
const path = require('path')
|
|
6
|
-
const cluster = require('cluster')
|
|
7
|
-
const numCPUs =
|
|
7
|
+
const os = require('node:os')
|
|
8
|
+
const path = require('node:path')
|
|
9
|
+
const cluster = require('node:cluster')
|
|
10
|
+
const numCPUs = os.cpus().length
|
|
8
11
|
const isDocker = require('is-docker')
|
|
9
12
|
const pkg = require('../package.json')
|
|
13
|
+
const { TardisMachine } = await import('../dist/index.js')
|
|
10
14
|
|
|
11
15
|
const DEFAULT_PORT = 8000
|
|
12
16
|
const argv = yargs
|
|
@@ -60,8 +64,6 @@ if (enableDebug) {
|
|
|
60
64
|
process.env.DEBUG = 'tardis-dev:machine*,tardis-dev:realtime*'
|
|
61
65
|
}
|
|
62
66
|
|
|
63
|
-
const { TardisMachine } = require('../dist')
|
|
64
|
-
|
|
65
67
|
async function start() {
|
|
66
68
|
const machine = new TardisMachine({
|
|
67
69
|
apiKey: argv['api-key'],
|
|
@@ -75,7 +77,7 @@ async function start() {
|
|
|
75
77
|
cluster.schedulingPolicy = cluster.SCHED_RR
|
|
76
78
|
|
|
77
79
|
suffix = '(cluster mode)'
|
|
78
|
-
if (cluster.
|
|
80
|
+
if (cluster.isPrimary) {
|
|
79
81
|
for (let i = 0; i < numCPUs; i++) {
|
|
80
82
|
cluster.fork()
|
|
81
83
|
}
|
|
@@ -86,7 +88,7 @@ async function start() {
|
|
|
86
88
|
await machine.start(port)
|
|
87
89
|
}
|
|
88
90
|
|
|
89
|
-
if (!cluster.
|
|
91
|
+
if (!cluster.isPrimary) {
|
|
90
92
|
return
|
|
91
93
|
}
|
|
92
94
|
|
package/dist/debug.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.debug = void 0;
|
|
7
|
-
const debug_1 = __importDefault(require("debug"));
|
|
8
|
-
exports.debug = (0, debug_1.default)('tardis-dev:machine');
|
|
1
|
+
import dbg from 'debug';
|
|
2
|
+
export const debug = dbg('tardis-dev:machine');
|
|
9
3
|
//# sourceMappingURL=debug.js.map
|
package/dist/debug.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAA;AACvB,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAA"}
|
package/dist/helpers.js
CHANGED
|
@@ -1,30 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.wait = void 0;
|
|
4
|
-
exports.getNormalizers = getNormalizers;
|
|
5
|
-
exports.constructDataTypeFilter = constructDataTypeFilter;
|
|
6
|
-
exports.getComputables = getComputables;
|
|
7
|
-
const tardis_dev_1 = require("tardis-dev");
|
|
8
|
-
function* getNormalizers(dataTypes) {
|
|
1
|
+
import { computeBookSnapshots, computeTradeBars, normalizeBookChanges, normalizeDerivativeTickers, normalizeLiquidations, normalizeTrades, normalizeOptionsSummary, normalizeBookTickers } from 'tardis-dev';
|
|
2
|
+
export function* getNormalizers(dataTypes) {
|
|
9
3
|
if (dataTypes.includes('trade') || dataTypes.some((dataType) => dataType.startsWith('trade_bar_'))) {
|
|
10
|
-
yield
|
|
4
|
+
yield normalizeTrades;
|
|
11
5
|
}
|
|
12
6
|
if (dataTypes.includes('book_change') ||
|
|
13
7
|
dataTypes.some((dataType) => dataType.startsWith('book_snapshot_')) ||
|
|
14
8
|
dataTypes.some((dataType) => dataType.startsWith('quote'))) {
|
|
15
|
-
yield
|
|
9
|
+
yield normalizeBookChanges;
|
|
16
10
|
}
|
|
17
11
|
if (dataTypes.includes('derivative_ticker')) {
|
|
18
|
-
yield
|
|
12
|
+
yield normalizeDerivativeTickers;
|
|
19
13
|
}
|
|
20
14
|
if (dataTypes.includes('liquidation')) {
|
|
21
|
-
yield
|
|
15
|
+
yield normalizeLiquidations;
|
|
22
16
|
}
|
|
23
17
|
if (dataTypes.includes('option_summary')) {
|
|
24
|
-
yield
|
|
18
|
+
yield normalizeOptionsSummary;
|
|
25
19
|
}
|
|
26
20
|
if (dataTypes.includes('book_ticker')) {
|
|
27
|
-
yield
|
|
21
|
+
yield normalizeBookTickers;
|
|
28
22
|
}
|
|
29
23
|
}
|
|
30
24
|
function getRequestedDataTypes(options) {
|
|
@@ -41,7 +35,7 @@ function getRequestedDataTypes(options) {
|
|
|
41
35
|
return dataType;
|
|
42
36
|
});
|
|
43
37
|
}
|
|
44
|
-
function constructDataTypeFilter(options) {
|
|
38
|
+
export function constructDataTypeFilter(options) {
|
|
45
39
|
const requestedDataTypesPerExchange = options.reduce((prev, current) => {
|
|
46
40
|
if (prev[current.exchange] !== undefined) {
|
|
47
41
|
prev[current.exchange] = [...prev[current.exchange], ...getRequestedDataTypes(current)];
|
|
@@ -93,7 +87,7 @@ const bookSnapshotsToIntervalMultiplierMap = {
|
|
|
93
87
|
}
|
|
94
88
|
};
|
|
95
89
|
const getKeys = (o) => Object.keys(o);
|
|
96
|
-
function getComputables(dataTypes) {
|
|
90
|
+
export function getComputables(dataTypes) {
|
|
97
91
|
const computables = [];
|
|
98
92
|
for (const dataType of dataTypes) {
|
|
99
93
|
if (dataType.startsWith('trade_bar')) {
|
|
@@ -118,7 +112,7 @@ function parseAsTradeBarComputable(dataType) {
|
|
|
118
112
|
if (Number.isNaN(interval)) {
|
|
119
113
|
throw new Error(`invalid interval: ${intervalString}, data type: ${dataType}`);
|
|
120
114
|
}
|
|
121
|
-
return
|
|
115
|
+
return computeTradeBars({
|
|
122
116
|
interval: tradeBarSuffixToKindMap[suffix].multiplier * interval,
|
|
123
117
|
kind: tradeBarSuffixToKindMap[suffix].kind,
|
|
124
118
|
name: dataType
|
|
@@ -151,7 +145,7 @@ function parseAsBookSnapshotComputable(dataType) {
|
|
|
151
145
|
throw new Error(`invalid interval: ${groupingString}, data type: ${dataType}`);
|
|
152
146
|
}
|
|
153
147
|
}
|
|
154
|
-
return
|
|
148
|
+
return computeBookSnapshots({
|
|
155
149
|
interval: bookSnapshotsToIntervalMultiplierMap[suffix].multiplier * interval,
|
|
156
150
|
grouping,
|
|
157
151
|
depth,
|
|
@@ -163,7 +157,7 @@ function parseAsBookSnapshotComputable(dataType) {
|
|
|
163
157
|
}
|
|
164
158
|
function parseAsQuoteComputable(dataType) {
|
|
165
159
|
if (dataType === 'quote') {
|
|
166
|
-
return
|
|
160
|
+
return computeBookSnapshots({
|
|
167
161
|
interval: 0,
|
|
168
162
|
depth: 1,
|
|
169
163
|
name: dataType,
|
|
@@ -179,7 +173,7 @@ function parseAsQuoteComputable(dataType) {
|
|
|
179
173
|
if (Number.isNaN(interval)) {
|
|
180
174
|
throw new Error(`invalid interval: ${intervalString}, data type: ${dataType}`);
|
|
181
175
|
}
|
|
182
|
-
return
|
|
176
|
+
return computeBookSnapshots({
|
|
183
177
|
interval: bookSnapshotsToIntervalMultiplierMap[suffix].multiplier * interval,
|
|
184
178
|
depth: 1,
|
|
185
179
|
name: dataType,
|
|
@@ -188,8 +182,7 @@ function parseAsQuoteComputable(dataType) {
|
|
|
188
182
|
}
|
|
189
183
|
throw new Error(`invalid data type: ${dataType}`);
|
|
190
184
|
}
|
|
191
|
-
const wait = (delayMS) => new Promise((resolve) => setTimeout(resolve, delayMS));
|
|
192
|
-
exports.wait = wait;
|
|
185
|
+
export const wait = (delayMS) => new Promise((resolve) => setTimeout(resolve, delayMS));
|
|
193
186
|
const oldToISOString = Date.prototype.toISOString;
|
|
194
187
|
// if Date provides microseconds add those to ISO date
|
|
195
188
|
Date.prototype.toISOString = function () {
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healthCheck.d.ts","sourceRoot":"","sources":["../../src/http/healthCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"healthCheck.d.ts","sourceRoot":"","sources":["../../src/http/healthCheck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhE,eAAO,MAAM,WAAW,GAAI,GAAG,eAAe,EAAE,KAAK,cAAc,SA8BlE,CAAA"}
|
package/dist/http/healthCheck.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.healthCheck = void 0;
|
|
4
1
|
const BYTES_IN_MB = 1024 * 1024;
|
|
5
|
-
const healthCheck = (_, res) => {
|
|
2
|
+
export const healthCheck = (_, res) => {
|
|
6
3
|
res.setHeader('Content-Type', 'application/json');
|
|
7
4
|
try {
|
|
8
5
|
const memUsage = process.memoryUsage();
|
|
@@ -28,5 +25,4 @@ const healthCheck = (_, res) => {
|
|
|
28
25
|
}
|
|
29
26
|
}
|
|
30
27
|
};
|
|
31
|
-
exports.healthCheck = healthCheck;
|
|
32
28
|
//# sourceMappingURL=healthCheck.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healthCheck.js","sourceRoot":"","sources":["../../src/http/healthCheck.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"healthCheck.js","sourceRoot":"","sources":["../../src/http/healthCheck.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAA;AAE/B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAE,GAAmB,EAAE,EAAE;IACrE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;IAEjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAEtC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9D,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtD,WAAW,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClE,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAChE,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aACjE;SACF,CAAA;QAED,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;YAEpB,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,WAAW;aACrB,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
|
package/dist/http/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './replay';
|
|
2
|
-
export * from './replaynormalized';
|
|
3
|
-
export * from './healthCheck';
|
|
1
|
+
export * from './replay.ts';
|
|
2
|
+
export * from './replaynormalized.ts';
|
|
3
|
+
export * from './healthCheck.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/http/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA"}
|
package/dist/http/index.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./replay"), exports);
|
|
18
|
-
__exportStar(require("./replaynormalized"), exports);
|
|
19
|
-
__exportStar(require("./healthCheck"), exports);
|
|
1
|
+
export * from "./replay.js";
|
|
2
|
+
export * from "./replaynormalized.js";
|
|
3
|
+
export * from "./healthCheck.js";
|
|
20
4
|
//# sourceMappingURL=index.js.map
|
package/dist/http/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA"}
|
package/dist/http/replay.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/http/replay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/http/replay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAA;AAIjF,eAAO,MAAM,UAAU,GAAU,KAAK,eAAe,EAAE,KAAK,cAAc,kBAiCzE,CAAA"}
|
package/dist/http/replay.js
CHANGED
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.replayHttp = void 0;
|
|
7
|
-
const events_1 = require("events");
|
|
8
|
-
const tardis_dev_1 = require("tardis-dev");
|
|
9
|
-
const url_1 = __importDefault(require("url"));
|
|
10
|
-
const debug_1 = require("../debug");
|
|
11
|
-
const replayHttp = async (req, res) => {
|
|
1
|
+
import { once } from 'node:events';
|
|
2
|
+
import { replay } from 'tardis-dev';
|
|
3
|
+
import { debug } from "../debug.js";
|
|
4
|
+
export const replayHttp = async (req, res) => {
|
|
12
5
|
try {
|
|
13
6
|
const startTimestamp = new Date().getTime();
|
|
14
|
-
const
|
|
15
|
-
const optionsString =
|
|
7
|
+
const requestUrl = new URL(req.url, 'http://localhost');
|
|
8
|
+
const optionsString = requestUrl.searchParams.get('options') ?? undefined;
|
|
16
9
|
const replayOptions = JSON.parse(optionsString);
|
|
17
|
-
|
|
10
|
+
debug('GET /replay request started, options: %o', replayOptions);
|
|
18
11
|
const streamedMessagesCount = await writeMessagesToResponse(res, replayOptions);
|
|
19
12
|
const endTimestamp = new Date().getTime();
|
|
20
|
-
|
|
13
|
+
debug('GET /replay request finished, options: %o, time: %d seconds, total messages count:%d', replayOptions, (endTimestamp - startTimestamp) / 1000, streamedMessagesCount);
|
|
21
14
|
}
|
|
22
15
|
catch (e) {
|
|
23
16
|
const errorInfo = {
|
|
@@ -25,7 +18,7 @@ const replayHttp = async (req, res) => {
|
|
|
25
18
|
message: e.message,
|
|
26
19
|
url: e.url
|
|
27
20
|
};
|
|
28
|
-
|
|
21
|
+
debug('GET /replay request error: %o', e);
|
|
29
22
|
console.error('GET /replay request error:', e);
|
|
30
23
|
if (!res.finished) {
|
|
31
24
|
res.statusCode = e.status || 500;
|
|
@@ -33,7 +26,6 @@ const replayHttp = async (req, res) => {
|
|
|
33
26
|
}
|
|
34
27
|
}
|
|
35
28
|
};
|
|
36
|
-
exports.replayHttp = replayHttp;
|
|
37
29
|
async function writeMessagesToResponse(res, replayOptions) {
|
|
38
30
|
const responsePrefixBuffer = Buffer.from('{"localTimestamp":"');
|
|
39
31
|
const responseMiddleBuffer = Buffer.from('","message":');
|
|
@@ -44,7 +36,7 @@ async function writeMessagesToResponse(res, replayOptions) {
|
|
|
44
36
|
res.setHeader('Content-Type', 'application/x-json-stream');
|
|
45
37
|
let buffers = [];
|
|
46
38
|
let totalMessagesCount = 0;
|
|
47
|
-
const messages =
|
|
39
|
+
const messages = replay({ ...replayOptions, skipDecoding: true });
|
|
48
40
|
for await (let messageWithTimestamp of messages) {
|
|
49
41
|
totalMessagesCount++;
|
|
50
42
|
if (messageWithTimestamp === undefined) {
|
|
@@ -61,7 +53,7 @@ async function writeMessagesToResponse(res, replayOptions) {
|
|
|
61
53
|
const ok = res.write(Buffer.concat(buffers));
|
|
62
54
|
buffers = [];
|
|
63
55
|
if (!ok) {
|
|
64
|
-
await
|
|
56
|
+
await once(res, 'drain');
|
|
65
57
|
}
|
|
66
58
|
}
|
|
67
59
|
}
|
package/dist/http/replay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/http/replay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/http/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { IncomingMessage, ServerResponse } from 'http';
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
export declare const replayNormalizedHttp: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
3
3
|
//# sourceMappingURL=replaynormalized.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replaynormalized.d.ts","sourceRoot":"","sources":["../../src/http/replaynormalized.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"replaynormalized.d.ts","sourceRoot":"","sources":["../../src/http/replaynormalized.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAA;AAKjF,eAAO,MAAM,oBAAoB,GAAU,KAAK,eAAe,EAAE,KAAK,cAAc,kBAiCnF,CAAA"}
|
|
@@ -1,24 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
exports.replayNormalizedHttp = void 0;
|
|
7
|
-
const events_1 = require("events");
|
|
8
|
-
const tardis_dev_1 = require("tardis-dev");
|
|
9
|
-
const url_1 = __importDefault(require("url"));
|
|
10
|
-
const debug_1 = require("../debug");
|
|
11
|
-
const helpers_1 = require("../helpers");
|
|
12
|
-
const replayNormalizedHttp = async (req, res) => {
|
|
1
|
+
import { once } from 'node:events';
|
|
2
|
+
import { combine, compute, replayNormalized } from 'tardis-dev';
|
|
3
|
+
import { debug } from "../debug.js";
|
|
4
|
+
import { constructDataTypeFilter, getComputables, getNormalizers } from "../helpers.js";
|
|
5
|
+
export const replayNormalizedHttp = async (req, res) => {
|
|
13
6
|
try {
|
|
14
7
|
const startTimestamp = new Date().getTime();
|
|
15
|
-
const
|
|
16
|
-
const optionsString =
|
|
8
|
+
const requestUrl = new URL(req.url, 'http://localhost');
|
|
9
|
+
const optionsString = requestUrl.searchParams.get('options') ?? undefined;
|
|
17
10
|
const replayNormalizedOptions = JSON.parse(optionsString);
|
|
18
|
-
|
|
11
|
+
debug('GET /replay-normalized request started, options: %o', replayNormalizedOptions);
|
|
19
12
|
const streamedMessagesCount = await writeMessagesToResponse(res, replayNormalizedOptions);
|
|
20
13
|
const endTimestamp = new Date().getTime();
|
|
21
|
-
|
|
14
|
+
debug('GET /replay-normalized request finished, options: %o, time: %d seconds, total messages count: %d', replayNormalizedOptions, (endTimestamp - startTimestamp) / 1000, streamedMessagesCount);
|
|
22
15
|
}
|
|
23
16
|
catch (e) {
|
|
24
17
|
const errorInfo = {
|
|
@@ -26,7 +19,7 @@ const replayNormalizedHttp = async (req, res) => {
|
|
|
26
19
|
message: e.message,
|
|
27
20
|
url: e.url
|
|
28
21
|
};
|
|
29
|
-
|
|
22
|
+
debug('GET /replay-normalized request error: %o', e);
|
|
30
23
|
console.error('GET /replay-normalized request error:', e);
|
|
31
24
|
if (!res.finished) {
|
|
32
25
|
res.statusCode = e.status || 500;
|
|
@@ -34,7 +27,6 @@ const replayNormalizedHttp = async (req, res) => {
|
|
|
34
27
|
}
|
|
35
28
|
}
|
|
36
29
|
};
|
|
37
|
-
exports.replayNormalizedHttp = replayNormalizedHttp;
|
|
38
30
|
async function writeMessagesToResponse(res, options) {
|
|
39
31
|
const BATCH_SIZE = 32;
|
|
40
32
|
res.setHeader('Content-Type', 'application/x-json-stream');
|
|
@@ -43,16 +35,16 @@ async function writeMessagesToResponse(res, options) {
|
|
|
43
35
|
const replayNormalizedOptions = Array.isArray(options) ? options : [options];
|
|
44
36
|
const messagesIterables = replayNormalizedOptions.map((option) => {
|
|
45
37
|
// let's map from provided options to options and normalizers that needs to be added for dataTypes provided in options
|
|
46
|
-
const messages =
|
|
38
|
+
const messages = replayNormalized(option, ...getNormalizers(option.dataTypes));
|
|
47
39
|
// separately check if any computables are needed for given dataTypes
|
|
48
|
-
const computables =
|
|
40
|
+
const computables = getComputables(option.dataTypes);
|
|
49
41
|
if (computables.length > 0) {
|
|
50
|
-
return
|
|
42
|
+
return compute(messages, ...computables);
|
|
51
43
|
}
|
|
52
44
|
return messages;
|
|
53
45
|
});
|
|
54
|
-
const filterByDataType =
|
|
55
|
-
const messages = messagesIterables.length === 1 ? messagesIterables[0] :
|
|
46
|
+
const filterByDataType = constructDataTypeFilter(replayNormalizedOptions);
|
|
47
|
+
const messages = messagesIterables.length === 1 ? messagesIterables[0] : combine(...messagesIterables);
|
|
56
48
|
for await (const message of messages) {
|
|
57
49
|
// filter out messages not explicitly requested via options.dataTypes
|
|
58
50
|
// eg.: return only book_snapshots when someone asked only for those
|
|
@@ -66,7 +58,7 @@ async function writeMessagesToResponse(res, options) {
|
|
|
66
58
|
const ok = res.write(`${buffers.join('\n')}\n`);
|
|
67
59
|
buffers = [];
|
|
68
60
|
if (!ok) {
|
|
69
|
-
await
|
|
61
|
+
await once(res, 'drain');
|
|
70
62
|
}
|
|
71
63
|
}
|
|
72
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replaynormalized.js","sourceRoot":"","sources":["../../src/http/replaynormalized.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replaynormalized.js","sourceRoot":"","sources":["../../src/http/replaynormalized.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TardisMachine } from './tardismachine';
|
|
1
|
+
export { TardisMachine } from './tardismachine.ts';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TardisMachine = void 0;
|
|
4
|
-
var tardismachine_1 = require("./tardismachine");
|
|
5
|
-
Object.defineProperty(exports, "TardisMachine", { enumerable: true, get: function () { return tardismachine_1.TardisMachine; } });
|
|
1
|
+
export { TardisMachine } from "./tardismachine.js";
|
|
6
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tardismachine.d.ts","sourceRoot":"","sources":["../src/tardismachine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tardismachine.d.ts","sourceRoot":"","sources":["../src/tardismachine.ts"],"names":[],"mappings":"AAYA,qBAAa,aAAa;IAKZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,iBAAiB,CAAwC;gBAEpC,OAAO,EAAE,OAAO;IAoEhC,KAAK,CAAC,IAAI,EAAE,MAAM;IAwClB,IAAI;CAWlB;AAED,KAAK,OAAO,GAAG;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA"}
|