51 lines
No EOL
1.4 KiB
JavaScript
Executable file
51 lines
No EOL
1.4 KiB
JavaScript
Executable file
'use strict';
|
|
|
|
const childProcess = require('child_process');
|
|
const childModule = parseInt(process.versions.node, 10) < 8 ? require.resolve('../../lib/workerfarm/child') : require.resolve('../../src/workerfarm/child');
|
|
|
|
function fork(forkModule, childId) {
|
|
// suppress --debug / --inspect flags while preserving others (like --harmony)
|
|
let filteredArgs = process.execArgv.filter(v => !/^--(debug|inspect)/.test(v));
|
|
let options = {
|
|
execArgv: filteredArgs,
|
|
env: process.env,
|
|
cwd: process.cwd()
|
|
};
|
|
let child = childProcess.fork(childModule, process.argv, options);
|
|
|
|
let sendQueue = [];
|
|
let processQueue = true;
|
|
|
|
function send(data) {
|
|
if (!processQueue) {
|
|
return sendQueue.push(data);
|
|
}
|
|
|
|
let result = child.send(data, error => {
|
|
if (error && error instanceof Error) {
|
|
// Ignore this, the workerfarm handles child errors
|
|
return;
|
|
}
|
|
|
|
processQueue = true;
|
|
|
|
if (sendQueue.length > 0) {
|
|
let queueCopy = sendQueue.slice(0);
|
|
sendQueue = [];
|
|
queueCopy.forEach(entry => send(entry));
|
|
}
|
|
});
|
|
|
|
if (!result || /^win/.test(process.platform)) {
|
|
// Queue is handling too much messages throttle it
|
|
processQueue = false;
|
|
}
|
|
}
|
|
|
|
send({ module: forkModule, child: childId });
|
|
|
|
// return a send function for this child
|
|
return { send, child };
|
|
}
|
|
|
|
module.exports = fork; |