UNPKG

1.2 kBJavaScriptView Raw
1'use strict';
2const mergePromiseProperty = (spawned, promise, property) => {
3 // Starting the main `promise` is deferred to avoid consuming streams
4 const value = typeof promise === 'function' ?
5 (...args) => promise()[property](...args) :
6 promise[property].bind(promise);
7
8 Object.defineProperty(spawned, property, {
9 value,
10 writable: true,
11 enumerable: false,
12 configurable: true
13 });
14};
15
16// The return value is a mixin of `childProcess` and `Promise`
17const mergePromise = (spawned, promise) => {
18 mergePromiseProperty(spawned, promise, 'then');
19 mergePromiseProperty(spawned, promise, 'catch');
20
21 // TODO: Remove the `if`-guard when targeting Node.js 10
22 if (Promise.prototype.finally) {
23 mergePromiseProperty(spawned, promise, 'finally');
24 }
25
26 return spawned;
27};
28
29// Use promises instead of `child_process` events
30const getSpawnedPromise = spawned => {
31 return new Promise((resolve, reject) => {
32 spawned.on('exit', (code, signal) => {
33 resolve({code, signal});
34 });
35
36 spawned.on('error', error => {
37 reject(error);
38 });
39
40 if (spawned.stdin) {
41 spawned.stdin.on('error', error => {
42 reject(error);
43 });
44 }
45 });
46};
47
48module.exports = {
49 mergePromise,
50 getSpawnedPromise
51};
52