tardis-machine 3.7.6 → 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.
@@ -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,iBAuHvE"}
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)({
@@ -61,19 +63,21 @@ async function streamNormalizedWS(ws, req) {
61
63
  if (!filterByDataType(message)) {
62
64
  continue;
63
65
  }
64
- const success = ws.send(JSON.stringify(message));
66
+ retries = 0;
67
+ bufferedAmount = 0;
65
68
  // handle backpressure in case of slow clients
66
- if (!success) {
67
- let retries = 0;
68
- while (ws.getBufferedAmount() > 0) {
69
- await (0, helpers_1.wait)(20);
70
- retries += 1;
71
- if (retries > 2000) {
72
- ws.end(1008, 'Too much backpressure');
73
- return;
74
- }
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;
75
78
  }
76
79
  }
80
+ ws.send(JSON.stringify(message));
77
81
  if (message.type !== 'disconnect') {
78
82
  subSequentErrorsCount[exchange] = 0;
79
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.6",
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
62
  "tardis-dev": "^13.4.5",
63
- "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.8.0",
64
- "yargs": "^17.4.1"
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}": [
@@ -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(
@@ -77,21 +80,24 @@ export async function streamNormalizedWS(ws: WebSocket, req: HttpRequest) {
77
80
  continue
78
81
  }
79
82
 
80
- const success = ws.send(JSON.stringify(message))
83
+ retries = 0
84
+ bufferedAmount = 0
81
85
  // handle backpressure in case of slow clients
82
- if (!success) {
83
- let retries = 0
84
- while (ws.getBufferedAmount() > 0) {
85
- await wait(20)
86
- retries += 1
87
-
88
- if (retries > 2000) {
89
- ws.end(1008, 'Too much backpressure')
90
- return
91
- }
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
92
96
  }
93
97
  }
94
98
 
99
+ ws.send(JSON.stringify(message))
100
+
95
101
  if (message.type !== 'disconnect') {
96
102
  subSequentErrorsCount[exchange] = 0
97
103
  }