/
exec-child.js
67 lines (57 loc) · 1.76 KB
/
exec-child.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
if (require.main !== module) {
throw new Error('This file should not be required');
}
var childProcess = require('child_process');
var fs = require('fs');
var paramFilePath = process.argv[2];
var serializedParams = fs.readFileSync(paramFilePath, 'utf8');
var params = JSON.parse(serializedParams);
var cmd = params.command;
var execOptions = params.execOptions;
var pipe = params.pipe;
var stdoutFile = params.stdoutFile;
var stderrFile = params.stderrFile;
function isMaxBufferError(err) {
var maxBufferErrorPattern = /^.*\bmaxBuffer\b.*exceeded.*$/;
if (err instanceof Error && err.message &&
err.message.match(maxBufferErrorPattern)) {
// < v10
// Error: stdout maxBuffer exceeded
return true;
} else if (err instanceof RangeError && err.message &&
err.message.match(maxBufferErrorPattern)) {
// >= v10
// RangeError [ERR_CHILD_PROCESS_STDIO_MAXBUFFER]: stdout maxBuffer length
// exceeded
return true;
}
return false;
}
var stdoutStream = fs.createWriteStream(stdoutFile);
var stderrStream = fs.createWriteStream(stderrFile);
function appendError(message, code) {
stderrStream.write(message);
process.exitCode = code;
}
var c = childProcess.exec(cmd, execOptions, function (err) {
if (!err) {
process.exitCode = 0;
} else if (isMaxBufferError(err)) {
appendError('maxBuffer exceeded', 1);
} else if (err.code === undefined && err.message) {
/* istanbul ignore next */
appendError(err.message, 1);
} else if (err.code === undefined) {
/* istanbul ignore next */
appendError('Unknown issue', 1);
} else {
process.exitCode = err.code;
}
});
c.stdout.pipe(stdoutStream);
c.stderr.pipe(stderrStream);
c.stdout.pipe(process.stdout);
c.stderr.pipe(process.stderr);
if (pipe) {
c.stdin.end(pipe);
}