linuxjs
Version:
linuxjs
81 lines (71 loc) • 2.07 kB
JavaScript
module.exports = function spawn (cmd, args, options) {
var errorTriggered = false,
argsIsArray = Object.prototype.toString.call(args) === '[object Array]',
self = this;
if ( ! options && typeof args === 'object' && ! argsIsArray ) {
options = args;
args = [];
}
if ( ! options ) {
options = {};
}
self.emit('message', 'Spawning ' + cmd + ' ' + args.join(' '));
var spawned = require('child_process').spawn(cmd, args, options);
var spawnedOut = [],
spawnedErr = [],
spawnError = false,
spawnCode = -1;
function onSpawnError (msg) {
var err = Error.call(this, msg);
err.code = spawnCode;
err.stderr = spawnedErr;
return err;
}
spawned.on('error', function (error) {
if ( ! errorTriggered ) {
errorTriggered = true;
spawnError = error;
self.emit('message', 'Spawning failed ');
return self.emit('error', error);
}
});
if ( spawned.stdout ) {
spawned.stdout.on('data', function (data) {
var message = data.toString(), lines = message.split(/\n/);
lines.forEach(function (line) {
spawnedOut.push(line);
self.emit('message', line);
});
});
}
if ( spawned.stderr ) {
spawned.stderr.on('data', function (data) {
var message = data.toString(), lines = message.split(/\n/);
lines.forEach(function (line) {
spawnedErr.push(line);
self.emit('message', line);
});
});
}
spawned.on('close', function (code) {
console.log('we are closing ' + code);
spawnCode = code;
if ( code ) {
if ( ! errorTriggered ) {
errorTriggered = true;
spawnError = new Error('Spawned failed for command ' + cmd);
self.emit('message', spawnedErr.join(''));
return self.emit('error', onSpawnError(cmd + ' failed with code ' + code));
}
} else {
self.emit('done', {
cmd: cmd,
args: args,
options: options,
out: spawnedOut,
err: spawnedErr,
code: code
});
}
});
};