You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.2 KiB
53 lines
1.2 KiB
|
3 years ago
|
'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
|
||
|
|
};
|
||
|
|
|