Ensure worker event handlers run only once

Add execArgv: [] when creating the Worker and introduce a 'settled' flag with a once() helper to ensure 'message', 'error', and 'exit' handlers only act once. This prevents multiple resolve/stat updates if the worker emits multiple events (avoiding duplicate stats increments, repeated resolves, and noisy error handling). Keeps existing resourceLimits and preserves logging for failures.
This commit is contained in:
DosX 2026-05-25 21:13:41 +03:00
commit 9c2f2c2519

View file

@ -127,13 +127,17 @@ function processFile(srcFile, dstFile) {
return new Promise((resolve) => {
const worker = new Worker(path.join(__dirname, 'worker.js'), {
workerData: { srcFile, dstFile },
execArgv: [],
resourceLimits: {
maxOldGenerationSizeMb: 2048,
maxYoungGenerationSizeMb: 512
}
});
worker.on('message', (result) => {
let settled = false;
const once = (fn) => (...args) => { if (!settled) { settled = true; fn(...args); } };
worker.on('message', once((result) => {
stats.total++;
if (result.type === 'minified') {
@ -166,21 +170,23 @@ function processFile(srcFile, dstFile) {
}
resolve();
});
}));
worker.on('error', (err) => {
worker.on('error', once((err) => {
stats.failed++;
failedFiles.push({ file: srcFile, reason: err.message });
console.warn("[ERROR] " + srcFile + " — " + err.message);
resolve();
});
}));
worker.on('exit', (code) => {
if (code !== 0) {
stats.failed++;
failedFiles.push({ file: srcFile, reason: `Worker stopped with exit code ${code}` });
console.warn("[ERROR] " + srcFile + " — Worker stopped with exit code " + code);
resolve();
once(() => {
stats.failed++;
failedFiles.push({ file: srcFile, reason: `Worker stopped with exit code ${code}` });
console.warn("[ERROR] " + srcFile + " — Worker stopped with exit code " + code);
resolve();
})();
}
});
});