UNPKG

@mmisty/cypress-allure-adapter

Version:

cypress allure adapter to generate allure results during tests execution (Allure TestOps compatible)

168 lines (167 loc) 5.98 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.startReporterServer = exports.testMessages = void 0; const ws_1 = require("ws"); const net_1 = __importDefault(require("net")); const common_1 = require("../common"); const debug_1 = __importDefault(require("debug")); const debug = (0, debug_1.default)('cypress-allure:server'); const logMessage = (0, debug_1.default)('cypress-allure:server:message'); const log = (...args) => { debug(`${args}`); }; // for testing exports.testMessages = []; const messageGot = (...args) => { logMessage(`${args}`); }; const checkPortSync = (port, timeoutMs = 2000) => { let isAvailable = true; let server = null; let timeoutReached = false; const startTime = Date.now(); try { server = net_1.default.createServer(); server.listen(port); server.on('error', (err) => { if (err.code === 'EADDRINUSE') { isAvailable = false; } }); const checkTimeout = () => { if (Date.now() - startTime >= timeoutMs) { timeoutReached = true; } }; const waitForListening = () => { if (!(server === null || server === void 0 ? void 0 : server.listening) && !timeoutReached) { process.nextTick(waitForListening); // Yield to event loop checkTimeout(); // Check if timeout has been reached } }; waitForListening(); if (timeoutReached) { throw new Error(`Timeout waiting for port ${port} to become available.`); } } catch (error) { isAvailable = false; } finally { if (server) { server.close(); } } return isAvailable; }; function retrieveRandomPortNumber() { const getRandomPort = () => 40000 + Math.round(Math.random() * 25000); let port = getRandomPort(); for (let i = 0; i < 30; i++) { const result = checkPortSync(port); if (result) { return port; } port = getRandomPort(); } (0, common_1.logWithPackage)('error', 'could not find free port, will not report'); return port; } const socketLogic = (sockserver, tasks) => { if (!sockserver) { log('Could not start reporting server'); return; } sockserver.on('connection', ws => { log('New client connected!'); ws.send('connection established'); ws.on('close', () => { log('Client has disconnected!'); }); ws.on('message', data => { messageGot('message received'); messageGot(data); exports.testMessages.push(`${data}`); const parseData = (data) => { try { // eslint-disable-next-line @typescript-eslint/no-explicit-any return JSON.parse(data.toString()); } catch (e) { // console.log((e as Error).message); return {}; } }; const requestData = parseData(data); const payload = requestData.data; if (requestData.id) { const result = executeTask(tasks, payload); sockserver.clients.forEach(client => { log(`sending back: ${JSON.stringify(requestData)}`); client.send(JSON.stringify({ payload, status: result ? 'done' : 'failed' })); }); } else { sockserver.clients.forEach(client => { log(`sending back: ${JSON.stringify(requestData)}`); client.send(JSON.stringify({ payload, status: 'done' })); }); } }); ws.onerror = function () { (0, common_1.logWithPackage)('error', 'websocket error'); }; }); }; const startReporterServer = (configOptions, tasks, attempt = 0) => { const wsPort = retrieveRandomPortNumber(); let sockserver = new ws_1.WebSocketServer({ port: wsPort, path: common_1.wsPath }, () => { configOptions.env[common_1.ENV_WS] = wsPort; const attemptMessage = attempt > 0 ? ` from ${attempt} attempt` : ''; (0, common_1.logWithPackage)('log', `running on ${wsPort} port${attemptMessage}`); socketLogic(sockserver, tasks); }); sockserver.on('error', err => { if (err.message.indexOf('address already in use') !== -1) { if (attempt < 30) { process.nextTick(() => { sockserver = (0, exports.startReporterServer)(configOptions, tasks, attempt + 1); }); } else { (0, common_1.logWithPackage)('error', `Could not find free port, will not report: ${err.message}`); } return; } (0, common_1.logWithPackage)('error', `Error on ws server: ${err.message}`); }); return sockserver; }; exports.startReporterServer = startReporterServer; // eslint-disable-next-line @typescript-eslint/no-explicit-any const executeTask = (tasks, data) => { if (!data || !data.task) { log(`Will not run task - not data or task field:${JSON.stringify(data)}`); return false; } try { if (Object.keys(tasks).indexOf(data.task) !== -1) { const task = data.task; // todo check log(task); tasks[task](data.arg); return true; } else { log(`No such task: ${data.task}`); } } catch (err) { (0, common_1.logWithPackage)('error', `Error running task: '${data.task}': ${err.message}`); // eslint-disable-next-line no-console console.log(err.stack); } return false; };