kefir-process
Version:
Using kefir to create communicating processes.
75 lines (63 loc) • 2.09 kB
JavaScript
;
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