UNPKG

linuxjs

Version:
81 lines (71 loc) 2.07 kB
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 }); } }); };