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 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;
@@ -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;AAElG,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"}
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"}
@@ -2,6 +2,7 @@ export declare class TardisMachine {
2
2
  private readonly options;
3
3
  private readonly _httpServer;
4
4
  private readonly _wsServer;
5
+ private _eventLoopTimerId;
5
6
  constructor(options: Options);
6
7
  start(port: number): Promise<void>;
7
8
  stop(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"tardismachine.d.ts","sourceRoot":"","sources":["../src/tardismachine.ts"],"names":[],"mappings":"AASA,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAEX,OAAO,EAAE,OAAO;IAoEhC,KAAK,CAAC,IAAI,EAAE,MAAM;IAuBlB,IAAI;CAOlB;AAED,aAAK,OAAO,GAAG;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA"}
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"}
@@ -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":"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"}
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,iBA4GvE"}
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
- const success = ws.send(JSON.stringify(message));
66
+ retries = 0;
67
+ bufferedAmount = 0;
57
68
  // handle backpressure in case of slow clients
58
- if (!success) {
59
- let retries = 0;
60
- while (ws.getBufferedAmount() > 0) {
61
- await (0, helpers_1.wait)(20);
62
- retries += 1;
63
- if (retries > 2000) {
64
- ws.end(1008, 'Too much backpressure');
65
- return;
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":"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"}
1
+ {"version":3,"file":"streamnormalized.js","sourceRoot":"","sources":["../../src/ws/streamnormalized.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-machine",
3
- "version": "3.7.4",
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": "^5.5.1",
60
+ "find-my-way": "^6.3.0",
61
61
  "is-docker": "^2.2.1",
62
- "tardis-dev": "^13.4.4",
63
- "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.8.0",
64
- "yargs": "^17.4.1"
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": "^27.0.3",
69
- "@types/node": "^17.0.27",
70
- "@types/node-fetch": "^2.5.12",
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": "^7.0.4",
76
- "jest": "^27.4.5",
77
- "lint-staged": "^12.4.0",
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": "^27.1.2",
82
- "typescript": "^4.6.3",
83
- "ws": "^8.5.0"
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
 
@@ -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
- const success = ws.send(JSON.stringify(message))
83
+ retries = 0
84
+ bufferedAmount = 0
70
85
  // handle backpressure in case of slow clients
71
- if (!success) {
72
- let retries = 0
73
- while (ws.getBufferedAmount() > 0) {
74
- await wait(20)
75
- retries += 1
76
-
77
- if (retries > 2000) {
78
- ws.end(1008, 'Too much backpressure')
79
- return
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
  }