UNPKG

restricted-parallel-processes

Version:

Spawn all processes, but limit number of parallel processes

106 lines 4.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const childProcess = tslib_1.__importStar(require("child_process")); const restricted_concurrent_actions_1 = tslib_1.__importDefault(require("restricted-concurrent-actions")); /** * Spawn a certain number of parallel subprocesses after subprocesses * @param params List of parameters * @param partLength Number of parallel subprocesses to be spawn at once * @param handleRemain Handle final remaining parameters * @returns An `AsyncIterableIterator` of arrays */ function spawn(params, partLength, handleRemain) { return restricted_concurrent_actions_1.default(spawn.getActionList(params), partLength, handleRemain); } exports.spawn = spawn; (function (spawn) { spawn.OMIT_EMPTY_REMAINING_PART = restricted_concurrent_actions_1.default.OMIT_EMPTY_REMAINING_PART, spawn.KEEP_REMAINING_PART = restricted_concurrent_actions_1.default.KEEP_REMAINING_PART, spawn.OMIT_REMAINING_PART = restricted_concurrent_actions_1.default.OMIT_REMAINING_PART, spawn.DEFAULT_REMAINING_HANDLER = restricted_concurrent_actions_1.default.DEFAULT_REMAINING_HANDLER; let ObjectParams; (function (ObjectParams) { class CreationEvent { constructor(process, params, promise) { this.name = 'CreationEvent'; this.process = process; this.params = params; this.promise = promise; } } ObjectParams.CreationEvent = CreationEvent; })(ObjectParams = spawn.ObjectParams || (spawn.ObjectParams = {})); class ResultItem { constructor(process, status, signal, stdout, stderr) { this.process = process; this.status = status; this.signal = signal; this.stdout = stdout; this.stderr = stderr; } } spawn.ResultItem = ResultItem; class DisconnectionException extends Error { constructor(process, params) { const { command, argv = [] } = params; const execstr = [command, ...argv].join(' '); super(`Process of command '${execstr}' disconnected.`); this.process = process; this.params = params; } get name() { return this.constructor.name; } } spawn.DisconnectionException = DisconnectionException; function getActionList(params) { return params.map(getObjectParam).map(getActionFunction); } spawn.getActionList = getActionList; function getObjectParam(item) { switch (typeof item) { case 'string': return getObjectParam(String(item).split(' ').filter(x => x.trim())); case 'object': if (!item) throw new TypeError(`null is not a valid item`); if (Array.isArray(item)) { const [command, ...argv] = item; return { command, argv }; } return item; default: throw new TypeError('Invalid type of item'); } } spawn.getObjectParam = getObjectParam; function getActionFunction(params) { const { command, argv = [], options = {}, oncreate = () => undefined } = params; return () => new Promise((resolve, reject) => { const process = childProcess.spawn(command, Array.from(argv), options); oncreate(new ObjectParams.CreationEvent(process, params, { resolve, reject })); let stdout = Array(); let stderr = Array(); // @ts-ignore process.stdout.on('data', chunk => stdout.push(chunk)); // @ts-ignore process.stderr.on('data', chunk => stderr.push(chunk)); process .on('error', error => reject(error)) .on('disconnect', () => reject(new DisconnectionException(process, params))) .on('close', (status, signal) => resolve(new ResultItem(process, status, signal, stdout, stderr))); }); } spawn.getActionFunction = getActionFunction; /** * Like `spawn`, but returns a `Promise` of arrays * @param params List of parameters * @param partLength Number of parallel subprocesses to be spawn at once * @param handleRemain Handle final remaining parameters * @returns A `Promise` of arrays */ function asArray(params, partLength, handleRemain) { return restricted_concurrent_actions_1.default.asArray(getActionList(params), partLength, handleRemain); } spawn.asArray = asArray; })(spawn = exports.spawn || (exports.spawn = {})); exports.default = spawn; //# sourceMappingURL=index.js.map