UNPKG

seespee

Version:

Create a Content-Security-Policy for a website based on the statically decidable relations

56 lines (48 loc) 1.47 kB
const childProcess = require('child_process'); function consumeStream(stream) { return new Promise((resolve, reject) => { const buffers = []; stream .on('data', (buffer) => buffers.push(buffer)) .on('end', () => resolve(Buffer.concat(buffers))) .on('error', reject); }); } async function run(commandAndArgs, stdin) { if (typeof commandAndArgs !== 'undefined' && !Array.isArray(commandAndArgs)) { commandAndArgs = [commandAndArgs]; } const proc = childProcess.spawn(commandAndArgs[0], commandAndArgs.slice(1)); const promises = { exit: new Promise((resolve, reject) => { proc.on('error', reject).on('exit', (exitCode) => { if (exitCode === 0) { resolve(); } else { const err = new Error(`Child process exited with ${exitCode}`); err.exitCode = exitCode; reject(err); } }); }), stdin: new Promise((resolve, reject) => { proc.stdin.on('error', reject).on('close', resolve); }), stdout: consumeStream(proc.stdout), stderr: consumeStream(proc.stderr), }; if (typeof stdin === 'undefined') { proc.stdin.end(); } else { proc.stdin.end(stdin); } try { await Promise.all(Object.values(promises)); return [await promises.stdout, await promises.stderr]; } catch (err) { err.stdout = await promises.stdout; err.stderr = await promises.stderr; throw err; } } module.exports = run;