UNPKG

kefir-process

Version:

Using kefir to create communicating processes.

75 lines (63 loc) 2.09 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.createProcess = createProcess; var _child_process = require('child_process'); var _kefir = require('kefir'); var _kefir2 = _interopRequireDefault(_kefir); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var maxParallel = 4; function fromMultiCallback(callbackConsumer) { return _kefir2.default.stream(function (emitter) { callbackConsumer(function (x) { if (x == null) { emitter.end(); return; } emitter.emit(x); }); }); } function createProcess(program, args) { args = args || []; var nextCallback; // start maxParallel var canRun = _kefir2.default.merge([_kefir2.default.sequentially(0, Array(maxParallel + 1).join('a').split('')), fromMultiCallback(function (callback) { nextCallback = callback; })]); var inputStream = _kefir2.default.never(); return function (value) { inputStream = _kefir2.default.concat([inputStream, _kefir2.default.later(1, value)]); var canThisRun = canRun.take(1); var mayRun = _kefir2.default.zip([inputStream, canThisRun]).map(function () { var instance = (0, _child_process.spawn)(program, args); return instance; }); var readyCallback; var readyStream = _kefir2.default.fromCallback(function (callback) { readyCallback = callback; }); var stream = _kefir2.default.stream(function (emitter) { mayRun.onValue(function (instance) { instance.stdout.on('data', function (data) { emitter.emit(data.toString()); }); instance.on('close', function () { emitter.end(); nextCallback(true); }); instance.stderr.on('data', function (data) { console.error(data.toString()); }); readyCallback(instance); }); readyStream.onValue(function (instance) { instance.stdin.write('' + value); instance.stdin.end(); }); }); return stream; }; } //# sourceMappingURL=api.js.map