testplane
Version:
Tests framework based on mocha and wdio
145 lines • 6.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CDPConnection = void 0;
const node_util_1 = require("node:util");
const debug_1 = require("./debug");
const ws_endpoint_1 = require("./ws-endpoint");
const utils_1 = require("./utils");
const error_1 = require("./error");
const constants_1 = require("./constants");
const ws_connection_1 = require("../../ws-connection");
const constants_2 = require("../../ws-connection/constants");
const error_2 = require("../../ws-connection/error");
const utils_2 = require("../../ws-connection/utils");
class CDPConnection {
constructor(cdpWsEndpoint, headers) {
this.onEventMessage = null;
this._wsConnection = new ws_connection_1.WsConnection(cdpWsEndpoint, {
headers,
debugFn: debug_1.debugCdp,
retries: {
count: constants_1.CDP_CONNECTION_RETRIES,
baseDelay: constants_1.CDP_CONNECTION_RETRY_BASE_DELAY,
},
timeouts: {
request: constants_1.CDP_REQUEST_TIMEOUT,
createSession: constants_1.CDP_CONNECTION_TIMEOUT,
},
errors: {
ConnectionEstablishment: error_1.CDPConnectionEstablishmentError,
ConnectionBreak: error_1.CDPConnectionBreakError,
ConnectionTerminated: error_1.CDPConnectionTerminatedError,
ConnectionTimeout: error_1.CDPConnectionTimeoutError,
RequestTimeout: error_1.CDPRequestError,
},
onMessage: this._onMessage.bind(this),
});
}
/** @description Creates CDPConnection without establishing it */
static async create(browser) {
const sessionId = browser.publicAPI.sessionId;
const cdpWsEndpoint = await (0, ws_endpoint_1.getWsEndpoint)(browser);
const headers = browser.publicAPI.options?.headers ?? {};
if (!cdpWsEndpoint) {
throw new error_1.CDPError({ message: `Couldn't determine CDP endpoint for session ${sessionId}` });
}
return new this(cdpWsEndpoint, headers);
}
close() {
this._wsConnection.close();
}
_onMessage(data) {
const message = data.toString("utf8");
try {
const jsonParsedMessage = JSON.parse(message);
if (debug_1.debugCdp.enabled) {
(0, debug_1.debugCdp)(`< ${(0, node_util_1.inspect)(jsonParsedMessage, {
depth: 3,
maxStringLength: 150,
breakLength: Infinity,
compact: true,
})}`);
}
if (!("id" in jsonParsedMessage)) {
if (this.onEventMessage) {
this.onEventMessage(jsonParsedMessage);
}
return;
}
const requestId = jsonParsedMessage.id;
if ("result" in jsonParsedMessage) {
this._wsConnection.provideResponseFor(requestId, jsonParsedMessage.result);
}
else if ("error" in jsonParsedMessage) {
this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
message: jsonParsedMessage.error.message,
code: jsonParsedMessage.error.code,
requestId,
}));
}
else {
this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
message: "Received malformed response without result",
code: constants_2.WS_ERROR_CODE.MALFORMED_RESPONSE,
requestId,
}));
}
}
catch (err) {
if (debug_1.debugCdp.enabled) {
(0, debug_1.debugCdp)(`\u2718 Couldn't process CDP message\n\tError: ${err}\n\tMessage: "${message}"`);
}
const requestId = (0, utils_1.extractRequestIdFromBrokenResponse)(message);
if (requestId) {
this._wsConnection.provideResponseFor(requestId, new error_1.CDPRequestError({
message: "Received malformed response: response is invalid JSON",
code: constants_2.WS_ERROR_CODE.MALFORMED_RESPONSE,
requestId,
}));
}
}
}
/** @description Performs high-level CDP request with retries and timeouts */
async request(method, { params, sessionId } = {}) {
let result;
for (let retriesLeft = constants_1.CDP_REQUEST_RETRIES; retriesLeft >= 0; retriesLeft--) {
const id = this._wsConnection.getRequestId();
const requestMessage = JSON.stringify({ id, sessionId, method, params });
if (debug_1.debugCdp.enabled) {
(0, debug_1.debugCdp)(`> ${(0, node_util_1.inspect)(requestMessage, {
depth: 3,
maxStringLength: 150,
breakLength: Infinity,
compact: true,
})}`);
}
result = (await this._wsConnection.makeRequest(id, requestMessage));
if (!(result instanceof error_2.WsError) || !result.isRetryable() || retriesLeft <= 0) {
break;
}
if (debug_1.debugCdp.enabled) {
(0, debug_1.debugCdp)(`⟳ ${(0, node_util_1.inspect)({
id,
sessionId,
method,
params,
errorMessage: result.message,
retriesLeft: retriesLeft,
})}`);
}
// Intentionally avoiding wait after timeout
if (!(result instanceof error_1.CDPRequestTimeoutError)) {
await (0, utils_2.exponentiallyWait)({
baseDelay: constants_1.CDP_REQUEST_RETRY_BASE_DELAY,
attempt: constants_1.CDP_REQUEST_RETRIES - retriesLeft,
});
}
}
if (result instanceof error_2.WsError) {
throw result;
}
return result;
}
}
exports.CDPConnection = CDPConnection;
//# sourceMappingURL=connection.js.map