tardis-machine 3.7.4 → 3.7.7
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/helpers.d.ts +3 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/tardismachine.d.ts +1 -0
- package/dist/tardismachine.d.ts.map +1 -1
- package/dist/tardismachine.js +18 -0
- package/dist/tardismachine.js.map +1 -1
- package/dist/ws/streamnormalized.d.ts.map +1 -1
- package/dist/ws/streamnormalized.js +22 -10
- package/dist/ws/streamnormalized.js.map +1 -1
- package/package.json +14 -14
- package/src/helpers.ts +1 -1
- package/src/tardismachine.ts +23 -0
- package/src/ws/streamnormalized.ts +28 -11
package/dist/helpers.d.ts
CHANGED
|
@@ -4,7 +4,9 @@ export declare type WithDataType = {
|
|
|
4
4
|
};
|
|
5
5
|
export declare type ReplayNormalizedOptionsWithDataType = ReplayNormalizedOptions<any, any> & WithDataType;
|
|
6
6
|
export declare type ReplayNormalizedRequestOptions = ReplayNormalizedOptionsWithDataType | ReplayNormalizedOptionsWithDataType[];
|
|
7
|
-
export declare type StreamNormalizedOptionsWithDataType = StreamNormalizedOptions<any, any> & WithDataType
|
|
7
|
+
export declare type StreamNormalizedOptionsWithDataType = StreamNormalizedOptions<any, any> & WithDataType & {
|
|
8
|
+
withErrorMessages?: boolean;
|
|
9
|
+
};
|
|
8
10
|
export declare type StreamNormalizedRequestOptions = StreamNormalizedOptionsWithDataType | StreamNormalizedOptionsWithDataType[];
|
|
9
11
|
export declare function getNormalizers(dataTypes: string[]): IterableIterator<MapperFactory<any, any>>;
|
|
10
12
|
export declare function constructDataTypeFilter(options: (ReplayNormalizedOptionsWithDataType | StreamNormalizedOptionsWithDataType)[]): (message: NormalizedData | Disconnect) => any;
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGjB,UAAU,EACV,aAAa,EAEb,cAAc,EAKd,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,YAAY,CAAA;AAEnB,oBAAY,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AAED,oBAAY,mCAAmC,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAA;AAElG,oBAAY,8BAA8B,GAAG,mCAAmC,GAAG,mCAAmC,EAAE,CAAA;AAExH,oBAAY,mCAAmC,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGjB,UAAU,EACV,aAAa,EAEb,cAAc,EAKd,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,YAAY,CAAA;AAEnB,oBAAY,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AAED,oBAAY,mCAAmC,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAA;AAElG,oBAAY,8BAA8B,GAAG,mCAAmC,GAAG,mCAAmC,EAAE,CAAA;AAExH,oBAAY,mCAAmC,GAAG,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,GAAG;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEpI,oBAAY,8BAA8B,GAAG,mCAAmC,GAAG,mCAAmC,EAAE,CAAA;AAExH,wBAAiB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CA0B9F;AAmBD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,CAAC,mCAAmC,GAAG,mCAAmC,CAAC,EAAE,aAa3G,cAAc,GAAG,UAAU,SAO7C;AAwCD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAkB5E;AAmGD,eAAO,MAAM,IAAI,YAAa,MAAM,qBAA2D,CAAA"}
|
package/dist/tardismachine.d.ts
CHANGED
|
@@ -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":"AAUA,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,CAAsC;gBAElC,OAAO,EAAE,OAAO;IAoEhC,KAAK,CAAC,IAAI,EAAE,MAAM;IAwClB,IAAI;CAWlB;AAED,aAAK,OAAO,GAAG;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA"}
|
package/dist/tardismachine.js
CHANGED
|
@@ -10,11 +10,13 @@ const tardis_dev_1 = require("tardis-dev");
|
|
|
10
10
|
const uWebSockets_js_1 = require("uWebSockets.js");
|
|
11
11
|
const http_2 = require("./http");
|
|
12
12
|
const ws_1 = require("./ws");
|
|
13
|
+
const debug_1 = require("./debug");
|
|
13
14
|
const pkg = require('../package.json');
|
|
14
15
|
class TardisMachine {
|
|
15
16
|
options;
|
|
16
17
|
_httpServer;
|
|
17
18
|
_wsServer;
|
|
19
|
+
_eventLoopTimerId = undefined;
|
|
18
20
|
constructor(options) {
|
|
19
21
|
this.options = options;
|
|
20
22
|
(0, tardis_dev_1.init)({
|
|
@@ -70,6 +72,19 @@ class TardisMachine {
|
|
|
70
72
|
});
|
|
71
73
|
}
|
|
72
74
|
async start(port) {
|
|
75
|
+
let start = process.hrtime();
|
|
76
|
+
const interval = 500;
|
|
77
|
+
// based on https://github.com/tj/node-blocked/blob/master/index.js
|
|
78
|
+
this._eventLoopTimerId = setInterval(() => {
|
|
79
|
+
const delta = process.hrtime(start);
|
|
80
|
+
const nanosec = delta[0] * 1e9 + delta[1];
|
|
81
|
+
const ms = nanosec / 1e6;
|
|
82
|
+
const n = ms - interval;
|
|
83
|
+
if (n > 2000) {
|
|
84
|
+
(0, debug_1.debug)('Tardis-machine server event loop blocked for %d ms.', Math.round(n));
|
|
85
|
+
}
|
|
86
|
+
start = process.hrtime();
|
|
87
|
+
}, interval);
|
|
73
88
|
if (this.options.clearCache) {
|
|
74
89
|
await (0, tardis_dev_1.clearCache)();
|
|
75
90
|
}
|
|
@@ -98,6 +113,9 @@ class TardisMachine {
|
|
|
98
113
|
err ? reject(err) : resolve();
|
|
99
114
|
});
|
|
100
115
|
});
|
|
116
|
+
if (this._eventLoopTimerId !== undefined) {
|
|
117
|
+
clearInterval(this._eventLoopTimerId);
|
|
118
|
+
}
|
|
101
119
|
}
|
|
102
120
|
}
|
|
103
121
|
exports.TardisMachine = TardisMachine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tardismachine.js","sourceRoot":"","sources":["../src/tardismachine.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAmC;AACnC,gDAAuB;AACvB,2CAA6C;AAC7C,mDAAuE;AACvE,iCAAsE;AACtE,6BAAuE;
|
|
1
|
+
{"version":3,"file":"tardismachine.js","sourceRoot":"","sources":["../src/tardismachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamnormalized.d.ts","sourceRoot":"","sources":["../../src/ws/streamnormalized.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAIvD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"streamnormalized.d.ts","sourceRoot":"","sources":["../../src/ws/streamnormalized.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAIvD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,iBA6HvE"}
|
|
@@ -18,6 +18,8 @@ async function streamNormalizedWS(ws, req) {
|
|
|
18
18
|
(0, debug_1.debug)('WebSocket /ws-stream-normalized started, options: %o', streamNormalizedOptions);
|
|
19
19
|
const options = Array.isArray(streamNormalizedOptions) ? streamNormalizedOptions : [streamNormalizedOptions];
|
|
20
20
|
let subSequentErrorsCount = {};
|
|
21
|
+
let retries = 0;
|
|
22
|
+
let bufferedAmount = 0;
|
|
21
23
|
const messagesIterables = options.map((option) => {
|
|
22
24
|
// let's map from provided options to options and normalizers that needs to be added for dataTypes provided in options
|
|
23
25
|
const messages = (0, tardis_dev_1.streamNormalized)({
|
|
@@ -29,6 +31,14 @@ async function streamNormalizedWS(ws, req) {
|
|
|
29
31
|
subSequentErrorsCount[exchange] = 0;
|
|
30
32
|
}
|
|
31
33
|
subSequentErrorsCount[exchange]++;
|
|
34
|
+
if (option.withErrorMessages && !ws.closed) {
|
|
35
|
+
ws.send(JSON.stringify({
|
|
36
|
+
type: 'error',
|
|
37
|
+
exchange,
|
|
38
|
+
localTimestamp: new Date(),
|
|
39
|
+
details: error.message
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
32
42
|
(0, debug_1.debug)('WebSocket /ws-stream-normalized %s WS connection error: %o', exchange, error);
|
|
33
43
|
}
|
|
34
44
|
}, ...(0, helpers_1.getNormalizers)(option.dataTypes));
|
|
@@ -53,19 +63,21 @@ async function streamNormalizedWS(ws, req) {
|
|
|
53
63
|
if (!filterByDataType(message)) {
|
|
54
64
|
continue;
|
|
55
65
|
}
|
|
56
|
-
|
|
66
|
+
retries = 0;
|
|
67
|
+
bufferedAmount = 0;
|
|
57
68
|
// handle backpressure in case of slow clients
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
retries
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
69
|
+
while ((bufferedAmount = ws.getBufferedAmount()) > 0) {
|
|
70
|
+
retries += 1;
|
|
71
|
+
await (0, helpers_1.wait)(10 * retries);
|
|
72
|
+
if (retries % 20 === 0 || retries === 5) {
|
|
73
|
+
(0, debug_1.debug)('Slow client, waiting %d ms, buffered amount: %d', 10 * retries, bufferedAmount);
|
|
74
|
+
}
|
|
75
|
+
if (retries > 100) {
|
|
76
|
+
ws.end(1008, 'Too much backpressure');
|
|
77
|
+
return;
|
|
67
78
|
}
|
|
68
79
|
}
|
|
80
|
+
ws.send(JSON.stringify(message));
|
|
69
81
|
if (message.type !== 'disconnect') {
|
|
70
82
|
subSequentErrorsCount[exchange] = 0;
|
|
71
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamnormalized.js","sourceRoot":"","sources":["../../src/ws/streamnormalized.ts"],"names":[],"mappings":";;;;;;AAAA,8DAA4B;AAC5B,2CAAyE;AAEzE,oCAAgC;AAChC,wCAA0H;AAEnH,KAAK,UAAU,kBAAkB,CAAC,EAAa,EAAE,GAAgB;IACtE,IAAI,QAAgD,CAAA;IAEpD,IAAI;QACF,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAC3C,MAAM,WAAW,GAAG,qBAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC7C,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAW,CAAA;QACtD,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAmC,CAAA;QAE3F,IAAA,aAAK,EAAC,sDAAsD,EAAE,uBAAuB,CAAC,CAAA;QAEtF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAA;QAC5G,IAAI,qBAAqB,GAAmC,EAAE,CAAA;QAE9D,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/C,sHAAsH;YACtH,MAAM,QAAQ,GAAG,IAAA,6BAAgB,EAC/B;gBACE,GAAG,MAAM;gBACT,sBAAsB,EAAE,IAAI;gBAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAoB,CAAA;oBAC5C,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;wBACjD,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;qBACpC;oBAED,qBAAqB,CAAC,QAAQ,CAAE,EAAE,CAAA;oBAElC,IAAA,aAAK,EAAC,4DAA4D,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;gBACtF,CAAC;aACF,EACD,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,SAAS,CAAC,CACpC,CAAA;YACD,qEAAqE;YACrE,MAAM,WAAW,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAEpD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,OAAO,IAAA,oBAAO,EAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAA;aACzC;YAED,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,MAAM,gBAAgB,GAAG,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAA;QACzD,QAAQ,GAAG,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,oBAAO,EAAC,GAAG,iBAAiB,CAAC,CAAA;QAEhG,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,QAAQ,EAAE;YACpC,IAAI,EAAE,CAAC,MAAM,EAAE;gBACb,OAAM;aACP;YAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAoB,CAAA;YAE7C,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,qBAAqB,CAAC,QAAQ,CAAE,IAAI,EAAE,EAAE;gBAC3F,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,kDAAkD,QAAQ,SAAS,CAAC,CAAA;gBACjF,OAAM;aACP;YAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;gBAC9B,SAAQ;aACT;YAED,
|
|
1
|
+
{"version":3,"file":"streamnormalized.js","sourceRoot":"","sources":["../../src/ws/streamnormalized.ts"],"names":[],"mappings":";;;;;;AAAA,8DAA4B;AAC5B,2CAAyE;AAEzE,oCAAgC;AAChC,wCAA0H;AAEnH,KAAK,UAAU,kBAAkB,CAAC,EAAa,EAAE,GAAgB;IACtE,IAAI,QAAgD,CAAA;IAEpD,IAAI;QACF,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAC3C,MAAM,WAAW,GAAG,qBAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC7C,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAW,CAAA;QACtD,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAmC,CAAA;QAE3F,IAAA,aAAK,EAAC,sDAAsD,EAAE,uBAAuB,CAAC,CAAA;QAEtF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAA;QAC5G,IAAI,qBAAqB,GAAmC,EAAE,CAAA;QAE9D,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,cAAc,GAAG,CAAC,CAAA;QAEtB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/C,sHAAsH;YACtH,MAAM,QAAQ,GAAG,IAAA,6BAAgB,EAC/B;gBACE,GAAG,MAAM;gBACT,sBAAsB,EAAE,IAAI;gBAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAoB,CAAA;oBAC5C,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;wBACjD,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;qBACpC;oBAED,qBAAqB,CAAC,QAAQ,CAAE,EAAE,CAAA;oBAElC,IAAI,MAAM,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;wBAC1C,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;4BACb,IAAI,EAAE,OAAO;4BACb,QAAQ;4BACR,cAAc,EAAE,IAAI,IAAI,EAAE;4BAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;yBACvB,CAAC,CACH,CAAA;qBACF;oBAED,IAAA,aAAK,EAAC,4DAA4D,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;gBACtF,CAAC;aACF,EACD,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,SAAS,CAAC,CACpC,CAAA;YACD,qEAAqE;YACrE,MAAM,WAAW,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAEpD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,OAAO,IAAA,oBAAO,EAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAA;aACzC;YAED,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,MAAM,gBAAgB,GAAG,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAA;QACzD,QAAQ,GAAG,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,oBAAO,EAAC,GAAG,iBAAiB,CAAC,CAAA;QAEhG,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,QAAQ,EAAE;YACpC,IAAI,EAAE,CAAC,MAAM,EAAE;gBACb,OAAM;aACP;YAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAoB,CAAA;YAE7C,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,qBAAqB,CAAC,QAAQ,CAAE,IAAI,EAAE,EAAE;gBAC3F,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,kDAAkD,QAAQ,SAAS,CAAC,CAAA;gBACjF,OAAM;aACP;YAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;gBAC9B,SAAQ;aACT;YAED,OAAO,GAAG,CAAC,CAAA;YACX,cAAc,GAAG,CAAC,CAAA;YAClB,8CAA8C;YAC9C,OAAO,CAAC,cAAc,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,EAAE;gBACpD,OAAO,IAAI,CAAC,CAAA;gBACZ,MAAM,IAAA,cAAI,EAAC,EAAE,GAAG,OAAO,CAAC,CAAA;gBAExB,IAAI,OAAO,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE;oBACvC,IAAA,aAAK,EAAC,iDAAiD,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,CAAC,CAAA;iBACvF;gBACD,IAAI,OAAO,GAAG,GAAG,EAAE;oBACjB,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAA;oBACrC,OAAM;iBACP;aACF;YAED,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YAEhC,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE;gBACjC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;aACpC;SACF;QAED,OAAO,EAAE,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE;YACjC,MAAM,IAAA,cAAI,EAAC,GAAG,CAAC,CAAA;SAChB;QAED,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAA;QAE7C,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAEzC,IAAA,aAAK,EACH,yEAAyE,EACzE,uBAAuB,EACvB,CAAC,YAAY,GAAG,cAAc,CAAC,GAAG,IAAI,CACvC,CAAA;KACF;IAAC,OAAO,CAAM,EAAE;QACf,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;YACd,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;SAC3B;QAED,IAAA,aAAK,EAAC,4CAA4C,EAAE,CAAC,CAAC,CAAA;QACtD,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAA;KAC3D;YAAS;QACR,iDAAiD;QACjD,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,QAAS,CAAC,MAAO,EAAE,CAAA;SACpB;KACF;AACH,CAAC;AA7HD,gDA6HC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tardis-machine",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.7",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=12"
|
|
6
6
|
},
|
|
@@ -57,30 +57,30 @@
|
|
|
57
57
|
"license": "MPL-2.0",
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"debug": "^4.3.4",
|
|
60
|
-
"find-my-way": "^
|
|
60
|
+
"find-my-way": "^6.3.0",
|
|
61
61
|
"is-docker": "^2.2.1",
|
|
62
|
-
"tardis-dev": "^13.4.
|
|
63
|
-
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.
|
|
64
|
-
"yargs": "^17.
|
|
62
|
+
"tardis-dev": "^13.4.5",
|
|
63
|
+
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.10.0",
|
|
64
|
+
"yargs": "^17.5.1"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@types/debug": "^4.1.7",
|
|
68
|
-
"@types/jest": "^
|
|
69
|
-
"@types/node": "^17.0.
|
|
70
|
-
"@types/node-fetch": "^2.
|
|
68
|
+
"@types/jest": "^28.1.1",
|
|
69
|
+
"@types/node": "^17.0.41",
|
|
70
|
+
"@types/node-fetch": "^2.6.1",
|
|
71
71
|
"@types/split2": "^3.2.1",
|
|
72
72
|
"@types/ws": "^8.5.3",
|
|
73
73
|
"@types/yargs": "^17.0.10",
|
|
74
74
|
"cross-var": "^1.1.0",
|
|
75
|
-
"husky": "^
|
|
76
|
-
"jest": "^
|
|
77
|
-
"lint-staged": "^
|
|
75
|
+
"husky": "^8.0.1",
|
|
76
|
+
"jest": "^28.1.1",
|
|
77
|
+
"lint-staged": "^13.0.1",
|
|
78
78
|
"node-fetch": "^2.6.1",
|
|
79
79
|
"prettier": "^2.6.2",
|
|
80
80
|
"split2": "^4.1.0",
|
|
81
|
-
"ts-jest": "^
|
|
82
|
-
"typescript": "^4.
|
|
83
|
-
"ws": "^8.
|
|
81
|
+
"ts-jest": "^28.0.4",
|
|
82
|
+
"typescript": "^4.7.3",
|
|
83
|
+
"ws": "^8.8.0"
|
|
84
84
|
},
|
|
85
85
|
"lint-staged": {
|
|
86
86
|
"*.{ts}": [
|
package/src/helpers.ts
CHANGED
|
@@ -23,7 +23,7 @@ export type ReplayNormalizedOptionsWithDataType = ReplayNormalizedOptions<any, a
|
|
|
23
23
|
|
|
24
24
|
export type ReplayNormalizedRequestOptions = ReplayNormalizedOptionsWithDataType | ReplayNormalizedOptionsWithDataType[]
|
|
25
25
|
|
|
26
|
-
export type StreamNormalizedOptionsWithDataType = StreamNormalizedOptions<any, any> & WithDataType
|
|
26
|
+
export type StreamNormalizedOptionsWithDataType = StreamNormalizedOptions<any, any> & WithDataType & { withErrorMessages?: boolean }
|
|
27
27
|
|
|
28
28
|
export type StreamNormalizedRequestOptions = StreamNormalizedOptionsWithDataType | StreamNormalizedOptionsWithDataType[]
|
|
29
29
|
|
package/src/tardismachine.ts
CHANGED
|
@@ -4,12 +4,14 @@ import { clearCache, init } from 'tardis-dev'
|
|
|
4
4
|
import { App, DISABLED, TemplatedApp, WebSocket } from 'uWebSockets.js'
|
|
5
5
|
import { replayHttp, replayNormalizedHttp, healthCheck } from './http'
|
|
6
6
|
import { replayNormalizedWS, replayWS, streamNormalizedWS } from './ws'
|
|
7
|
+
import { debug } from './debug'
|
|
7
8
|
|
|
8
9
|
const pkg = require('../package.json')
|
|
9
10
|
|
|
10
11
|
export class TardisMachine {
|
|
11
12
|
private readonly _httpServer: http.Server
|
|
12
13
|
private readonly _wsServer: TemplatedApp
|
|
14
|
+
private _eventLoopTimerId: NodeJS.Timer | undefined = undefined
|
|
13
15
|
|
|
14
16
|
constructor(private readonly options: Options) {
|
|
15
17
|
init({
|
|
@@ -80,6 +82,23 @@ export class TardisMachine {
|
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
public async start(port: number) {
|
|
85
|
+
let start = process.hrtime()
|
|
86
|
+
const interval = 500
|
|
87
|
+
|
|
88
|
+
// based on https://github.com/tj/node-blocked/blob/master/index.js
|
|
89
|
+
this._eventLoopTimerId = setInterval(() => {
|
|
90
|
+
const delta = process.hrtime(start)
|
|
91
|
+
const nanosec = delta[0] * 1e9 + delta[1]
|
|
92
|
+
const ms = nanosec / 1e6
|
|
93
|
+
const n = ms - interval
|
|
94
|
+
|
|
95
|
+
if (n > 2000) {
|
|
96
|
+
debug('Tardis-machine server event loop blocked for %d ms.', Math.round(n))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
start = process.hrtime()
|
|
100
|
+
}, interval)
|
|
101
|
+
|
|
83
102
|
if (this.options.clearCache) {
|
|
84
103
|
await clearCache()
|
|
85
104
|
}
|
|
@@ -108,6 +127,10 @@ export class TardisMachine {
|
|
|
108
127
|
err ? reject(err) : resolve()
|
|
109
128
|
})
|
|
110
129
|
})
|
|
130
|
+
|
|
131
|
+
if (this._eventLoopTimerId !== undefined) {
|
|
132
|
+
clearInterval(this._eventLoopTimerId)
|
|
133
|
+
}
|
|
111
134
|
}
|
|
112
135
|
}
|
|
113
136
|
|
|
@@ -18,6 +18,9 @@ export async function streamNormalizedWS(ws: WebSocket, req: HttpRequest) {
|
|
|
18
18
|
const options = Array.isArray(streamNormalizedOptions) ? streamNormalizedOptions : [streamNormalizedOptions]
|
|
19
19
|
let subSequentErrorsCount: { [key in Exchange]?: number } = {}
|
|
20
20
|
|
|
21
|
+
let retries = 0
|
|
22
|
+
let bufferedAmount = 0
|
|
23
|
+
|
|
21
24
|
const messagesIterables = options.map((option) => {
|
|
22
25
|
// let's map from provided options to options and normalizers that needs to be added for dataTypes provided in options
|
|
23
26
|
const messages = streamNormalized(
|
|
@@ -32,6 +35,17 @@ export async function streamNormalizedWS(ws: WebSocket, req: HttpRequest) {
|
|
|
32
35
|
|
|
33
36
|
subSequentErrorsCount[exchange]!++
|
|
34
37
|
|
|
38
|
+
if (option.withErrorMessages && !ws.closed) {
|
|
39
|
+
ws.send(
|
|
40
|
+
JSON.stringify({
|
|
41
|
+
type: 'error',
|
|
42
|
+
exchange,
|
|
43
|
+
localTimestamp: new Date(),
|
|
44
|
+
details: error.message
|
|
45
|
+
})
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
35
49
|
debug('WebSocket /ws-stream-normalized %s WS connection error: %o', exchange, error)
|
|
36
50
|
}
|
|
37
51
|
},
|
|
@@ -66,21 +80,24 @@ export async function streamNormalizedWS(ws: WebSocket, req: HttpRequest) {
|
|
|
66
80
|
continue
|
|
67
81
|
}
|
|
68
82
|
|
|
69
|
-
|
|
83
|
+
retries = 0
|
|
84
|
+
bufferedAmount = 0
|
|
70
85
|
// handle backpressure in case of slow clients
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
while ((bufferedAmount = ws.getBufferedAmount()) > 0) {
|
|
87
|
+
retries += 1
|
|
88
|
+
await wait(10 * retries)
|
|
89
|
+
|
|
90
|
+
if (retries % 20 === 0 || retries === 5) {
|
|
91
|
+
debug('Slow client, waiting %d ms, buffered amount: %d', 10 * retries, bufferedAmount)
|
|
92
|
+
}
|
|
93
|
+
if (retries > 100) {
|
|
94
|
+
ws.end(1008, 'Too much backpressure')
|
|
95
|
+
return
|
|
81
96
|
}
|
|
82
97
|
}
|
|
83
98
|
|
|
99
|
+
ws.send(JSON.stringify(message))
|
|
100
|
+
|
|
84
101
|
if (message.type !== 'disconnect') {
|
|
85
102
|
subSequentErrorsCount[exchange] = 0
|
|
86
103
|
}
|