testplane 8.42.5 → 8.43.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.
Files changed (70) hide show
  1. package/build/package.json +4 -4
  2. package/build/src/browser/browser.js +5 -4
  3. package/build/src/browser/browser.js.map +1 -1
  4. package/build/src/browser/cdp/connection.d.ts +2 -39
  5. package/build/src/browser/cdp/connection.js +73 -353
  6. package/build/src/browser/cdp/connection.js.map +1 -1
  7. package/build/src/browser/cdp/constants.d.ts +0 -10
  8. package/build/src/browser/cdp/constants.js +1 -11
  9. package/build/src/browser/cdp/constants.js.map +1 -1
  10. package/build/src/browser/cdp/error.d.ts +14 -20
  11. package/build/src/browser/cdp/error.js +29 -32
  12. package/build/src/browser/cdp/error.js.map +1 -1
  13. package/build/src/browser/cdp/utils.d.ts +0 -6
  14. package/build/src/browser/cdp/utils.js +1 -6
  15. package/build/src/browser/cdp/utils.js.map +1 -1
  16. package/build/src/browser/commands/assert-view/errors/image-diff-error.d.ts +1 -0
  17. package/build/src/browser/existing-browser.d.ts +2 -0
  18. package/build/src/browser/existing-browser.js +15 -0
  19. package/build/src/browser/existing-browser.js.map +1 -1
  20. package/build/src/browser/wsdriver/compression.d.ts +5 -0
  21. package/build/src/browser/wsdriver/compression.js +79 -0
  22. package/build/src/browser/wsdriver/compression.js.map +1 -0
  23. package/build/src/browser/wsdriver/constants.d.ts +11 -0
  24. package/build/src/browser/wsdriver/constants.js +15 -0
  25. package/build/src/browser/wsdriver/constants.js.map +1 -0
  26. package/build/src/browser/wsdriver/debug.d.ts +2 -0
  27. package/build/src/browser/wsdriver/debug.js +9 -0
  28. package/build/src/browser/wsdriver/debug.js.map +1 -0
  29. package/build/src/browser/wsdriver/error.d.ts +18 -0
  30. package/build/src/browser/wsdriver/error.js +36 -0
  31. package/build/src/browser/wsdriver/error.js.map +1 -0
  32. package/build/src/browser/wsdriver/index.d.ts +23 -0
  33. package/build/src/browser/wsdriver/index.js +261 -0
  34. package/build/src/browser/wsdriver/index.js.map +1 -0
  35. package/build/src/browser/wsdriver/request.d.ts +10 -0
  36. package/build/src/browser/wsdriver/request.js +58 -0
  37. package/build/src/browser/wsdriver/request.js.map +1 -0
  38. package/build/src/browser/wsdriver/response.d.ts +3 -0
  39. package/build/src/browser/wsdriver/response.js +111 -0
  40. package/build/src/browser/wsdriver/response.js.map +1 -0
  41. package/build/src/browser/wsdriver/types.d.ts +71 -0
  42. package/build/src/browser/wsdriver/types.js +27 -0
  43. package/build/src/browser/wsdriver/types.js.map +1 -0
  44. package/build/src/config/browser-options.js +1 -0
  45. package/build/src/config/browser-options.js.map +1 -1
  46. package/build/src/config/defaults.d.ts +1 -0
  47. package/build/src/config/defaults.js +1 -0
  48. package/build/src/config/defaults.js.map +1 -1
  49. package/build/src/config/types.d.ts +1 -0
  50. package/build/src/constants/png.d.ts +1 -0
  51. package/build/src/image.d.ts +1 -0
  52. package/build/src/runner/browser-env/vite/browser-modules/tsconfig.tsbuildinfo +1 -1
  53. package/build/src/runner/suite-monitor.d.ts +1 -1
  54. package/build/src/test-reader/mocha-reader/mocha-event-bus.d.ts +1 -1
  55. package/build/src/testplane.d.ts +1 -1
  56. package/build/src/utils/eight-bit-rgba-to-png.d.ts +1 -0
  57. package/build/src/utils/workers-registry.d.ts +2 -2
  58. package/build/src/ws-connection/constants.d.ts +13 -0
  59. package/build/src/ws-connection/constants.js +17 -0
  60. package/build/src/ws-connection/constants.js.map +1 -0
  61. package/build/src/ws-connection/error.d.ts +51 -0
  62. package/build/src/ws-connection/error.js +81 -0
  63. package/build/src/ws-connection/error.js.map +1 -0
  64. package/build/src/ws-connection/index.d.ts +83 -0
  65. package/build/src/ws-connection/index.js +386 -0
  66. package/build/src/ws-connection/index.js.map +1 -0
  67. package/build/src/ws-connection/utils.d.ts +6 -0
  68. package/build/src/ws-connection/utils.js +9 -0
  69. package/build/src/ws-connection/utils.js.map +1 -0
  70. package/package.json +4 -4
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testplane",
3
- "version": "8.42.5",
3
+ "version": "8.43.0",
4
4
  "description": "Tests framework based on mocha and wdio",
5
5
  "main": "build/src/index.js",
6
6
  "files": [
@@ -72,7 +72,7 @@
72
72
  "@testplane/devtools": "8.32.5",
73
73
  "@testplane/wdio-protocols": "9.4.7",
74
74
  "@testplane/wdio-utils": "9.5.4",
75
- "@testplane/webdriverio": "9.5.24",
75
+ "@testplane/webdriverio": "9.5.25",
76
76
  "@vitest/spy": "2.1.4",
77
77
  "buffer-crc32": "1.0.0",
78
78
  "chalk": "2.4.2",
@@ -125,7 +125,7 @@
125
125
  "@rrweb/record": "2.0.0-alpha.18",
126
126
  "@sinonjs/fake-timers": "10.3.0",
127
127
  "@swc/core": "1.13.3",
128
- "@testplane/wdio-types": "9.5.4",
128
+ "@testplane/wdio-types": "9.5.5",
129
129
  "@types/babel__code-frame": "7.0.6",
130
130
  "@types/browserify": "12.0.40",
131
131
  "@types/chai": "4.3.4",
@@ -139,7 +139,7 @@
139
139
  "@types/lodash": "4.14.191",
140
140
  "@types/micromatch": "4.0.9",
141
141
  "@types/mocha": "10.0.1",
142
- "@types/node": "18.19.3",
142
+ "@types/node": "20.19.39",
143
143
  "@types/proper-lockfile": "4.1.4",
144
144
  "@types/proxyquire": "1.3.28",
145
145
  "@types/set-cookie-parser": "2.4.10",
@@ -109,11 +109,12 @@ class Browser {
109
109
  if (!lodash_1.default.isNull(this._config[optName])) {
110
110
  req = this._config[optName](req);
111
111
  }
112
- if (!req.headers["X-Request-ID"]) {
113
- req.headers["X-Request-ID"] = `${this.state.testXReqId}${browser_1.X_REQUEST_ID_DELIMITER}${crypto_1.default.randomUUID()}`;
112
+ const requestHeaders = req.headers;
113
+ if (!requestHeaders["X-Request-ID"]) {
114
+ requestHeaders["X-Request-ID"] = `${this.state.testXReqId}${browser_1.X_REQUEST_ID_DELIMITER}${crypto_1.default.randomUUID()}`;
114
115
  }
115
- if (!req.headers["traceparent"] && this.state.traceparent) {
116
- req.headers["traceparent"] = this.state.traceparent;
116
+ if (!requestHeaders["traceparent"] && this.state.traceparent) {
117
+ requestHeaders["traceparent"] = this.state.traceparent;
117
118
  }
118
119
  return req;
119
120
  };
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"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"}
@@ -3,50 +3,13 @@ import type { Browser } from "../types";
3
3
  type OnEventMessageFn = (cdpEventMessage: CDPEvent) => unknown;
4
4
  export declare class CDPConnection {
5
5
  onEventMessage: OnEventMessageFn | null;
6
- private readonly _cdpWsEndpoint;
7
- private readonly _headers?;
8
- private _onPong;
9
- private _pingInterval;
10
- private _pingSubsequentFails;
11
- private _onConnectionCloseFn;
12
- private _wsConnectionStatus;
13
- private _wsConnection;
14
- private _wsConnectionPromise;
15
- private _requestId;
16
- private _pendingRequests;
6
+ private readonly _wsConnection;
17
7
  private constructor();
18
8
  /** @description Creates CDPConnection without establishing it */
19
9
  static create(browser: Browser): Promise<CDPConnection>;
20
- /** @description Tries to establish ws connection with timeout */
21
- private _tryToEstablishWsConnection;
22
- /**
23
- * @description creates ws connection with retries or returns existing one
24
- * @note Concurrent requests with same params produce same ws connection
25
- */
26
- private _getWsConnection;
27
- /** @description Handles websocket incoming messages, resolving pending requests */
10
+ close(): void;
28
11
  private _onMessage;
29
- /**
30
- * @description Produces connection-"uniq" request ids
31
- * @note Theoretically, it can collide, but given "CDP_MAX_REQUEST_ID" is INT32_MAX, it wont
32
- */
33
- private _getRequestId;
34
- /** @description establishes ws connection, sends request with timeout and waits for response */
35
- private _tryToSendRequest;
36
12
  /** @description Performs high-level CDP request with retries and timeouts */
37
13
  request<T = void>(method: CDPRequest["method"], { params, sessionId }?: Omit<CDPRequest, "id" | "method">): Promise<T>;
38
- private _closeWsConnection;
39
- /**
40
- * @description Tries to re-establish connection after network drops
41
- * @note Silently gives up after failed "CDP_CONNECTION_RETRIES" attempts
42
- */
43
- private _tryToReconnect;
44
- /** @description Used to abort all pending requests when connection is closed */
45
- private _abortPendingRequests;
46
- /** @description Closes websocket connection, terminating all pending requests */
47
- close(): void;
48
- private _pingHealthCheckStop;
49
- private _isWebSocketActive;
50
- private _pingHealthCheckStart;
51
14
  }
52
15
  export {};
@@ -1,45 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CDPConnection = void 0;
4
- const ws_1 = require("ws");
4
+ const node_util_1 = require("node:util");
5
5
  const debug_1 = require("./debug");
6
6
  const ws_endpoint_1 = require("./ws-endpoint");
7
7
  const utils_1 = require("./utils");
8
8
  const error_1 = require("./error");
9
9
  const constants_1 = require("./constants");
10
- var WsConnectionStatus;
11
- (function (WsConnectionStatus) {
12
- WsConnectionStatus[WsConnectionStatus["DISCONNECTED"] = 0] = "DISCONNECTED";
13
- WsConnectionStatus[WsConnectionStatus["CONNECTING"] = 1] = "CONNECTING";
14
- WsConnectionStatus[WsConnectionStatus["CONNECTED"] = 2] = "CONNECTED";
15
- WsConnectionStatus[WsConnectionStatus["CLOSED"] = 3] = "CLOSED";
16
- })(WsConnectionStatus || (WsConnectionStatus = {}));
17
- // Closing WS when its still not connected produces error:
18
- // https://github.com/websockets/ws/blob/86eac5b44ac2bff9087ec40c9bd06bc7b4f0da07/lib/websocket.js#L297-L301
19
- const closeWsConnection = (ws) => {
20
- if (ws.readyState !== ws.CONNECTING) {
21
- ws.close();
22
- }
23
- else {
24
- ws.once("open", () => {
25
- ws.close();
26
- });
27
- }
28
- };
10
+ const ws_connection_1 = require("../../ws-connection");
11
+ const constants_2 = require("../../ws-connection/constants");
12
+ const error_2 = require("../../ws-connection/error");
13
+ const utils_2 = require("../../ws-connection/utils");
29
14
  class CDPConnection {
30
15
  constructor(cdpWsEndpoint, headers) {
31
16
  this.onEventMessage = null;
32
- this._onPong = null;
33
- this._pingInterval = null;
34
- this._pingSubsequentFails = 0;
35
- this._onConnectionCloseFn = null; // Defined, if there is connection attempt at the moment
36
- this._wsConnectionStatus = WsConnectionStatus.DISCONNECTED;
37
- this._wsConnection = null;
38
- this._wsConnectionPromise = null;
39
- this._requestId = 0;
40
- this._pendingRequests = {};
41
- this._cdpWsEndpoint = cdpWsEndpoint;
42
- this._headers = headers;
17
+ this._wsConnection = new ws_connection_1.WsConnection(cdpWsEndpoint, {
18
+ headers,
19
+ debugFn: debug_1.debugCdp,
20
+ retries: {
21
+ count: constants_1.CDP_CONNECTION_RETRIES,
22
+ baseDelay: constants_1.CDP_CONNECTION_RETRY_BASE_DELAY,
23
+ },
24
+ timeouts: {
25
+ request: constants_1.CDP_REQUEST_TIMEOUT,
26
+ createSession: constants_1.CDP_CONNECTION_TIMEOUT,
27
+ },
28
+ errors: {
29
+ ConnectionEstablishment: error_1.CDPConnectionEstablishmentError,
30
+ ConnectionBreak: error_1.CDPConnectionBreakError,
31
+ ConnectionTerminated: error_1.CDPConnectionTerminatedError,
32
+ ConnectionTimeout: error_1.CDPConnectionTimeoutError,
33
+ RequestTimeout: error_1.CDPRequestError,
34
+ },
35
+ onMessage: this._onMessage.bind(this),
36
+ });
43
37
  }
44
38
  /** @description Creates CDPConnection without establishing it */
45
39
  static async create(browser) {
@@ -51,156 +45,21 @@ class CDPConnection {
51
45
  }
52
46
  return new this(cdpWsEndpoint, headers);
53
47
  }
54
- /** @description Tries to establish ws connection with timeout */
55
- async _tryToEstablishWsConnection(endpoint) {
56
- return new Promise(resolve => {
57
- try {
58
- const onConnectionCloseFn = () => done(new error_1.CDPConnectionTerminatedError());
59
- if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
60
- onConnectionCloseFn();
61
- }
62
- else {
63
- this._onConnectionCloseFn = onConnectionCloseFn;
64
- }
65
- // eslint-disable-next-line
66
- const cdpConnectionInstance = this;
67
- const ws = new ws_1.WebSocket(endpoint, { headers: this._headers });
68
- let isSettled = false;
69
- const timeoutId = setTimeout(() => {
70
- closeWsConnection(ws);
71
- done(new error_1.CDPTimeoutError({
72
- message: `Couldn't establish CDP connection to "${endpoint}" in ${constants_1.CDP_CONNECTION_TIMEOUT}ms`,
73
- }));
74
- }, constants_1.CDP_CONNECTION_TIMEOUT).unref();
75
- const onOpen = () => {
76
- done(ws);
77
- };
78
- const onError = (error) => {
79
- closeWsConnection(ws);
80
- done(new error_1.CDPError({
81
- message: `Couldn't establish CDP connection to "${endpoint}": ${error}`,
82
- }));
83
- };
84
- const onClose = () => {
85
- done(new error_1.CDPError({
86
- message: `CDP connection to "${endpoint}" unexpectedly closed while establishing`,
87
- }));
88
- };
89
- ws.on("open", onOpen);
90
- ws.on("error", onError);
91
- ws.on("close", onClose);
92
- // eslint-disable-next-line no-inner-declarations
93
- function done(result) {
94
- if (isSettled) {
95
- return;
96
- }
97
- cdpConnectionInstance._onConnectionCloseFn = null;
98
- isSettled = true;
99
- clearTimeout(timeoutId);
100
- ws.off("open", onOpen);
101
- ws.off("error", onError);
102
- ws.off("close", onClose);
103
- resolve(result);
104
- }
105
- }
106
- catch (err) {
107
- resolve(err);
108
- }
109
- });
110
- }
111
- /**
112
- * @description creates ws connection with retries or returns existing one
113
- * @note Concurrent requests with same params produce same ws connection
114
- */
115
- async _getWsConnection() {
116
- const ws = this._wsConnection;
117
- if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
118
- throw new error_1.CDPConnectionTerminatedError({ message: `Session to ${this._cdpWsEndpoint} was closed` });
119
- }
120
- if (this._wsConnectionStatus === WsConnectionStatus.CONNECTING && this._wsConnectionPromise) {
121
- return this._wsConnectionPromise;
122
- }
123
- if (this._wsConnectionStatus === WsConnectionStatus.CONNECTED && ws && ws.readyState === ws.OPEN) {
124
- return ws;
125
- }
126
- if (this._wsConnectionStatus === WsConnectionStatus.CONNECTED && ws && ws.readyState !== ws.OPEN) {
127
- this._closeWsConnection("CDP connection was in invalid state", WsConnectionStatus.DISCONNECTED);
128
- }
129
- this._wsConnectionStatus = WsConnectionStatus.CONNECTING;
130
- this._wsConnectionPromise = (async () => {
131
- try {
132
- for (let retriesLeft = constants_1.CDP_CONNECTION_RETRIES; retriesLeft >= 0; retriesLeft--) {
133
- const result = await this._tryToEstablishWsConnection(this._cdpWsEndpoint);
134
- if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
135
- if (result instanceof ws_1.WebSocket) {
136
- closeWsConnection(result);
137
- }
138
- throw new error_1.CDPConnectionTerminatedError();
139
- }
140
- if (result instanceof ws_1.WebSocket) {
141
- (0, debug_1.debugCdp)(`Established CDP connection to ${this._cdpWsEndpoint}`);
142
- this._wsConnection = result;
143
- this._wsConnectionStatus = WsConnectionStatus.CONNECTED;
144
- this._pingHealthCheckStart();
145
- const onPing = () => result.pong();
146
- const onMessage = (data) => this._onMessage(data);
147
- const onError = (err) => {
148
- if (result === this._wsConnection) {
149
- this._closeWsConnection(`An error occured in CDP connection: ${err}`, WsConnectionStatus.DISCONNECTED);
150
- this._tryToReconnect();
151
- }
152
- };
153
- result.on("ping", onPing);
154
- result.on("message", onMessage);
155
- result.on("error", onError);
156
- result.once("close", () => {
157
- result.off("ping", onPing);
158
- result.off("message", onMessage);
159
- result.off("error", onError);
160
- if (result === this._wsConnection) {
161
- this._closeWsConnection("CDP connection was closed unexpectedly", WsConnectionStatus.DISCONNECTED);
162
- this._tryToReconnect();
163
- }
164
- });
165
- return result;
166
- }
167
- if (!(result instanceof error_1.CDPError) || result instanceof error_1.CDPConnectionTerminatedError) {
168
- throw result;
169
- }
170
- (0, debug_1.debugCdp)(`${result.message}; retries left: ${retriesLeft}`);
171
- // Intentionally avoiding wait after timeout
172
- if (result instanceof error_1.CDPError && !(result instanceof error_1.CDPTimeoutError)) {
173
- await (0, utils_1.exponentiallyWait)({
174
- baseDelay: constants_1.CDP_CONNECTION_RETRY_BASE_DELAY,
175
- attempt: constants_1.CDP_CONNECTION_RETRIES - retriesLeft,
176
- });
177
- }
178
- }
179
- throw new error_1.CDPError({
180
- message: `Couldn't establish CDP connection to ${this._cdpWsEndpoint} in ${constants_1.CDP_CONNECTION_RETRIES} retries`,
181
- });
182
- }
183
- catch (err) {
184
- if (this._wsConnectionStatus === WsConnectionStatus.CONNECTING) {
185
- this._wsConnectionStatus = WsConnectionStatus.DISCONNECTED;
186
- this._wsConnectionPromise = null;
187
- }
188
- throw err;
189
- }
190
- finally {
191
- if (this._wsConnectionStatus !== WsConnectionStatus.CONNECTING) {
192
- this._wsConnectionPromise = null;
193
- }
194
- }
195
- })();
196
- return this._wsConnectionPromise;
48
+ close() {
49
+ this._wsConnection.close();
197
50
  }
198
- /** @description Handles websocket incoming messages, resolving pending requests */
199
51
  _onMessage(data) {
200
52
  const message = data.toString("utf8");
201
- (0, debug_1.debugCdp)(`< ${message}`);
202
53
  try {
203
54
  const jsonParsedMessage = JSON.parse(message);
55
+ if (debug_1.debugCdp.enabled) {
56
+ (0, debug_1.debugCdp)(`< ${(0, node_util_1.inspect)(jsonParsedMessage, {
57
+ depth: 3,
58
+ maxStringLength: 150,
59
+ breakLength: Infinity,
60
+ compact: true,
61
+ })}`);
62
+ }
204
63
  if (!("id" in jsonParsedMessage)) {
205
64
  if (this.onEventMessage) {
206
65
  this.onEventMessage(jsonParsedMessage);
@@ -208,218 +67,79 @@ class CDPConnection {
208
67
  return;
209
68
  }
210
69
  const requestId = jsonParsedMessage.id;
211
- if (!this._pendingRequests[requestId]) {
212
- (0, debug_1.debugCdp)(`Received response to request ${requestId}, which is probably timed out already`);
213
- return;
214
- }
215
70
  if ("result" in jsonParsedMessage) {
216
- this._pendingRequests[requestId](jsonParsedMessage.result);
71
+ this._wsConnection.provideResponseFor(requestId, jsonParsedMessage.result);
217
72
  }
218
73
  else if ("error" in jsonParsedMessage) {
219
- this._pendingRequests[requestId](new error_1.CDPError({
74
+ this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
220
75
  message: jsonParsedMessage.error.message,
221
76
  code: jsonParsedMessage.error.code,
222
- requestId: requestId,
77
+ requestId,
223
78
  }));
224
79
  }
225
80
  else {
226
- this._pendingRequests[requestId](new error_1.CDPError({
81
+ this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
227
82
  message: "Received malformed response without result",
228
- code: constants_1.CDP_ERROR_CODE.MALFORMED_RESPONSE,
229
- requestId: requestId,
83
+ code: constants_2.WS_ERROR_CODE.MALFORMED_RESPONSE,
84
+ requestId,
230
85
  }));
231
86
  }
232
87
  }
233
88
  catch (err) {
234
- (0, debug_1.debugCdp)(`Couldn't process CDP message.\n\tError: ${err}\n\tMessage: "${message}"`);
89
+ if (debug_1.debugCdp.enabled) {
90
+ (0, debug_1.debugCdp)(`\u2718 Couldn't process CDP message\n\tError: ${err}\n\tMessage: "${message}"`);
91
+ }
235
92
  const requestId = (0, utils_1.extractRequestIdFromBrokenResponse)(message);
236
- if (requestId && this._pendingRequests[requestId]) {
237
- this._pendingRequests[requestId](new error_1.CDPError({
93
+ if (requestId) {
94
+ this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
238
95
  message: "Received malformed response: response is invalid JSON",
239
- code: constants_1.CDP_ERROR_CODE.MALFORMED_RESPONSE,
240
- requestId: requestId,
96
+ code: constants_2.WS_ERROR_CODE.MALFORMED_RESPONSE,
97
+ requestId,
241
98
  }));
242
99
  }
243
100
  }
244
101
  }
245
- /**
246
- * @description Produces connection-"uniq" request ids
247
- * @note Theoretically, it can collide, but given "CDP_MAX_REQUEST_ID" is INT32_MAX, it wont
248
- */
249
- _getRequestId() {
250
- const id = ++this._requestId;
251
- if (this._requestId >= constants_1.CDP_MAX_REQUEST_ID) {
252
- this._requestId = 0;
253
- }
254
- return id;
255
- }
256
- /** @description establishes ws connection, sends request with timeout and waits for response */
257
- async _tryToSendRequest(method, { params, sessionId }) {
258
- const id = this._getRequestId();
259
- const ws = await this._getWsConnection();
260
- const requestMessage = JSON.stringify({ id, sessionId, method, params });
261
- if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
262
- throw new error_1.CDPConnectionTerminatedError({
263
- message: `Couldn't send "${requestMessage}" because CDP connection was manually closed`,
264
- });
265
- }
266
- (0, debug_1.debugCdp)(`> ${requestMessage}`);
267
- return new Promise(resolve => {
268
- const pendingRequests = this._pendingRequests;
269
- let isSettled = false;
270
- const onTimeout = setTimeout(() => {
271
- const err = new error_1.CDPTimeoutError({
272
- message: `Timed out while waiting for ${method} for ${constants_1.CDP_REQUEST_TIMEOUT}ms`,
273
- requestId: id,
274
- });
275
- done(err);
276
- }, constants_1.CDP_REQUEST_TIMEOUT).unref();
277
- function done(response) {
278
- if (isSettled) {
279
- return;
280
- }
281
- isSettled = true;
282
- delete pendingRequests[id];
283
- clearTimeout(onTimeout);
284
- resolve(response);
285
- }
286
- pendingRequests[id] = done;
287
- ws.send(requestMessage, error => {
288
- if (!error) {
289
- return;
290
- }
291
- done(new error_1.CDPError({
292
- message: `Couldn't send CDP request "${method}": ${error.message}`,
293
- code: constants_1.CDP_ERROR_CODE.SEND_FAILED,
294
- requestId: id,
295
- }));
296
- // Proactively closing connection as "send error" is marker that something bad with connection happened
297
- if (ws === this._wsConnection) {
298
- this._closeWsConnection("CDP connection was considered broken as 'send' failed", WsConnectionStatus.DISCONNECTED);
299
- this._tryToReconnect();
300
- }
301
- });
302
- });
303
- }
304
102
  /** @description Performs high-level CDP request with retries and timeouts */
305
103
  async request(method, { params, sessionId } = {}) {
306
104
  let result;
307
105
  for (let retriesLeft = constants_1.CDP_REQUEST_RETRIES; retriesLeft >= 0; retriesLeft--) {
308
- result = (await this._tryToSendRequest(method, { params, sessionId }));
309
- const noRetriesLeft = retriesLeft <= 0;
310
- const connectionIsClosed = this._wsConnectionStatus === WsConnectionStatus.CLOSED;
311
- if (!(result instanceof error_1.CDPError) || result.isNonRetryable() || noRetriesLeft || connectionIsClosed) {
106
+ const id = this._wsConnection.getRequestId();
107
+ const requestMessage = JSON.stringify({ id, sessionId, method, params });
108
+ if (debug_1.debugCdp.enabled) {
109
+ (0, debug_1.debugCdp)(`> ${(0, node_util_1.inspect)(requestMessage, {
110
+ depth: 3,
111
+ maxStringLength: 150,
112
+ breakLength: Infinity,
113
+ compact: true,
114
+ })}`);
115
+ }
116
+ result = (await this._wsConnection.makeRequest(id, requestMessage));
117
+ if (!(result instanceof error_2.WsError) || !result.isRetryable() || retriesLeft <= 0) {
312
118
  break;
313
119
  }
314
- (0, debug_1.debugCdp)(`${result.message}; retries left: ${retriesLeft}`);
120
+ if (debug_1.debugCdp.enabled) {
121
+ (0, debug_1.debugCdp)(`⟳ ${(0, node_util_1.inspect)({
122
+ id,
123
+ sessionId,
124
+ method,
125
+ params,
126
+ errorMessage: result.message,
127
+ retriesLeft: retriesLeft,
128
+ })}`);
129
+ }
315
130
  // Intentionally avoiding wait after timeout
316
- if (result instanceof error_1.CDPError && !(result instanceof error_1.CDPTimeoutError)) {
317
- await (0, utils_1.exponentiallyWait)({
131
+ if (!(result instanceof error_1.CDPRequestTimeoutError)) {
132
+ await (0, utils_2.exponentiallyWait)({
318
133
  baseDelay: constants_1.CDP_REQUEST_RETRY_BASE_DELAY,
319
134
  attempt: constants_1.CDP_REQUEST_RETRIES - retriesLeft,
320
135
  });
321
136
  }
322
137
  }
323
- if (result instanceof Error) {
138
+ if (result instanceof error_2.WsError) {
324
139
  throw result;
325
140
  }
326
141
  return result;
327
142
  }
328
- _closeWsConnection(sessionAbortMessage, status) {
329
- const ws = this._wsConnection;
330
- if (!ws || this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
331
- this._wsConnection = null;
332
- return;
333
- }
334
- (0, debug_1.debugCdp)(`${sessionAbortMessage}; endpoint: "${this._cdpWsEndpoint}"`);
335
- if (status === WsConnectionStatus.CLOSED && this._onConnectionCloseFn) {
336
- this._onConnectionCloseFn();
337
- }
338
- this._wsConnection = null;
339
- this._wsConnectionStatus = status;
340
- this._abortPendingRequests(`Request was aborted because ${sessionAbortMessage}`);
341
- this._pingHealthCheckStop();
342
- closeWsConnection(ws);
343
- }
344
- /**
345
- * @description Tries to re-establish connection after network drops
346
- * @note Silently gives up after failed "CDP_CONNECTION_RETRIES" attempts
347
- */
348
- _tryToReconnect() {
349
- (0, debug_1.debugCdp)(`Trying to reconnect; endpoint: "${this._cdpWsEndpoint}"`);
350
- this._getWsConnection()
351
- .then(() => (0, debug_1.debugCdp)(`Successfully reconnected to session; endpoint: "${this._cdpWsEndpoint}"`))
352
- .catch(() => (0, debug_1.debugCdp)(`Couldn't reconnect to session automatically; endpoint: "${this._cdpWsEndpoint}"`));
353
- }
354
- /** @description Used to abort all pending requests when connection is closed */
355
- _abortPendingRequests(message) {
356
- const pendingRequests = this._pendingRequests;
357
- const pendingRequestIds = Object.keys(pendingRequests).map(Number);
358
- this._pendingRequests = {};
359
- for (const requestId of pendingRequestIds) {
360
- if (pendingRequests[requestId]) {
361
- pendingRequests[requestId](new error_1.CDPConnectionTerminatedError({
362
- message,
363
- requestId,
364
- }));
365
- }
366
- }
367
- }
368
- /** @description Closes websocket connection, terminating all pending requests */
369
- close() {
370
- this._closeWsConnection("Connection was closed manually", WsConnectionStatus.CLOSED);
371
- }
372
- _pingHealthCheckStop() {
373
- this._pingSubsequentFails = 0;
374
- if (this._pingInterval) {
375
- clearInterval(this._pingInterval);
376
- }
377
- if (this._wsConnection && this._onPong) {
378
- this._wsConnection.off("pong", this._onPong);
379
- }
380
- }
381
- _isWebSocketActive(ws) {
382
- return Boolean(ws.readyState !== ws.CLOSED && ws.readyState !== ws.CLOSING && ws === this._wsConnection);
383
- }
384
- _pingHealthCheckStart() {
385
- this._pingHealthCheckStop();
386
- const ws = this._wsConnection;
387
- if (!ws || !this._isWebSocketActive(ws)) {
388
- return;
389
- }
390
- this._pingHealthCheckStop();
391
- let isWaitingForPong = false;
392
- let pongTimeout;
393
- const onPong = (this._onPong = () => {
394
- if (isWaitingForPong && this._isWebSocketActive(ws)) {
395
- isWaitingForPong = false;
396
- (0, debug_1.debugCdp)("< PONG");
397
- clearTimeout(pongTimeout);
398
- this._pingSubsequentFails = 0;
399
- }
400
- });
401
- ws.on("pong", onPong);
402
- const pingInterval = (this._pingInterval = setInterval(() => {
403
- if (!this._isWebSocketActive(ws)) {
404
- clearInterval(pingInterval);
405
- return;
406
- }
407
- pongTimeout = setTimeout(() => {
408
- if (isWaitingForPong && this._isWebSocketActive(ws)) {
409
- isWaitingForPong = false;
410
- this._pingSubsequentFails++;
411
- (0, debug_1.debugCdp)(`Ping failed(${this._pingSubsequentFails} in a row) in ${constants_1.CDP_PING_TIMEOUT}ms`);
412
- if (this._pingSubsequentFails >= constants_1.CDP_PING_MAX_SUBSEQUENT_FAILS) {
413
- this._closeWsConnection(`CDP connection was considered broken as ${this._pingSubsequentFails} pings failed in a row`, WsConnectionStatus.DISCONNECTED);
414
- this._tryToReconnect();
415
- }
416
- }
417
- }, constants_1.CDP_PING_TIMEOUT).unref();
418
- ws.ping();
419
- (0, debug_1.debugCdp)("> PING");
420
- isWaitingForPong = true;
421
- }, constants_1.CDP_PING_INTERVAL).unref());
422
- }
423
143
  }
424
144
  exports.CDPConnection = CDPConnection;
425
145
  //# sourceMappingURL=connection.js.map