UNPKG

testplane

Version:

Tests framework based on mocha and wdio

145 lines 6.24 kB
"use strict"; 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