testplane 8.42.6 → 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 (69) 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/utils/eight-bit-rgba-to-png.d.ts +1 -0
  56. package/build/src/utils/workers-registry.d.ts +2 -2
  57. package/build/src/ws-connection/constants.d.ts +13 -0
  58. package/build/src/ws-connection/constants.js +17 -0
  59. package/build/src/ws-connection/constants.js.map +1 -0
  60. package/build/src/ws-connection/error.d.ts +51 -0
  61. package/build/src/ws-connection/error.js +81 -0
  62. package/build/src/ws-connection/error.js.map +1 -0
  63. package/build/src/ws-connection/index.d.ts +83 -0
  64. package/build/src/ws-connection/index.js +386 -0
  65. package/build/src/ws-connection/index.js.map +1 -0
  66. package/build/src/ws-connection/utils.d.ts +6 -0
  67. package/build/src/ws-connection/utils.js +9 -0
  68. package/build/src/ws-connection/utils.js.map +1 -0
  69. package/package.json +4 -4
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.WSDriverRequestAgent = void 0;
27
+ const http_1 = require("http");
28
+ const node_util_1 = require("node:util");
29
+ const debug_1 = require("./debug");
30
+ const error_1 = require("./error");
31
+ const constants_1 = require("./constants");
32
+ const types_1 = require("./types");
33
+ const logger = __importStar(require("../../utils/logger"));
34
+ const ws_connection_1 = require("../../ws-connection");
35
+ const constants_2 = require("../../ws-connection/constants");
36
+ const error_2 = require("../../ws-connection/error");
37
+ const response_1 = require("./response");
38
+ const request_1 = require("./request");
39
+ const utils_1 = require("../../ws-connection/utils");
40
+ class WSDriverRequestAgent {
41
+ constructor(wsdWsEndpoint, { sessionId, headers, requestTimeout, clientSupportedCompressionTypes }) {
42
+ headers ||= {};
43
+ headers[constants_1.WSD_ACCEPT_ENCODING_HEADER] = clientSupportedCompressionTypes.join(", ");
44
+ this._wsConnection = new ws_connection_1.WsConnection(wsdWsEndpoint, {
45
+ headers,
46
+ debugFn: debug_1.debugWSDriver,
47
+ retries: {
48
+ count: constants_1.WSD_CONNECTION_RETRIES,
49
+ baseDelay: constants_1.WSD_CONNECTION_RETRY_BASE_DELAY,
50
+ },
51
+ timeouts: {
52
+ request: requestTimeout,
53
+ createSession: constants_1.WSD_CONNECTION_TIMEOUT,
54
+ },
55
+ errors: {
56
+ ConnectionEstablishment: error_1.WSDriverRequestAgentEstablishmentError,
57
+ ConnectionBreak: error_1.WSDriverRequestAgentBreakError,
58
+ ConnectionTerminated: error_1.WSDriverRequestAgentTerminatedError,
59
+ ConnectionTimeout: error_1.WSDriverRequestAgentTimeoutError,
60
+ RequestTimeout: error_1.WSDriverRequestTimeoutError,
61
+ },
62
+ onMessage: this._onMessage.bind(this),
63
+ });
64
+ this._clientSupportedCompressionTypes = clientSupportedCompressionTypes;
65
+ this._sessionId = sessionId;
66
+ this._sessionPrefix = `/session/${sessionId}/`;
67
+ }
68
+ /** @description Creates WSDriverRequestAgent without establishing it */
69
+ static create({ sessionId, sessionCaps, headers = {}, browserConfig, }) {
70
+ if (!sessionCaps["se:wsdriver"]) {
71
+ throw new error_1.WSDriverError({ message: "Couldn't determine wsdriver endpoint" });
72
+ }
73
+ if (!sessionCaps["se:wsdriverVersion"]) {
74
+ throw new error_1.WSDriverError({ message: "Couldn't determine wsdriver supported versions" });
75
+ }
76
+ const wsdriverEndpoint = sessionCaps["se:wsdriver"];
77
+ const wsdriverSupportedVersions = sessionCaps["se:wsdriverVersion"].split(", ").map(Number).filter(Boolean);
78
+ const requestTimeout = browserConfig.httpTimeout;
79
+ const supportedVersions = wsdriverSupportedVersions.reduce((acc, val) => {
80
+ acc[val] = true;
81
+ return acc;
82
+ }, {});
83
+ const clientSupportedCompressionTypes = ["zstd" in process.versions ? "zstd" : null, "gzip"].filter(Boolean);
84
+ return new this(wsdriverEndpoint, {
85
+ sessionId,
86
+ headers,
87
+ requestTimeout,
88
+ clientSupportedCompressionTypes,
89
+ supportedVersions,
90
+ });
91
+ }
92
+ close() {
93
+ this._wsConnection.close();
94
+ }
95
+ async _onMessage(data, isBinary) {
96
+ if (!isBinary) {
97
+ this._wsConnection.forceReconnect(`Unsupported data type: Expected binary, received text: ${(0, node_util_1.inspect)(data)}`);
98
+ return;
99
+ }
100
+ const incomingMessage = await (0, response_1.parseWsDriverIncomingMessage)(data).catch((err) => err);
101
+ if (!incomingMessage) {
102
+ // Valid, but unsupported
103
+ return;
104
+ }
105
+ if (incomingMessage instanceof Error) {
106
+ // Invalid message
107
+ this._wsConnection.forceReconnect(incomingMessage.message);
108
+ return;
109
+ }
110
+ const message = incomingMessage;
111
+ if (debug_1.debugWSDriver.enabled) {
112
+ const header = message.rawBody.readUint8(1);
113
+ (0, debug_1.debugWSDriver)(`< ${(0, node_util_1.inspect)({
114
+ sessionId: this._sessionId,
115
+ requestId: message.requestId,
116
+ header: header.toString(2).padStart(8, "0"),
117
+ statusCode: message.statusCode,
118
+ body: message.body,
119
+ }, {
120
+ depth: 3,
121
+ maxStringLength: 150,
122
+ breakLength: Infinity,
123
+ compact: true,
124
+ })}`);
125
+ }
126
+ if (message.isProtocolError) {
127
+ logger.error("wsdriver: Protocol error occured while parsing message:", message);
128
+ this._wsConnection.provideResponseFor(message.requestId, new error_1.WSDriverRequestError({
129
+ message: "Protocol error: " + (0, node_util_1.inspect)(message.body),
130
+ requestId: message.requestId,
131
+ code: constants_2.WS_ERROR_CODE.PROTOCOL_ERROR,
132
+ }));
133
+ this._wsConnection.forceReconnect("Protocol error: " + (0, node_util_1.inspect)(message.body));
134
+ return;
135
+ }
136
+ if (message.body instanceof Error) {
137
+ logger.error("wsdriver: Malformed response:", message.body);
138
+ this._wsConnection.provideResponseFor(message.requestId, new error_1.WSDriverRequestError({
139
+ message: message.body.message,
140
+ requestId: message.requestId,
141
+ code: constants_2.WS_ERROR_CODE.MALFORMED_RESPONSE,
142
+ }));
143
+ }
144
+ this._wsConnection.provideResponseFor(message.requestId, message);
145
+ }
146
+ async _getRequestCompressionType() {
147
+ if (typeof this._serverSupportedCompressionType !== "undefined") {
148
+ return this._serverSupportedCompressionType;
149
+ }
150
+ const { responseHeaders } = await this._getConnectionProperties();
151
+ if (!responseHeaders || !responseHeaders[constants_1.WSD_ACCEPT_ENCODING_HEADER]) {
152
+ return (this._serverSupportedCompressionType = types_1.WsDriverCompression.None);
153
+ }
154
+ const serverAcceptEncodingHeaders = responseHeaders[constants_1.WSD_ACCEPT_ENCODING_HEADER].concat(", ");
155
+ const serverAcceptEncodings = serverAcceptEncodingHeaders.split(", ");
156
+ for (const clientSupportedEncoding of this._clientSupportedCompressionTypes) {
157
+ if (serverAcceptEncodings.includes(clientSupportedEncoding)) {
158
+ if (clientSupportedEncoding === "zstd") {
159
+ return (this._serverSupportedCompressionType = types_1.WsDriverCompression.ZSTD);
160
+ }
161
+ else if (clientSupportedEncoding === "gzip") {
162
+ return (this._serverSupportedCompressionType = types_1.WsDriverCompression.GZIP);
163
+ }
164
+ }
165
+ }
166
+ return (this._serverSupportedCompressionType = types_1.WsDriverCompression.None);
167
+ }
168
+ _getConnectionProperties() {
169
+ return this._wsConnection.getConnectionProperties();
170
+ }
171
+ /** @description Performs high-level WSDriver request with timeout */
172
+ async request(url, options) {
173
+ let requestId;
174
+ let result;
175
+ for (let retriesLeft = constants_1.WSD_REQUEST_RETRIES; retriesLeft >= 0; retriesLeft--) {
176
+ requestId = this._wsConnection.getRequestId();
177
+ const requestMessage = await (0, request_1.constructWsDriverRequest)(url, options, {
178
+ requestId,
179
+ sessionPrefix: this._sessionPrefix,
180
+ compressionType: await this._getRequestCompressionType(),
181
+ });
182
+ if (debug_1.debugWSDriver.enabled) {
183
+ const header = requestMessage.readUint8(1);
184
+ const commandEndIdx = requestMessage.indexOf(0, 8);
185
+ const command = requestMessage.subarray(8, commandEndIdx).toString();
186
+ (0, debug_1.debugWSDriver)(`> ${(0, node_util_1.inspect)({
187
+ sessionId: this._sessionId,
188
+ requestId,
189
+ header: header.toString(2).padStart(8, "0"),
190
+ method: options.method,
191
+ command,
192
+ body: options.json,
193
+ }, {
194
+ depth: 3,
195
+ maxStringLength: 150,
196
+ breakLength: Infinity,
197
+ compact: true,
198
+ })}`);
199
+ }
200
+ result = (await this._wsConnection.makeRequest(requestId, requestMessage).catch((err) => err));
201
+ if (result instanceof error_1.WSDriverRequestTimeoutError) {
202
+ const requestError = new Error(result.message);
203
+ requestError.stack = result.stack;
204
+ // error code should be "ETIMEDOUT" for webdriver to be able to retry
205
+ requestError.code = "ETIMEDOUT";
206
+ throw requestError;
207
+ }
208
+ if (!(result instanceof error_2.WsError) || !result.isRetryable() || retriesLeft <= 0) {
209
+ break;
210
+ }
211
+ if (debug_1.debugWSDriver.enabled) {
212
+ const header = requestMessage.readUint8(1);
213
+ const commandEndIdx = requestMessage.indexOf(0, 8);
214
+ const command = requestMessage.subarray(8, commandEndIdx).toString();
215
+ (0, debug_1.debugWSDriver)(`⟳ ${(0, node_util_1.inspect)({
216
+ sessionId: this._sessionId,
217
+ requestId,
218
+ header: header.toString(2).padStart(8, "0"),
219
+ method: options.method,
220
+ command,
221
+ body: options.json,
222
+ errorMessage: result.message,
223
+ retriesLeft: retriesLeft,
224
+ })}`);
225
+ }
226
+ await (0, utils_1.exponentiallyWait)({
227
+ baseDelay: constants_1.WSD_REQUEST_RETRY_BASE_DELAY,
228
+ attempt: constants_1.WSD_REQUEST_RETRIES - retriesLeft,
229
+ });
230
+ }
231
+ if (result instanceof error_2.WsError) {
232
+ throw result;
233
+ }
234
+ const response = {
235
+ url: url.toString(),
236
+ method: options.method,
237
+ requestId,
238
+ statusCode: result.statusCode,
239
+ statusMessage: http_1.STATUS_CODES[result.statusCode],
240
+ req: {
241
+ id: requestId,
242
+ method: options.method,
243
+ path: options.path,
244
+ host: url.host,
245
+ },
246
+ request: {
247
+ id: requestId,
248
+ options,
249
+ requestUrl: url,
250
+ },
251
+ ok: result.statusCode >= 200 && result.statusCode < 300,
252
+ rawBody: result.rawBody,
253
+ body: result.body,
254
+ };
255
+ response.req.res = response;
256
+ response.request.response = response;
257
+ return response;
258
+ }
259
+ }
260
+ exports.WSDriverRequestAgent = WSDriverRequestAgent;
261
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/browser/wsdriver/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { RequestWsDriverOptions, WsDriverCompressionType } from "./types";
4
+ interface ConnectionOptions {
5
+ requestId: number;
6
+ sessionPrefix: string;
7
+ compressionType: WsDriverCompressionType;
8
+ }
9
+ export declare const constructWsDriverRequest: (url: URL, requestOptions: RequestWsDriverOptions, connectionOptions: ConnectionOptions) => Promise<Buffer>;
10
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.constructWsDriverRequest = void 0;
4
+ /* eslint-disable no-bitwise */
5
+ const types_1 = require("./types");
6
+ const constants_1 = require("./constants");
7
+ const compression_1 = require("./compression");
8
+ const WSDRIVER_VERSION = 1;
9
+ // version, header, requestId, requestMethod, command null-terminator
10
+ const OUTGOING_MESSAGE_AUXILIARY_BYTES = 1 + 1 + 4 + 2 + 1;
11
+ const constructHeaderByte = (compressionType, isJson) => {
12
+ let headerByte = 0;
13
+ headerByte |= types_1.WsDriverMessage.Request << 4;
14
+ headerByte |= compressionType << 2;
15
+ headerByte |= +isJson << 1;
16
+ return headerByte;
17
+ };
18
+ const getRequestMethod = (method) => {
19
+ if (!method) {
20
+ return types_1.WsDriverMethod.get;
21
+ }
22
+ const methodLowerCase = method.toLowerCase();
23
+ const encodedMethodType = types_1.WsDriverMethod[methodLowerCase];
24
+ if (typeof encodedMethodType !== "undefined") {
25
+ return encodedMethodType;
26
+ }
27
+ throw new Error(`Unsupported method: "${method}"`);
28
+ };
29
+ const constructWsDriverRequest = async (url, requestOptions, connectionOptions) => {
30
+ const commandStartIdx = url.pathname.indexOf(connectionOptions.sessionPrefix);
31
+ if (commandStartIdx === -1) {
32
+ throw new Error("Not session-related request");
33
+ }
34
+ const command = url.pathname.slice(commandStartIdx + connectionOptions.sessionPrefix.length);
35
+ const bodyPayload = requestOptions.json ? Buffer.from(JSON.stringify(requestOptions.json)) : Buffer.alloc(0);
36
+ const shouldCompress = connectionOptions.compressionType !== types_1.WsDriverCompression.None &&
37
+ Buffer.byteLength(bodyPayload) >= constants_1.WSD_COMPRESSION_THRESHOLD_BYTES;
38
+ const compressedPayload = shouldCompress
39
+ ? await (0, compression_1.getCompressed)(bodyPayload, connectionOptions.compressionType)
40
+ : bodyPayload;
41
+ const headerByte = constructHeaderByte(shouldCompress ? connectionOptions.compressionType : types_1.WsDriverCompression.None, true);
42
+ const requestMethod = getRequestMethod(requestOptions.method);
43
+ const resultMessage = Buffer.alloc(OUTGOING_MESSAGE_AUXILIARY_BYTES + Buffer.byteLength(command) + Buffer.byteLength(compressedPayload));
44
+ let ptr = 0;
45
+ ptr = resultMessage.writeUInt8(WSDRIVER_VERSION);
46
+ ptr = resultMessage.writeUint8(headerByte, ptr);
47
+ ptr = resultMessage.writeUint32BE(connectionOptions.requestId, ptr);
48
+ ptr = resultMessage.writeUint16BE(requestMethod, ptr);
49
+ ptr += resultMessage.write(command, ptr, "utf8");
50
+ ptr = resultMessage.writeUint8(0, ptr);
51
+ ptr += compressedPayload.copy(resultMessage, ptr);
52
+ if (ptr !== resultMessage.byteLength) {
53
+ throw new Error("WSDriver request message construction failed");
54
+ }
55
+ return resultMessage;
56
+ };
57
+ exports.constructWsDriverRequest = constructWsDriverRequest;
58
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../../src/browser/wsdriver/request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { RawData } from "ws";
2
+ import { IncomingWsDriverMessage } from "./types";
3
+ export declare const parseWsDriverIncomingMessage: (incomingMessage: RawData) => Promise<null | Error | IncomingWsDriverMessage>;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.parseWsDriverIncomingMessage = void 0;
27
+ /* eslint-disable no-bitwise */
28
+ const util_1 = require("util");
29
+ const types_1 = require("./types");
30
+ const logger = __importStar(require("../../utils/logger"));
31
+ const compression_1 = require("./compression");
32
+ const debug_1 = require("./debug");
33
+ const WSDRIVER_VERSION = 1;
34
+ // version, header, requestId, responseStatus, command null-terminator
35
+ const MIN_INCOMING_MESSAGE_LENGTH_BYTES = 1 + 1 + 4 + 2 + 1;
36
+ const rawDataToBuffer = (rawData) => {
37
+ if (rawData instanceof Buffer) {
38
+ return rawData;
39
+ }
40
+ if (Array.isArray(rawData)) {
41
+ return Buffer.concat(rawData);
42
+ }
43
+ return Buffer.from(rawData);
44
+ };
45
+ // https://github.com/gemini-testing/selenoid/blob/master/wsdriver/ws_req.go#L78-L85
46
+ const parseWsDriverIncomingMessage = async (incomingMessage) => {
47
+ const data = rawDataToBuffer(incomingMessage);
48
+ if (data.length < MIN_INCOMING_MESSAGE_LENGTH_BYTES) {
49
+ return new Error(`Invalid incoming message "${(0, util_1.inspect)(incomingMessage)}": too short`);
50
+ }
51
+ const messageVersion = data.readUInt8(0);
52
+ if (messageVersion !== WSDRIVER_VERSION) {
53
+ logger.warn(`wsdriver: Unexpected message version. Expected '${WSDRIVER_VERSION}', got '${messageVersion}'`);
54
+ return null;
55
+ }
56
+ const messageHeaders = data.readUInt8(1);
57
+ const messageType = (messageHeaders >> 4);
58
+ const compressionType = ((messageHeaders >> 2) & 0b11);
59
+ const isJson = Boolean((messageHeaders >> 1) & 0b1);
60
+ const isProtocolError = Boolean(messageHeaders & 0b1);
61
+ if (messageType !== types_1.WsDriverMessage.Response) {
62
+ logger.warn(`wsdriver: Unexpected message type. Expected '${types_1.WsDriverMessage.Response}', got '${messageType}'`);
63
+ return null;
64
+ }
65
+ const requestId = data.readUInt32BE(2);
66
+ const statusCode = data.readUInt16BE(6);
67
+ const requestPathEnd = data.indexOf(0, 8);
68
+ if (requestPathEnd === -1) {
69
+ return new Error(`Invalid incoming message with id ${requestId}: absent null-terminator for requestPath`);
70
+ }
71
+ const requestPath = data.toString("utf8", 8, requestPathEnd);
72
+ const rawBody = data.subarray(requestPathEnd + 1);
73
+ let body;
74
+ try {
75
+ const decompressedBody = rawBody.byteLength
76
+ ? await (0, compression_1.getDecompressed)(rawBody, compressionType).catch(err => err)
77
+ : null;
78
+ if (!rawBody.byteLength || !decompressedBody) {
79
+ body = rawBody.toString("utf8");
80
+ }
81
+ else if (decompressedBody instanceof Error) {
82
+ body = decompressedBody;
83
+ }
84
+ else if (isJson) {
85
+ try {
86
+ body = JSON.parse(decompressedBody.toString("utf8"));
87
+ }
88
+ catch (cause) {
89
+ (0, debug_1.debugWSDriver)("Couldn't parse incoming JSON payload: %O", cause);
90
+ body = decompressedBody.toString("utf8");
91
+ }
92
+ }
93
+ else {
94
+ body = decompressedBody.toString("utf8");
95
+ }
96
+ }
97
+ catch (err) {
98
+ body = err;
99
+ }
100
+ return {
101
+ requestId,
102
+ statusCode,
103
+ isJson,
104
+ isProtocolError,
105
+ requestPath,
106
+ body,
107
+ rawBody,
108
+ };
109
+ };
110
+ exports.parseWsDriverIncomingMessage = parseWsDriverIncomingMessage;
111
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../../src/browser/wsdriver/response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ export declare const WsDriverMessage: {
4
+ readonly Request: 0;
5
+ readonly Response: 1;
6
+ };
7
+ export type WsDriverMessageType = (typeof WsDriverMessage)[keyof typeof WsDriverMessage];
8
+ export declare const WsDriverCompression: {
9
+ readonly None: 0;
10
+ readonly GZIP: 1;
11
+ readonly ZSTD: 2;
12
+ };
13
+ export type WsDriverCompressionType = (typeof WsDriverCompression)[keyof typeof WsDriverCompression];
14
+ export declare const WsDriverMethod: {
15
+ readonly get: 0;
16
+ readonly head: 1;
17
+ readonly post: 2;
18
+ readonly put: 3;
19
+ readonly delete: 4;
20
+ readonly connect: 5;
21
+ readonly options: 6;
22
+ readonly trace: 7;
23
+ readonly patch: 8;
24
+ };
25
+ export type WsDriverMethodType = (typeof WsDriverMethod)[keyof typeof WsDriverMethod];
26
+ export type WsDriverRequestMethodString = "get" | "head" | "post" | "put" | "delete" | "options" | "trace" | "patch" | "GET" | "POST" | "PUT" | "PATCH" | "HEAD" | "DELETE" | "OPTIONS" | "TRACE";
27
+ interface IncomingWsDriverGeneralMessage {
28
+ requestId: number;
29
+ statusCode: number;
30
+ isProtocolError: boolean;
31
+ requestPath: string;
32
+ rawBody: Buffer;
33
+ }
34
+ interface IncomingWsDriverJsonMessage extends IncomingWsDriverGeneralMessage {
35
+ isJson: true;
36
+ body: Error | Record<string, unknown>;
37
+ }
38
+ interface IncomingWsDriverStringMessage extends IncomingWsDriverGeneralMessage {
39
+ isJson: false;
40
+ body: Error | string;
41
+ }
42
+ export type IncomingWsDriverMessage = IncomingWsDriverJsonMessage | IncomingWsDriverStringMessage;
43
+ export interface RequestWsDriverOptions {
44
+ path?: string;
45
+ method?: WsDriverRequestMethodString;
46
+ json?: Record<string, unknown>;
47
+ }
48
+ export interface RequestWsDriverResponse {
49
+ url: string;
50
+ method: string;
51
+ requestId: number;
52
+ statusCode: number;
53
+ statusMessage: string;
54
+ req: {
55
+ id: number;
56
+ method: string;
57
+ path: string;
58
+ host: string;
59
+ res: RequestWsDriverResponse;
60
+ };
61
+ request: {
62
+ id: number;
63
+ options: RequestWsDriverOptions;
64
+ requestUrl: URL;
65
+ response: RequestWsDriverResponse;
66
+ };
67
+ ok: boolean;
68
+ rawBody: Buffer;
69
+ body: unknown;
70
+ }
71
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WsDriverMethod = exports.WsDriverCompression = exports.WsDriverMessage = void 0;
4
+ // https://github.com/gemini-testing/selenoid/blob/master/wsdriver/ws_req.go#L11-L16
5
+ exports.WsDriverMessage = {
6
+ Request: 0,
7
+ Response: 1,
8
+ };
9
+ // https://github.com/gemini-testing/selenoid/blob/master/wsdriver/ws_req.go#L18-L24
10
+ exports.WsDriverCompression = {
11
+ None: 0,
12
+ GZIP: 1,
13
+ ZSTD: 2,
14
+ };
15
+ // https://github.com/gemini-testing/selenoid/blob/master/wsdriver/ws_req.go#L33-L60
16
+ exports.WsDriverMethod = {
17
+ get: 0,
18
+ head: 1,
19
+ post: 2,
20
+ put: 3,
21
+ delete: 4,
22
+ connect: 5,
23
+ options: 6,
24
+ trace: 7,
25
+ patch: 8,
26
+ };
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/browser/wsdriver/types.ts"],"names":[],"mappings":";;;AAAA,oFAAoF;AACvE,QAAA,eAAe,GAAG;IAC3B,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;CACL,CAAC;AAIX,oFAAoF;AACvE,QAAA,mBAAmB,GAAG;IAC/B,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;CACD,CAAC;AAIX,oFAAoF;AACvE,QAAA,cAAc,GAAG;IAC1B,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;CACF,CAAC"}
@@ -323,6 +323,7 @@ function buildBrowserOptions(defaultFactory, extra) {
323
323
  },
324
324
  }),
325
325
  passive: options.boolean("passive"),
326
+ useWsDriver: options.boolean("useWsDriver"),
326
327
  timeTravel: option({
327
328
  defaultValue: defaultFactory("timeTravel"),
328
329
  parseEnv: JSON.parse,