You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.7 KiB

1 month ago
'use strict';
const { asyncSend } = require('./utils');
module.exports = function(processFile, childPool) {
return function process(job) {
return childPool.retain(processFile).then(async child => {
let msgHandler;
let exitHandler;
await asyncSend(child, {
cmd: 'start',
job: job
});
const done = new Promise((resolve, reject) => {
msgHandler = function(msg) {
switch (msg.cmd) {
case 'completed':
resolve(msg.value);
break;
case 'failed':
case 'error': {
const err = new Error();
Object.assign(err, msg.value);
reject(err);
break;
}
case 'progress':
job.progress(msg.value);
break;
case 'update':
job.update(msg.value);
break;
case 'discard':
job.discard();
break;
case 'log':
job.log(msg.value);
break;
}
};
exitHandler = (exitCode, signal) => {
reject(
new Error(
'Unexpected exit code: ' + exitCode + ' signal: ' + signal
)
);
};
child.on('message', msgHandler);
child.on('exit', exitHandler);
});
return done.finally(() => {
child.removeListener('message', msgHandler);
child.removeListener('exit', exitHandler);
if (child.exitCode !== null || /SIG.*/.test(child.signalCode)) {
childPool.remove(child);
} else {
childPool.release(child);
}
});
});
};
};