UNPKG

creevey

Version:

Cross-browser screenshot testing tool for Storybook with fancy UI Runner

60 lines 2.13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WorkerQueue = void 0; const cluster_1 = __importDefault(require("cluster")); const types_js_1 = require("../../types.js"); const utils_js_1 = require("../utils.js"); const FORK_RETRIES = 5; class WorkerQueue { useQueue; isProcessing = false; queue = []; // TODO Add concurrency constructor(useQueue) { this.useQueue = useQueue; } async forkWorker(browser, retry = 0) { return new Promise((resolve) => { this.queue.push({ browser, retry, resolve }); void this.process(); }); } async process() { if ((this.useQueue && this.isProcessing) || utils_js_1.isShuttingDown.current) return; const { browser, retry, resolve } = this.queue.pop() ?? {}; if (browser == undefined || retry == undefined || resolve == undefined) return; this.isProcessing = true; cluster_1.default.setupPrimary({ args: ['--browser', browser, ...process.argv.slice(2)], }); const worker = cluster_1.default.fork(); const message = await new Promise((resolve) => { const readyHandler = (message) => { if (!(0, types_js_1.isWorkerMessage)(message)) return; worker.off('message', readyHandler); resolve(message); }; worker.on('message', readyHandler); }); if (message.type == 'error') { (0, utils_js_1.gracefullyKill)(worker); if (retry == FORK_RETRIES) resolve(message.payload); else this.queue.push({ browser, retry: retry + 1, resolve }); } else { resolve(worker); } this.isProcessing = false; setImmediate(() => void this.process()); } } exports.WorkerQueue = WorkerQueue; //# sourceMappingURL=queue.js.map