Spaces:
Build error
Build error
; | |
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; | |