From b64a14b761a38da13b81370828a2d5e9ad68c330 Mon Sep 17 00:00:00 2001 From: Florrie Date: Mon, 28 May 2018 22:42:37 -0300 Subject: Initial commit --- general-util.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 general-util.js (limited to 'general-util.js') diff --git a/general-util.js b/general-util.js new file mode 100644 index 0000000..35e1103 --- /dev/null +++ b/general-util.js @@ -0,0 +1,48 @@ +const { spawn } = require('child_process') +const npmCommandExists = require('command-exists') + +module.exports.promisifyProcess = function(proc, showLogging = true) { + // Takes a process (from the child_process module) and returns a promise + // that resolves when the process exits (or rejects, if the exit code is + // non-zero). + + return new Promise((resolve, reject) => { + if (showLogging) { + proc.stdout.pipe(process.stdout) + proc.stderr.pipe(process.stderr) + } + + proc.on('exit', code => { + if (code === 0) { + resolve() + } else { + reject(code) + } + }) + }) +} + +module.exports.commandExists = async function(command) { + // When the command-exists module sees that a given command doesn't exist, it + // throws an error instead of returning false, which is not what we want. + + try { + return await npmCommandExists(command) + } catch(err) { + return false + } +} + +module.exports.killProcess = async function(proc) { + // Windows is stupid and doesn't like it when we try to kill processes. + // So instead we use taskkill! https://stackoverflow.com/a/28163919/4633828 + + if (await module.exports.commandExists('taskkill')) { + await module.exports.promisifyProcess( + spawn('taskkill', ['/pid', proc.pid, '/f', '/t']), + false + ) + } else { + proc.kill() + } +} -- cgit 1.3.0-6-gf8a5