Skip to content

Instantly share code, notes, and snippets.

@sompylasar
Created December 19, 2018 05:52
Show Gist options
  • Save sompylasar/c810b353dfe829e9c9794cb93309e67e to your computer and use it in GitHub Desktop.
Save sompylasar/c810b353dfe829e9c9794cb93309e67e to your computer and use it in GitHub Desktop.
`Promise` wrapper around `require('child_process').spawn` that runs a process to completion with a given `stdin` and collects `stdout`, `stderr`, and the exit code.
const spawn = require('child_process').spawn;
async function runExternalProcessAsync({ procExecutable, procArgs, procStdinString }) {
const proc = await new Promise((resolve) => {
resolve(spawn(procExecutable, procArgs));
});
try {
return await new Promise((resolve, reject) => {
const procStdoutParts = [];
const procStderrParts = [];
proc.stdout.on('data', (data) => {
procStdoutParts.push(String(data));
});
proc.stdout.on('error', (error) => {
reject(error);
});
proc.stderr.on('data', (data) => {
procStderrParts.push(String(data));
});
proc.stderr.on('error', (error) => {
reject(error);
});
proc.on('error', (error) => {
reject(error);
});
proc.on('exit', (procExitCode) => {
const procStdout = procStdoutParts.join('');
const procStderr = procStderrParts.join('');
resolve({
procStdout: procStdout,
procStderr: procStderr,
procExitCode: procExitCode,
});
});
proc.stdin.write(procStdinString || '');
proc.stdin.end();
});
} catch (procError) {
throw procError;
} finally {
proc.kill();
}
}
module.export = {
runExternalProcessAsync,
};

Overview

Promise wrapper around require('child_process').spawn that runs a process to completion with a given stdin and collects stdout, stderr, and the exit code.

Usage

  // Fix errors in a zip archive.
  const { procExitCode, procStdout, procStderr } = await runExternalProcessAsync({
    procExecutable: 'zip',
    procArgs: ['-FF', zipTempPath, '--out', zipFixedTempPath],
    procStdinString: 'y',
  });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment