testplane
Version:
Tests framework based on mocha and wdio
111 lines • 4.41 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseWsDriverIncomingMessage = void 0;
/* eslint-disable no-bitwise */
const util_1 = require("util");
const types_1 = require("./types");
const logger = __importStar(require("../../utils/logger"));
const compression_1 = require("./compression");
const debug_1 = require("./debug");
const WSDRIVER_VERSION = 1;
// version, header, requestId, responseStatus, command null-terminator
const MIN_INCOMING_MESSAGE_LENGTH_BYTES = 1 + 1 + 4 + 2 + 1;
const rawDataToBuffer = (rawData) => {
if (rawData instanceof Buffer) {
return rawData;
}
if (Array.isArray(rawData)) {
return Buffer.concat(rawData);
}
return Buffer.from(rawData);
};
// https://github.com/gemini-testing/selenoid/blob/master/wsdriver/ws_req.go#L78-L85
const parseWsDriverIncomingMessage = async (incomingMessage) => {
const data = rawDataToBuffer(incomingMessage);
if (data.length < MIN_INCOMING_MESSAGE_LENGTH_BYTES) {
return new Error(`Invalid incoming message "${(0, util_1.inspect)(incomingMessage)}": too short`);
}
const messageVersion = data.readUInt8(0);
if (messageVersion !== WSDRIVER_VERSION) {
logger.warn(`wsdriver: Unexpected message version. Expected '${WSDRIVER_VERSION}', got '${messageVersion}'`);
return null;
}
const messageHeaders = data.readUInt8(1);
const messageType = (messageHeaders >> 4);
const compressionType = ((messageHeaders >> 2) & 0b11);
const isJson = Boolean((messageHeaders >> 1) & 0b1);
const isProtocolError = Boolean(messageHeaders & 0b1);
if (messageType !== types_1.WsDriverMessage.Response) {
logger.warn(`wsdriver: Unexpected message type. Expected '${types_1.WsDriverMessage.Response}', got '${messageType}'`);
return null;
}
const requestId = data.readUInt32BE(2);
const statusCode = data.readUInt16BE(6);
const requestPathEnd = data.indexOf(0, 8);
if (requestPathEnd === -1) {
return new Error(`Invalid incoming message with id ${requestId}: absent null-terminator for requestPath`);
}
const requestPath = data.toString("utf8", 8, requestPathEnd);
const rawBody = data.subarray(requestPathEnd + 1);
let body;
try {
const decompressedBody = rawBody.byteLength
? await (0, compression_1.getDecompressed)(rawBody, compressionType).catch(err => err)
: null;
if (!rawBody.byteLength || !decompressedBody) {
body = rawBody.toString("utf8");
}
else if (decompressedBody instanceof Error) {
body = decompressedBody;
}
else if (isJson) {
try {
body = JSON.parse(decompressedBody.toString("utf8"));
}
catch (cause) {
(0, debug_1.debugWSDriver)("Couldn't parse incoming JSON payload: %O", cause);
body = decompressedBody.toString("utf8");
}
}
else {
body = decompressedBody.toString("utf8");
}
}
catch (err) {
body = err;
}
return {
requestId,
statusCode,
isJson,
isProtocolError,
requestPath,
body,
rawBody,
};
};
exports.parseWsDriverIncomingMessage = parseWsDriverIncomingMessage;
//# sourceMappingURL=response.js.map