|
|
'use strict';
Object.defineProperty(exports, '__esModule', { value: true }); exports.default = void 0;
function path() { const data = _interopRequireWildcard(require('path'));
path = function () { return data; };
return data; }
function _mergeStream() { const data = _interopRequireDefault(require('merge-stream'));
_mergeStream = function () { return data; };
return data; }
var _types = require('../types');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : {default: obj}; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== 'function') return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) { return {default: obj}; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// How long to wait for the child process to terminate
// after CHILD_MESSAGE_END before sending force exiting.
const FORCE_EXIT_DELAY = 500; /* istanbul ignore next */
const emptyMethod = () => {};
class BaseWorkerPool { constructor(workerPath, options) { _defineProperty(this, '_stderr', void 0);
_defineProperty(this, '_stdout', void 0);
_defineProperty(this, '_options', void 0);
_defineProperty(this, '_workers', void 0);
this._options = options; this._workers = new Array(options.numWorkers);
if (!path().isAbsolute(workerPath)) { workerPath = require.resolve(workerPath); }
const stdout = (0, _mergeStream().default)(); const stderr = (0, _mergeStream().default)(); const {forkOptions, maxRetries, resourceLimits, setupArgs} = options;
for (let i = 0; i < options.numWorkers; i++) { const workerOptions = { forkOptions, maxRetries, resourceLimits, setupArgs, workerId: i, workerPath }; const worker = this.createWorker(workerOptions); const workerStdout = worker.getStdout(); const workerStderr = worker.getStderr();
if (workerStdout) { stdout.add(workerStdout); }
if (workerStderr) { stderr.add(workerStderr); }
this._workers[i] = worker; }
this._stdout = stdout; this._stderr = stderr; }
getStderr() { return this._stderr; }
getStdout() { return this._stdout; }
getWorkers() { return this._workers; }
getWorkerById(workerId) { return this._workers[workerId]; }
createWorker(_workerOptions) { throw Error('Missing method createWorker in WorkerPool'); }
async end() { // We do not cache the request object here. If so, it would only be only
// processed by one of the workers, and we want them all to close.
const workerExitPromises = this._workers.map(async worker => { worker.send( [_types.CHILD_MESSAGE_END, false], emptyMethod, emptyMethod, emptyMethod ); // Schedule a force exit in case worker fails to exit gracefully so
// await worker.waitForExit() never takes longer than FORCE_EXIT_DELAY
let forceExited = false; const forceExitTimeout = setTimeout(() => { worker.forceExit(); forceExited = true; }, FORCE_EXIT_DELAY); await worker.waitForExit(); // Worker ideally exited gracefully, don't send force exit then
clearTimeout(forceExitTimeout); return forceExited; });
const workerExits = await Promise.all(workerExitPromises); return workerExits.reduce( (result, forceExited) => ({ forceExited: result.forceExited || forceExited }), { forceExited: false } ); } }
exports.default = BaseWorkerPool;
|