creevey
Version:
Cross-browser screenshot testing tool for Storybook with fancy UI Runner
60 lines • 2.13 kB
JavaScript
;
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