restricted-parallel-processes
Version:
Spawn all processes, but limit number of parallel processes
106 lines • 4.76 kB
JavaScript
;
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