-
Notifications
You must be signed in to change notification settings - Fork 3
/
shell-exec.js
36 lines (32 loc) · 1.13 KB
/
shell-exec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
process.env.PATH = require("path").join(__dirname, "bin") + ":" + process.env.PATH;
module.exports = shellExec;
function shellExec(command, args, stdin, stdinEncoding, stdoutEncoding) {
const child = require("child_process").spawn(command, args, {shell: true});
if (stdin) {
const Readable = require("stream").Readable;
const str = new Readable();
str.push(Buffer.from(stdin, stdinEncoding || "utf8"));
str.push(null);
str.pipe(child.stdin);
}
return Promise.all([
getExitCode(child),
getStream(child.stdout, stdoutEncoding || "utf8"),
getStream(child.stderr, "utf8")
])
.then(([exitCode, stdout, stderr]) => ({exitCode, stdout, stderr}))
};
function getExitCode(child) {
return new Promise(function(fulfill, reject) {
child.on("error", reject);
child.on("exit", (code, signal) => fulfill(signal || code));
})
}
function getStream(stream, encoding) {
return new Promise(function(fulfill) {
const chunks = [];
stream.on("data", chunk => chunks.push(chunk));
stream.on("end", () => fulfill(Buffer.concat(chunks)));
})
.then(buf => encoding ? buf.toString(encoding) : buf)
}