'use strict';
|
const mergePromiseProperty = (spawned, promise, property) => {
|
// Starting the main `promise` is deferred to avoid consuming streams
|
const value = typeof promise === 'function' ?
|
(...args) => promise()[property](...args) :
|
promise[property].bind(promise);
|
|
Object.defineProperty(spawned, property, {
|
value,
|
writable: true,
|
enumerable: false,
|
configurable: true
|
});
|
};
|
|
// The return value is a mixin of `childProcess` and `Promise`
|
const mergePromise = (spawned, promise) => {
|
mergePromiseProperty(spawned, promise, 'then');
|
mergePromiseProperty(spawned, promise, 'catch');
|
|
// TODO: Remove the `if`-guard when targeting Node.js 10
|
if (Promise.prototype.finally) {
|
mergePromiseProperty(spawned, promise, 'finally');
|
}
|
|
return spawned;
|
};
|
|
// Use promises instead of `child_process` events
|
const getSpawnedPromise = spawned => {
|
return new Promise((resolve, reject) => {
|
spawned.on('exit', (exitCode, signal) => {
|
resolve({exitCode, signal});
|
});
|
|
spawned.on('error', error => {
|
reject(error);
|
});
|
|
if (spawned.stdin) {
|
spawned.stdin.on('error', error => {
|
reject(error);
|
});
|
}
|
});
|
};
|
|
module.exports = {
|
mergePromise,
|
getSpawnedPromise
|
};
|