53 lines
1.2 KiB
JavaScript
53 lines
1.2 KiB
JavaScript
'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
|
|
};
|
|
|