jl
Version:
Command-line JSON manipulation library
81 lines (57 loc) • 1.51 kB
JavaScript
var os = require('os');
var fs = require('fs');
var crypto = require('crypto');
function ChildProcessFifos(streams, command, args, options) {
this.tmpDir = options.tmpDir || os.tmpdir();
return this._runFifos(streams, command, args, options);
};
ChildProcessFifos.sequenceNumber = 0;
ChildProcessFifos.prototype._runFifos = function(streams, cmd, args, options) {
var mkfifoSync = require('mkfifo').mkfifoSync;
options.stdio = [
'ignore',
options.outputStream || 'pipe',
process.stderr
];
var fifos = [];
var proc;
var clearFifos = function() {
for(var i = 0; i < fifos.length; i++) {
var fifo = fifos[i];
fifo.stream.end();
fs.unlinkSync(fifo.path);
}
fifos = [];
if(proc)
proc.kill()
process.removeListener('exit', clearFifos);
};
process.once('exit', clearFifos);
try {
var fullArgs = args.slice(0);
fullArgs.push('--');
for(var i = 0; i < streams.length; i++) {
ChildProcessFifos.sequenceNumber++;
var p = this.tmpDir + '/process.' + process.pid + '.' + ChildProcessFifos.sequenceNumber + '.' + crypto.randomBytes(8).toString('hex') + '.fifo';
mkfifoSync(p, 384); // 0600
var ws = fs.createWriteStream(p);
streams[i].pipe(ws);
fifos.push({
path: p,
stream: ws
});
fullArgs.push(p);
}
proc = require('child_process').spawn(
cmd,
fullArgs,
options
);
proc.on('close', clearFifos);
return proc;
} catch(e) {
clearFifos();
throw e;
}
};
exports.ChildProcessFifos = ChildProcessFifos;