testplane 8.42.6 → 8.44.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/build/package.json +4 -4
- package/build/src/browser/browser.js +5 -4
- package/build/src/browser/browser.js.map +1 -1
- package/build/src/browser/cdp/connection.d.ts +2 -39
- package/build/src/browser/cdp/connection.js +73 -353
- package/build/src/browser/cdp/connection.js.map +1 -1
- package/build/src/browser/cdp/constants.d.ts +0 -10
- package/build/src/browser/cdp/constants.js +1 -11
- package/build/src/browser/cdp/constants.js.map +1 -1
- package/build/src/browser/cdp/error.d.ts +14 -20
- package/build/src/browser/cdp/error.js +29 -32
- package/build/src/browser/cdp/error.js.map +1 -1
- package/build/src/browser/cdp/selectivity/css-selectivity.d.ts +6 -4
- package/build/src/browser/cdp/selectivity/css-selectivity.js +13 -2
- package/build/src/browser/cdp/selectivity/css-selectivity.js.map +1 -1
- package/build/src/browser/cdp/selectivity/hash-reader.js +7 -3
- package/build/src/browser/cdp/selectivity/hash-reader.js.map +1 -1
- package/build/src/browser/cdp/selectivity/hash-writer.d.ts +1 -1
- package/build/src/browser/cdp/selectivity/hash-writer.js +6 -11
- package/build/src/browser/cdp/selectivity/hash-writer.js.map +1 -1
- package/build/src/browser/cdp/selectivity/index.d.ts +6 -3
- package/build/src/browser/cdp/selectivity/index.js +22 -14
- package/build/src/browser/cdp/selectivity/index.js.map +1 -1
- package/build/src/browser/cdp/selectivity/js-selectivity.d.ts +8 -6
- package/build/src/browser/cdp/selectivity/js-selectivity.js +79 -42
- package/build/src/browser/cdp/selectivity/js-selectivity.js.map +1 -1
- package/build/src/browser/cdp/selectivity/merge-dumps/merge-tests.js +1 -0
- package/build/src/browser/cdp/selectivity/merge-dumps/merge-tests.js.map +1 -1
- package/build/src/browser/cdp/selectivity/runner.js +11 -1
- package/build/src/browser/cdp/selectivity/runner.js.map +1 -1
- package/build/src/browser/cdp/selectivity/test-dependencies-reader.js +1 -1
- package/build/src/browser/cdp/selectivity/test-dependencies-reader.js.map +1 -1
- package/build/src/browser/cdp/selectivity/test-dependencies-writer.js +1 -1
- package/build/src/browser/cdp/selectivity/test-dependencies-writer.js.map +1 -1
- package/build/src/browser/cdp/selectivity/testplane-selectivity.d.ts +3 -1
- package/build/src/browser/cdp/selectivity/testplane-selectivity.js +18 -5
- package/build/src/browser/cdp/selectivity/testplane-selectivity.js.map +1 -1
- package/build/src/browser/cdp/selectivity/types.d.ts +2 -0
- package/build/src/browser/cdp/selectivity/types.js.map +1 -1
- package/build/src/browser/cdp/selectivity/utils.d.ts +8 -3
- package/build/src/browser/cdp/selectivity/utils.js +41 -11
- package/build/src/browser/cdp/selectivity/utils.js.map +1 -1
- package/build/src/browser/cdp/utils.d.ts +0 -6
- package/build/src/browser/cdp/utils.js +1 -6
- package/build/src/browser/cdp/utils.js.map +1 -1
- package/build/src/browser/commands/assert-view/errors/image-diff-error.d.ts +1 -0
- package/build/src/browser/commands/assert-view/index.js +6 -1
- package/build/src/browser/commands/assert-view/index.js.map +1 -1
- package/build/src/browser/existing-browser.d.ts +2 -0
- package/build/src/browser/existing-browser.js +15 -0
- package/build/src/browser/existing-browser.js.map +1 -1
- package/build/src/browser/wsdriver/compression.d.ts +5 -0
- package/build/src/browser/wsdriver/compression.js +79 -0
- package/build/src/browser/wsdriver/compression.js.map +1 -0
- package/build/src/browser/wsdriver/constants.d.ts +11 -0
- package/build/src/browser/wsdriver/constants.js +15 -0
- package/build/src/browser/wsdriver/constants.js.map +1 -0
- package/build/src/browser/wsdriver/debug.d.ts +2 -0
- package/build/src/browser/wsdriver/debug.js +9 -0
- package/build/src/browser/wsdriver/debug.js.map +1 -0
- package/build/src/browser/wsdriver/error.d.ts +18 -0
- package/build/src/browser/wsdriver/error.js +36 -0
- package/build/src/browser/wsdriver/error.js.map +1 -0
- package/build/src/browser/wsdriver/index.d.ts +23 -0
- package/build/src/browser/wsdriver/index.js +261 -0
- package/build/src/browser/wsdriver/index.js.map +1 -0
- package/build/src/browser/wsdriver/request.d.ts +10 -0
- package/build/src/browser/wsdriver/request.js +58 -0
- package/build/src/browser/wsdriver/request.js.map +1 -0
- package/build/src/browser/wsdriver/response.d.ts +3 -0
- package/build/src/browser/wsdriver/response.js +111 -0
- package/build/src/browser/wsdriver/response.js.map +1 -0
- package/build/src/browser/wsdriver/types.d.ts +71 -0
- package/build/src/browser/wsdriver/types.js +27 -0
- package/build/src/browser/wsdriver/types.js.map +1 -0
- package/build/src/config/browser-options.js +1 -0
- package/build/src/config/browser-options.js.map +1 -1
- package/build/src/config/defaults.d.ts +3 -0
- package/build/src/config/defaults.js +3 -0
- package/build/src/config/defaults.js.map +1 -1
- package/build/src/config/types.d.ts +18 -3
- package/build/src/constants/png.d.ts +1 -0
- package/build/src/image.d.ts +2 -0
- package/build/src/image.js +21 -1
- package/build/src/image.js.map +1 -1
- package/build/src/runner/browser-env/vite/browser-modules/tsconfig.tsbuildinfo +1 -1
- package/build/src/runner/suite-monitor.d.ts +1 -1
- package/build/src/test-reader/mocha-reader/mocha-event-bus.d.ts +1 -1
- package/build/src/test-reader/test-parser.js +1 -1
- package/build/src/test-reader/test-parser.js.map +1 -1
- package/build/src/testplane.js +3 -3
- package/build/src/testplane.js.map +1 -1
- package/build/src/utils/eight-bit-rgba-to-png.d.ts +1 -0
- package/build/src/utils/workers-registry.d.ts +2 -2
- package/build/src/worker/runner/test-runner/one-time-screenshooter.js +2 -3
- package/build/src/worker/runner/test-runner/one-time-screenshooter.js.map +1 -1
- package/build/src/ws-connection/constants.d.ts +13 -0
- package/build/src/ws-connection/constants.js +17 -0
- package/build/src/ws-connection/constants.js.map +1 -0
- package/build/src/ws-connection/error.d.ts +51 -0
- package/build/src/ws-connection/error.js +81 -0
- package/build/src/ws-connection/error.js.map +1 -0
- package/build/src/ws-connection/index.d.ts +83 -0
- package/build/src/ws-connection/index.js +386 -0
- package/build/src/ws-connection/index.js.map +1 -0
- package/build/src/ws-connection/utils.d.ts +6 -0
- package/build/src/ws-connection/utils.js +9 -0
- package/build/src/ws-connection/utils.js.map +1 -0
- package/package.json +4 -4
package/build/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testplane",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.44.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.
|
|
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.
|
|
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": "
|
|
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
|
-
|
|
113
|
-
|
|
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 (!
|
|
116
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
55
|
-
|
|
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.
|
|
71
|
+
this._wsConnection.provideResponseFor(requestId, jsonParsedMessage.result);
|
|
217
72
|
}
|
|
218
73
|
else if ("error" in jsonParsedMessage) {
|
|
219
|
-
this.
|
|
74
|
+
this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
|
|
220
75
|
message: jsonParsedMessage.error.message,
|
|
221
76
|
code: jsonParsedMessage.error.code,
|
|
222
|
-
requestId
|
|
77
|
+
requestId,
|
|
223
78
|
}));
|
|
224
79
|
}
|
|
225
80
|
else {
|
|
226
|
-
this.
|
|
81
|
+
this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
|
|
227
82
|
message: "Received malformed response without result",
|
|
228
|
-
code:
|
|
229
|
-
requestId
|
|
83
|
+
code: constants_2.WS_ERROR_CODE.MALFORMED_RESPONSE,
|
|
84
|
+
requestId,
|
|
230
85
|
}));
|
|
231
86
|
}
|
|
232
87
|
}
|
|
233
88
|
catch (err) {
|
|
234
|
-
(
|
|
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
|
|
237
|
-
this.
|
|
93
|
+
if (requestId) {
|
|
94
|
+
this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
|
|
238
95
|
message: "Received malformed response: response is invalid JSON",
|
|
239
|
-
code:
|
|
240
|
-
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
|
-
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
(
|
|
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 (
|
|
317
|
-
await (0,
|
|
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
|
|
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
|