testplane 8.32.0 → 8.32.2
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 +2 -1
- package/build/src/browser/browser.d.ts +5 -0
- package/build/src/browser/browser.js +7 -1
- package/build/src/browser/browser.js.map +1 -1
- package/build/src/browser/cdp/connection.d.ts +52 -0
- package/build/src/browser/cdp/connection.js +413 -0
- package/build/src/browser/cdp/connection.js.map +1 -0
- package/build/src/browser/cdp/constants.d.ts +16 -0
- package/build/src/browser/cdp/constants.js +20 -0
- package/build/src/browser/cdp/constants.js.map +1 -0
- package/build/src/browser/cdp/debug.d.ts +2 -0
- package/build/src/browser/cdp/debug.js +9 -0
- package/build/src/browser/cdp/debug.js.map +1 -0
- package/build/src/browser/cdp/emitter.d.ts +7 -0
- package/build/src/browser/cdp/emitter.js +48 -0
- package/build/src/browser/cdp/emitter.js.map +1 -0
- package/build/src/browser/cdp/error.d.ts +23 -0
- package/build/src/browser/cdp/error.js +41 -0
- package/build/src/browser/cdp/error.js.map +1 -0
- package/build/src/browser/cdp/index.d.ts +13 -0
- package/build/src/browser/cdp/index.js +37 -0
- package/build/src/browser/cdp/index.js.map +1 -0
- package/build/src/browser/cdp/profiler.d.ts +60 -0
- package/build/src/browser/cdp/profiler.js +42 -0
- package/build/src/browser/cdp/profiler.js.map +1 -0
- package/build/src/browser/cdp/target.d.ts +75 -0
- package/build/src/browser/cdp/target.js +51 -0
- package/build/src/browser/cdp/target.js.map +1 -0
- package/build/src/browser/cdp/types.d.ts +124 -0
- package/build/src/browser/cdp/types.js +3 -0
- package/build/src/browser/cdp/types.js.map +1 -0
- package/build/src/browser/cdp/utils.d.ts +7 -0
- package/build/src/browser/cdp/utils.js +23 -0
- package/build/src/browser/cdp/utils.js.map +1 -0
- package/build/src/browser/cdp/ws-endpoint.d.ts +2 -0
- package/build/src/browser/cdp/ws-endpoint.js +70 -0
- package/build/src/browser/cdp/ws-endpoint.js.map +1 -0
- package/build/src/browser/existing-browser.d.ts +4 -0
- package/build/src/browser/existing-browser.js +54 -11
- package/build/src/browser/existing-browser.js.map +1 -1
- package/build/src/browser/history/async-local-storage.d.ts +5 -0
- package/build/src/browser/history/async-local-storage.js +14 -0
- package/build/src/browser/history/async-local-storage.js.map +1 -0
- package/build/src/browser/history/callstack.d.ts +0 -4
- package/build/src/browser/history/callstack.js +0 -8
- package/build/src/browser/history/callstack.js.map +1 -1
- package/build/src/browser/history/index.d.ts +11 -5
- package/build/src/browser/history/index.js +68 -54
- package/build/src/browser/history/index.js.map +1 -1
- package/build/src/browser/history/rrweb.js +1 -3
- package/build/src/browser/history/rrweb.js.map +1 -1
- package/build/src/runner/browser-env/vite/browser-modules/tsconfig.tsbuildinfo +1 -1
- package/build/src/test-reader/index.js +4 -4
- package/build/src/test-reader/index.js.map +1 -1
- package/build/src/test-reader/test-parser.js +4 -1
- package/build/src/test-reader/test-parser.js.map +1 -1
- package/build/src/worker/browser-env/runner/test-runner/index.js +1 -0
- package/build/src/worker/browser-env/runner/test-runner/index.js.map +1 -1
- package/build/src/worker/runner/test-runner/index.js +11 -0
- package/build/src/worker/runner/test-runner/index.js.map +1 -1
- package/package.json +2 -1
package/build/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testplane",
|
|
3
|
-
"version": "8.32.
|
|
3
|
+
"version": "8.32.2",
|
|
4
4
|
"description": "Tests framework based on mocha and wdio",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"files": [
|
|
@@ -114,6 +114,7 @@
|
|
|
114
114
|
"vite": "5.1.6",
|
|
115
115
|
"wait-port": "1.1.0",
|
|
116
116
|
"worker-farm": "1.7.0",
|
|
117
|
+
"ws": "8.18.3",
|
|
117
118
|
"yallist": "3.1.1"
|
|
118
119
|
},
|
|
119
120
|
"devDependencies": {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as history from "./history";
|
|
1
2
|
import { Config } from "../config";
|
|
2
3
|
import { AsyncEmitter } from "../events";
|
|
3
4
|
import { BrowserConfig } from "../config/browser-config";
|
|
@@ -30,6 +31,9 @@ export declare class Browser {
|
|
|
30
31
|
protected _customCommands: Set<CustomCommand>;
|
|
31
32
|
protected _wdPool?: WebdriverPool;
|
|
32
33
|
protected _wdProcess: WdProcess | null;
|
|
34
|
+
/** This Promise is awaited after test is finished. Can be used for cleanup.
|
|
35
|
+
Right now is used to wait for time travel snapshots to finish collecting */
|
|
36
|
+
protected _snapshotsPromiseRef: history.PromiseRef;
|
|
33
37
|
id: string;
|
|
34
38
|
version?: string;
|
|
35
39
|
static create<T extends Browser>(this: new (config: Config, opts: BrowserOpts) => T, config: Config, opts: BrowserOpts): T;
|
|
@@ -51,6 +55,7 @@ export declare class Browser {
|
|
|
51
55
|
get state(): BrowserState;
|
|
52
56
|
get capabilities(): WebdriverIO.Capabilities;
|
|
53
57
|
get callstackHistory(): Callstack;
|
|
58
|
+
get snapshotsPromiseRef(): history.PromiseRef;
|
|
54
59
|
get customCommands(): CustomCommand[];
|
|
55
60
|
get emitter(): AsyncEmitter;
|
|
56
61
|
}
|
|
@@ -58,6 +58,7 @@ class Browser {
|
|
|
58
58
|
this._debug = config.system.debug;
|
|
59
59
|
this._session = null;
|
|
60
60
|
this._callstackHistory = null;
|
|
61
|
+
this._snapshotsPromiseRef = { current: Promise.resolve() };
|
|
61
62
|
this._wdProcess = null;
|
|
62
63
|
this._state = {
|
|
63
64
|
...opts.state,
|
|
@@ -91,7 +92,9 @@ class Browser {
|
|
|
91
92
|
}
|
|
92
93
|
_addHistory() {
|
|
93
94
|
if (this._config.saveHistoryMode !== config_1.SAVE_HISTORY_MODE.NONE) {
|
|
94
|
-
|
|
95
|
+
const initHistoryResult = history.initCommandHistory(this._session, this._config);
|
|
96
|
+
this._callstackHistory = initHistoryResult.callstack;
|
|
97
|
+
this._snapshotsPromiseRef = initHistoryResult.snapshotsPromiseRef;
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
100
|
_addExtendOptionsMethod(session) {
|
|
@@ -153,6 +156,9 @@ class Browser {
|
|
|
153
156
|
get callstackHistory() {
|
|
154
157
|
return this._callstackHistory;
|
|
155
158
|
}
|
|
159
|
+
get snapshotsPromiseRef() {
|
|
160
|
+
return this._snapshotsPromiseRef;
|
|
161
|
+
}
|
|
156
162
|
get customCommands() {
|
|
157
163
|
const allCustomCommands = Array.from(this._customCommands);
|
|
158
164
|
return lodash_1.default.uniqWith(allCustomCommands, lodash_1.default.isEqual);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA4B;AAE5B,oDAAuB;AAEvB,gDAAwD;AACxD,kDAA8D;AAC9D,mDAAqC;AACrC,6CAAkD;AAClD,iDAA4E;AAC5E,iEAAmD;AAOnD,MAAM,mBAAmB,GAAG;IACxB,WAAW;IACX,OAAO;IACP,SAAS;IACT,kBAAkB;IAClB,mBAAmB;IACnB,WAAW;IACX,qBAAqB;IACrB,MAAM;IACN,KAAK;IACL,QAAQ;CACX,CAAC;AAmBF,MAAa,OAAO;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { CDPEvent, CDPRequest } from "./types";
|
|
2
|
+
import type { Browser } from "../types";
|
|
3
|
+
type OnEventMessageFn = (cdpEventMessage: CDPEvent) => unknown;
|
|
4
|
+
export declare class CDPConnection {
|
|
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;
|
|
17
|
+
private constructor();
|
|
18
|
+
/** @description Creates CDPConnection without establishing it */
|
|
19
|
+
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 */
|
|
28
|
+
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
|
+
/** @description Performs high-level CDP request with retries and timeouts */
|
|
37
|
+
request<T>(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
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CDPConnection = void 0;
|
|
4
|
+
const ws_1 = require("ws");
|
|
5
|
+
const debug_1 = require("./debug");
|
|
6
|
+
const ws_endpoint_1 = require("./ws-endpoint");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
const error_1 = require("./error");
|
|
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
|
+
class CDPConnection {
|
|
18
|
+
constructor(cdpWsEndpoint, headers) {
|
|
19
|
+
this.onEventMessage = null;
|
|
20
|
+
this._onPong = null;
|
|
21
|
+
this._pingInterval = null;
|
|
22
|
+
this._pingSubsequentFails = 0;
|
|
23
|
+
this._onConnectionCloseFn = null; // Defined, if there is connection attempt at the moment
|
|
24
|
+
this._wsConnectionStatus = WsConnectionStatus.DISCONNECTED;
|
|
25
|
+
this._wsConnection = null;
|
|
26
|
+
this._wsConnectionPromise = null;
|
|
27
|
+
this._requestId = 0;
|
|
28
|
+
this._pendingRequests = {};
|
|
29
|
+
this._cdpWsEndpoint = cdpWsEndpoint;
|
|
30
|
+
this._headers = headers;
|
|
31
|
+
}
|
|
32
|
+
/** @description Creates CDPConnection without establishing it */
|
|
33
|
+
static async create(browser) {
|
|
34
|
+
const sessionId = browser.publicAPI.sessionId;
|
|
35
|
+
const cdpWsEndpoint = await (0, ws_endpoint_1.getWsEndpoint)(browser);
|
|
36
|
+
const headers = browser.publicAPI.options.headers;
|
|
37
|
+
if (!cdpWsEndpoint) {
|
|
38
|
+
throw new error_1.CDPError({ message: `Couldn't determine CDP endpoint for session ${sessionId}` });
|
|
39
|
+
}
|
|
40
|
+
return new this(cdpWsEndpoint, headers);
|
|
41
|
+
}
|
|
42
|
+
/** @description Tries to establish ws connection with timeout */
|
|
43
|
+
async _tryToEstablishWsConnection(endpoint) {
|
|
44
|
+
return new Promise(resolve => {
|
|
45
|
+
try {
|
|
46
|
+
const onConnectionCloseFn = () => done(new error_1.CDPConnectionTerminatedError());
|
|
47
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
|
|
48
|
+
onConnectionCloseFn();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this._onConnectionCloseFn = onConnectionCloseFn;
|
|
52
|
+
}
|
|
53
|
+
// eslint-disable-next-line
|
|
54
|
+
const cdpConnectionInstance = this;
|
|
55
|
+
const ws = new ws_1.WebSocket(endpoint, { headers: this._headers });
|
|
56
|
+
let isSettled = false;
|
|
57
|
+
const timeoutId = setTimeout(() => {
|
|
58
|
+
ws.close();
|
|
59
|
+
done(new error_1.CDPTimeoutError({
|
|
60
|
+
message: `Couldn't establish CDP connection to "${endpoint}" in ${constants_1.CDP_CONNECTION_TIMEOUT}ms`,
|
|
61
|
+
}));
|
|
62
|
+
}, constants_1.CDP_CONNECTION_TIMEOUT).unref();
|
|
63
|
+
const onOpen = () => {
|
|
64
|
+
done(ws);
|
|
65
|
+
};
|
|
66
|
+
const onError = (error) => {
|
|
67
|
+
ws.close();
|
|
68
|
+
done(new error_1.CDPError({
|
|
69
|
+
message: `Couldn't establish CDP connection to "${endpoint}": ${error}`,
|
|
70
|
+
}));
|
|
71
|
+
};
|
|
72
|
+
const onClose = () => {
|
|
73
|
+
done(new error_1.CDPError({
|
|
74
|
+
message: `CDP connection to "${endpoint}" unexpectedly closed while establishing`,
|
|
75
|
+
}));
|
|
76
|
+
};
|
|
77
|
+
ws.on("open", onOpen);
|
|
78
|
+
ws.on("error", onError);
|
|
79
|
+
ws.on("close", onClose);
|
|
80
|
+
// eslint-disable-next-line no-inner-declarations
|
|
81
|
+
function done(result) {
|
|
82
|
+
if (isSettled) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
cdpConnectionInstance._onConnectionCloseFn = null;
|
|
86
|
+
isSettled = true;
|
|
87
|
+
clearTimeout(timeoutId);
|
|
88
|
+
ws.off("open", onOpen);
|
|
89
|
+
ws.off("error", onError);
|
|
90
|
+
ws.off("close", onClose);
|
|
91
|
+
resolve(result);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
resolve(err);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* @description creates ws connection with retries or returns existing one
|
|
101
|
+
* @note Concurrent requests with same params produce same ws connection
|
|
102
|
+
*/
|
|
103
|
+
async _getWsConnection() {
|
|
104
|
+
const ws = this._wsConnection;
|
|
105
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
|
|
106
|
+
throw new error_1.CDPConnectionTerminatedError({ message: `Session to ${this._cdpWsEndpoint} was closed` });
|
|
107
|
+
}
|
|
108
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CONNECTING && this._wsConnectionPromise) {
|
|
109
|
+
return this._wsConnectionPromise;
|
|
110
|
+
}
|
|
111
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CONNECTED && ws && ws.readyState === ws.OPEN) {
|
|
112
|
+
return ws;
|
|
113
|
+
}
|
|
114
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CONNECTED && ws && ws.readyState !== ws.OPEN) {
|
|
115
|
+
this._closeWsConnection("CDP connection was in invalid state", WsConnectionStatus.DISCONNECTED);
|
|
116
|
+
}
|
|
117
|
+
this._wsConnectionStatus = WsConnectionStatus.CONNECTING;
|
|
118
|
+
this._wsConnectionPromise = (async () => {
|
|
119
|
+
try {
|
|
120
|
+
for (let retriesLeft = constants_1.CDP_CONNECTION_RETRIES; retriesLeft >= 0; retriesLeft--) {
|
|
121
|
+
const result = await this._tryToEstablishWsConnection(this._cdpWsEndpoint);
|
|
122
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
|
|
123
|
+
if (result instanceof ws_1.WebSocket) {
|
|
124
|
+
result.close();
|
|
125
|
+
}
|
|
126
|
+
throw new error_1.CDPConnectionTerminatedError();
|
|
127
|
+
}
|
|
128
|
+
if (result instanceof ws_1.WebSocket) {
|
|
129
|
+
(0, debug_1.debugCdp)(`Established CDP connection to ${this._cdpWsEndpoint}`);
|
|
130
|
+
this._wsConnection = result;
|
|
131
|
+
this._wsConnectionStatus = WsConnectionStatus.CONNECTED;
|
|
132
|
+
this._pingHealthCheckStart();
|
|
133
|
+
const onPing = () => result.pong();
|
|
134
|
+
const _onMessage = (data) => this._onMessage(data);
|
|
135
|
+
const onError = (err) => {
|
|
136
|
+
if (result === this._wsConnection) {
|
|
137
|
+
this._closeWsConnection(`An error occured in CDP connection: ${err}`, WsConnectionStatus.DISCONNECTED);
|
|
138
|
+
this._tryToReconnect();
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
result.on("ping", onPing);
|
|
142
|
+
result.on("message", _onMessage);
|
|
143
|
+
result.on("error", onError);
|
|
144
|
+
result.once("close", () => {
|
|
145
|
+
result.off("ping", onPing);
|
|
146
|
+
result.off("message", _onMessage);
|
|
147
|
+
result.off("error", onError);
|
|
148
|
+
if (result === this._wsConnection) {
|
|
149
|
+
this._closeWsConnection("CDP connection was closed unexpectedly", WsConnectionStatus.DISCONNECTED);
|
|
150
|
+
this._tryToReconnect();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
if (!(result instanceof error_1.CDPError) || result instanceof error_1.CDPConnectionTerminatedError) {
|
|
156
|
+
throw result;
|
|
157
|
+
}
|
|
158
|
+
(0, debug_1.debugCdp)(`${result.message}; retries left: ${retriesLeft}`);
|
|
159
|
+
// Intentionally avoiding wait after timeout
|
|
160
|
+
if (result instanceof error_1.CDPError && !(result instanceof error_1.CDPTimeoutError)) {
|
|
161
|
+
await (0, utils_1.exponentiallyWait)({
|
|
162
|
+
baseDelay: constants_1.CDP_CONNECTION_RETRY_BASE_DELAY,
|
|
163
|
+
attempt: constants_1.CDP_CONNECTION_RETRIES - retriesLeft,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
throw new error_1.CDPError({
|
|
168
|
+
message: `Couldn't establish CDP connection to ${this._cdpWsEndpoint} in ${constants_1.CDP_CONNECTION_RETRIES} retries`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CONNECTING) {
|
|
173
|
+
this._wsConnectionStatus = WsConnectionStatus.DISCONNECTED;
|
|
174
|
+
this._wsConnectionPromise = null;
|
|
175
|
+
}
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
if (this._wsConnectionStatus !== WsConnectionStatus.CONNECTING) {
|
|
180
|
+
this._wsConnectionPromise = null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
})();
|
|
184
|
+
return this._wsConnectionPromise;
|
|
185
|
+
}
|
|
186
|
+
/** @description Handles websocket incoming messages, resolving pending requests */
|
|
187
|
+
_onMessage(data) {
|
|
188
|
+
const message = data.toString("utf8");
|
|
189
|
+
(0, debug_1.debugCdp)(`< ${message}`);
|
|
190
|
+
try {
|
|
191
|
+
const jsonParsedMessage = JSON.parse(message);
|
|
192
|
+
if (!("id" in jsonParsedMessage)) {
|
|
193
|
+
if (this.onEventMessage) {
|
|
194
|
+
this.onEventMessage(jsonParsedMessage);
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const requestId = jsonParsedMessage.id;
|
|
199
|
+
if (!this._pendingRequests[requestId]) {
|
|
200
|
+
(0, debug_1.debugCdp)(`Received response to request ${requestId}, which is probably timed out already`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if ("result" in jsonParsedMessage) {
|
|
204
|
+
this._pendingRequests[requestId](jsonParsedMessage.result);
|
|
205
|
+
}
|
|
206
|
+
else if ("error" in jsonParsedMessage) {
|
|
207
|
+
this._pendingRequests[requestId](new error_1.CDPError({
|
|
208
|
+
message: jsonParsedMessage.error.message,
|
|
209
|
+
code: jsonParsedMessage.error.code,
|
|
210
|
+
requestId: requestId,
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
this._pendingRequests[requestId](new error_1.CDPError({
|
|
215
|
+
message: "Received malformed response without result",
|
|
216
|
+
code: constants_1.CDP_ERROR_CODE.MALFORMED_RESPONSE,
|
|
217
|
+
requestId: requestId,
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
(0, debug_1.debugCdp)(`Couldn't process CDP message.\n\tError: ${err}\n\tMessage: "${message}"`);
|
|
223
|
+
const requestId = (0, utils_1.extractRequestIdFromBrokenResponse)(message);
|
|
224
|
+
if (requestId && this._pendingRequests[requestId]) {
|
|
225
|
+
this._pendingRequests[requestId](new error_1.CDPError({
|
|
226
|
+
message: "Received malformed response: response is invalid JSON",
|
|
227
|
+
code: constants_1.CDP_ERROR_CODE.MALFORMED_RESPONSE,
|
|
228
|
+
requestId: requestId,
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* @description Produces connection-"uniq" request ids
|
|
235
|
+
* @note Theoretically, it can collide, but given "CDP_MAX_REQUEST_ID" is INT32_MAX, it wont
|
|
236
|
+
*/
|
|
237
|
+
_getRequestId() {
|
|
238
|
+
const id = ++this._requestId;
|
|
239
|
+
if (this._requestId >= constants_1.CDP_MAX_REQUEST_ID) {
|
|
240
|
+
this._requestId = 0;
|
|
241
|
+
}
|
|
242
|
+
return id;
|
|
243
|
+
}
|
|
244
|
+
/** @description establishes ws connection, sends request with timeout and waits for response */
|
|
245
|
+
async _tryToSendRequest(method, { params, sessionId }) {
|
|
246
|
+
const id = this._getRequestId();
|
|
247
|
+
const ws = await this._getWsConnection();
|
|
248
|
+
const requestMessage = JSON.stringify({ id, sessionId, method, params });
|
|
249
|
+
if (this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
|
|
250
|
+
throw new error_1.CDPConnectionTerminatedError({
|
|
251
|
+
message: `Couldn't send "${requestMessage}" because CDP connection was manually closed`,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
(0, debug_1.debugCdp)(`> ${requestMessage}`);
|
|
255
|
+
return new Promise(resolve => {
|
|
256
|
+
const pendingRequests = this._pendingRequests;
|
|
257
|
+
let isSettled = false;
|
|
258
|
+
const onTimeout = setTimeout(() => {
|
|
259
|
+
const err = new error_1.CDPTimeoutError({
|
|
260
|
+
message: `Timed out while waiting for ${method} for ${constants_1.CDP_REQUEST_TIMEOUT}ms`,
|
|
261
|
+
requestId: id,
|
|
262
|
+
});
|
|
263
|
+
done(err);
|
|
264
|
+
}, constants_1.CDP_REQUEST_TIMEOUT).unref();
|
|
265
|
+
function done(response) {
|
|
266
|
+
if (isSettled) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
isSettled = true;
|
|
270
|
+
delete pendingRequests[id];
|
|
271
|
+
clearTimeout(onTimeout);
|
|
272
|
+
resolve(response);
|
|
273
|
+
}
|
|
274
|
+
pendingRequests[id] = done;
|
|
275
|
+
ws.send(requestMessage, error => {
|
|
276
|
+
if (!error) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
done(new error_1.CDPError({
|
|
280
|
+
message: `Couldn't send CDP request "${method}": ${error.message}`,
|
|
281
|
+
code: constants_1.CDP_ERROR_CODE.SEND_FAILED,
|
|
282
|
+
requestId: id,
|
|
283
|
+
}));
|
|
284
|
+
// Proactively closing connection as "send error" is marker that something bad with connection happened
|
|
285
|
+
if (ws === this._wsConnection) {
|
|
286
|
+
this._closeWsConnection("CDP connection was considered broken as 'send' failed", WsConnectionStatus.DISCONNECTED);
|
|
287
|
+
this._tryToReconnect();
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/** @description Performs high-level CDP request with retries and timeouts */
|
|
293
|
+
async request(method, { params, sessionId } = {}) {
|
|
294
|
+
let result;
|
|
295
|
+
for (let retriesLeft = constants_1.CDP_REQUEST_RETRIES; retriesLeft >= 0; retriesLeft--) {
|
|
296
|
+
result = (await this._tryToSendRequest(method, { params, sessionId }));
|
|
297
|
+
const noRetriesLeft = retriesLeft <= 0;
|
|
298
|
+
const connectionIsClosed = this._wsConnectionStatus === WsConnectionStatus.CLOSED;
|
|
299
|
+
if (!(result instanceof error_1.CDPError) || result.isNonRetryable() || noRetriesLeft || connectionIsClosed) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
(0, debug_1.debugCdp)(`${result.message}; retries left: ${retriesLeft}`);
|
|
303
|
+
// Intentionally avoiding wait after timeout
|
|
304
|
+
if (result instanceof error_1.CDPError && !(result instanceof error_1.CDPTimeoutError)) {
|
|
305
|
+
await (0, utils_1.exponentiallyWait)({
|
|
306
|
+
baseDelay: constants_1.CDP_REQUEST_RETRY_BASE_DELAY,
|
|
307
|
+
attempt: constants_1.CDP_REQUEST_RETRIES - retriesLeft,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (result instanceof Error) {
|
|
312
|
+
throw result;
|
|
313
|
+
}
|
|
314
|
+
return result;
|
|
315
|
+
}
|
|
316
|
+
_closeWsConnection(sessionAbortMessage, status) {
|
|
317
|
+
const ws = this._wsConnection;
|
|
318
|
+
if (!ws || this._wsConnectionStatus === WsConnectionStatus.CLOSED) {
|
|
319
|
+
this._wsConnection = null;
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
(0, debug_1.debugCdp)(`${sessionAbortMessage}; endpoint: "${this._cdpWsEndpoint}"`);
|
|
323
|
+
if (status === WsConnectionStatus.CLOSED && this._onConnectionCloseFn) {
|
|
324
|
+
this._onConnectionCloseFn();
|
|
325
|
+
}
|
|
326
|
+
this._wsConnection = null;
|
|
327
|
+
this._wsConnectionStatus = status;
|
|
328
|
+
this._abortPendingRequests(`Request was aborted because ${sessionAbortMessage}`);
|
|
329
|
+
this._pingHealthCheckStop();
|
|
330
|
+
ws.close();
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* @description Tries to re-establish connection after network drops
|
|
334
|
+
* @note Silently gives up after failed "CDP_CONNECTION_RETRIES" attempts
|
|
335
|
+
*/
|
|
336
|
+
_tryToReconnect() {
|
|
337
|
+
(0, debug_1.debugCdp)(`Trying to reconnect; endpoint: "${this._cdpWsEndpoint}"`);
|
|
338
|
+
this._getWsConnection()
|
|
339
|
+
.then(() => (0, debug_1.debugCdp)(`Successfully reconnected to session; endpoint: "${this._cdpWsEndpoint}"`))
|
|
340
|
+
.catch(() => (0, debug_1.debugCdp)(`Couldn't reconnect to session automatically; endpoint: "${this._cdpWsEndpoint}"`));
|
|
341
|
+
}
|
|
342
|
+
/** @description Used to abort all pending requests when connection is closed */
|
|
343
|
+
_abortPendingRequests(message) {
|
|
344
|
+
const pendingRequests = this._pendingRequests;
|
|
345
|
+
const pendingRequestIds = Object.keys(pendingRequests).map(Number);
|
|
346
|
+
this._pendingRequests = {};
|
|
347
|
+
for (const requestId of pendingRequestIds) {
|
|
348
|
+
if (pendingRequests[requestId]) {
|
|
349
|
+
pendingRequests[requestId](new error_1.CDPConnectionTerminatedError({
|
|
350
|
+
message,
|
|
351
|
+
requestId,
|
|
352
|
+
}));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/** @description Closes websocket connection, terminating all pending requests */
|
|
357
|
+
close() {
|
|
358
|
+
this._closeWsConnection("Connection was closed manually", WsConnectionStatus.CLOSED);
|
|
359
|
+
}
|
|
360
|
+
_pingHealthCheckStop() {
|
|
361
|
+
this._pingSubsequentFails = 0;
|
|
362
|
+
if (this._pingInterval) {
|
|
363
|
+
clearInterval(this._pingInterval);
|
|
364
|
+
}
|
|
365
|
+
if (this._wsConnection && this._onPong) {
|
|
366
|
+
this._wsConnection.off("pong", this._onPong);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
_isWebSocketActive(ws) {
|
|
370
|
+
return Boolean(ws.readyState !== ws.CLOSED && ws.readyState !== ws.CLOSING && ws === this._wsConnection);
|
|
371
|
+
}
|
|
372
|
+
_pingHealthCheckStart() {
|
|
373
|
+
this._pingHealthCheckStop();
|
|
374
|
+
const ws = this._wsConnection;
|
|
375
|
+
if (!ws || !this._isWebSocketActive(ws)) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
this._pingHealthCheckStop();
|
|
379
|
+
let isWaitingForPong = false;
|
|
380
|
+
let pongTimeout;
|
|
381
|
+
const onPong = (this._onPong = () => {
|
|
382
|
+
if (isWaitingForPong && this._isWebSocketActive(ws)) {
|
|
383
|
+
isWaitingForPong = false;
|
|
384
|
+
(0, debug_1.debugCdp)("< PONG");
|
|
385
|
+
clearTimeout(pongTimeout);
|
|
386
|
+
this._pingSubsequentFails = 0;
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
ws.on("pong", onPong);
|
|
390
|
+
const pingInterval = (this._pingInterval = setInterval(() => {
|
|
391
|
+
if (!this._isWebSocketActive(ws)) {
|
|
392
|
+
clearInterval(pingInterval);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
pongTimeout = setTimeout(() => {
|
|
396
|
+
if (isWaitingForPong && this._isWebSocketActive(ws)) {
|
|
397
|
+
isWaitingForPong = false;
|
|
398
|
+
this._pingSubsequentFails++;
|
|
399
|
+
(0, debug_1.debugCdp)(`Ping failed(${this._pingSubsequentFails} in a row) in ${constants_1.CDP_PING_TIMEOUT}ms`);
|
|
400
|
+
if (this._pingSubsequentFails >= constants_1.CDP_PING_MAX_SUBSEQUENT_FAILS) {
|
|
401
|
+
this._closeWsConnection(`CDP connection was considered broken as ${this._pingSubsequentFails} pings failed in a row`, WsConnectionStatus.DISCONNECTED);
|
|
402
|
+
this._tryToReconnect();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}, constants_1.CDP_PING_TIMEOUT).unref();
|
|
406
|
+
ws.ping();
|
|
407
|
+
(0, debug_1.debugCdp)("> PING");
|
|
408
|
+
isWaitingForPong = true;
|
|
409
|
+
}, constants_1.CDP_PING_INTERVAL).unref());
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
exports.CDPConnection = CDPConnection;
|
|
413
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../src/browser/cdp/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const CDP_CONNECTION_TIMEOUT = 15000;
|
|
2
|
+
export declare const CDP_CONNECTION_RETRIES = 3;
|
|
3
|
+
export declare const CDP_CONNECTION_RETRY_BASE_DELAY = 500;
|
|
4
|
+
export declare const CDP_REQUEST_TIMEOUT = 15000;
|
|
5
|
+
export declare const CDP_REQUEST_RETRIES = 3;
|
|
6
|
+
export declare const CDP_REQUEST_RETRY_BASE_DELAY = 500;
|
|
7
|
+
export declare const CDP_MAX_REQUEST_ID = 2147483647;
|
|
8
|
+
export declare const CDP_PING_INTERVAL = 15000;
|
|
9
|
+
export declare const CDP_PING_TIMEOUT = 10000;
|
|
10
|
+
export declare const CDP_PING_MAX_SUBSEQUENT_FAILS = 2;
|
|
11
|
+
export declare const CDP_ERROR_CODE: {
|
|
12
|
+
readonly MALFORMED_RESPONSE: -32810;
|
|
13
|
+
readonly SEND_FAILED: -32820;
|
|
14
|
+
readonly TIMEOUT: -32830;
|
|
15
|
+
readonly CONNECTION_TERMINATED: -32840;
|
|
16
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CDP_ERROR_CODE = exports.CDP_PING_MAX_SUBSEQUENT_FAILS = exports.CDP_PING_TIMEOUT = exports.CDP_PING_INTERVAL = exports.CDP_MAX_REQUEST_ID = exports.CDP_REQUEST_RETRY_BASE_DELAY = exports.CDP_REQUEST_RETRIES = exports.CDP_REQUEST_TIMEOUT = exports.CDP_CONNECTION_RETRY_BASE_DELAY = exports.CDP_CONNECTION_RETRIES = exports.CDP_CONNECTION_TIMEOUT = void 0;
|
|
4
|
+
exports.CDP_CONNECTION_TIMEOUT = 15000; // 15 sec
|
|
5
|
+
exports.CDP_CONNECTION_RETRIES = 3;
|
|
6
|
+
exports.CDP_CONNECTION_RETRY_BASE_DELAY = 500;
|
|
7
|
+
exports.CDP_REQUEST_TIMEOUT = 15000; // 15 sec
|
|
8
|
+
exports.CDP_REQUEST_RETRIES = 3;
|
|
9
|
+
exports.CDP_REQUEST_RETRY_BASE_DELAY = 500;
|
|
10
|
+
exports.CDP_MAX_REQUEST_ID = 2147483647; // INT32_MAX
|
|
11
|
+
exports.CDP_PING_INTERVAL = 15000; // 15 sec
|
|
12
|
+
exports.CDP_PING_TIMEOUT = 10000; // 10 sec
|
|
13
|
+
exports.CDP_PING_MAX_SUBSEQUENT_FAILS = 2;
|
|
14
|
+
exports.CDP_ERROR_CODE = {
|
|
15
|
+
MALFORMED_RESPONSE: -32810, // Custom error code
|
|
16
|
+
SEND_FAILED: -32820, // Custom error code
|
|
17
|
+
TIMEOUT: -32830, // Custom error code
|
|
18
|
+
CONNECTION_TERMINATED: -32840, // Custom error code
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/browser/cdp/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,KAAK,CAAC,CAAC,SAAS;AACzC,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,+BAA+B,GAAG,GAAG,CAAC;AACtC,QAAA,mBAAmB,GAAG,KAAK,CAAC,CAAC,SAAS;AACtC,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,4BAA4B,GAAG,GAAG,CAAC;AACnC,QAAA,kBAAkB,GAAG,UAAU,CAAC,CAAC,YAAY;AAC7C,QAAA,iBAAiB,GAAG,KAAK,CAAC,CAAC,SAAS;AACpC,QAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,SAAS;AACnC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,cAAc,GAAG;IAC1B,kBAAkB,EAAE,CAAC,KAAK,EAAE,oBAAoB;IAChD,WAAW,EAAE,CAAC,KAAK,EAAE,oBAAoB;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB;IACrC,qBAAqB,EAAE,CAAC,KAAK,EAAE,oBAAoB;CAC7C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.debugCdp = void 0;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
exports.debugCdp = (0, debug_1.default)("testplane:cdp");
|
|
9
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/browser/cdp/debug.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAgC;AAEnB,QAAA,QAAQ,GAAG,IAAA,eAAW,EAAC,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EventEmitter } from "events";
|
|
3
|
+
export declare class CDPEventEmitter<Events extends {
|
|
4
|
+
[key in keyof Events]: unknown;
|
|
5
|
+
}> extends EventEmitter {
|
|
6
|
+
on<U extends string & keyof Events>(event: U, listener: (params: Events[U]) => void | Promise<void>): this;
|
|
7
|
+
}
|