版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

37 строки
1.1 KiB

  1. // eslint-disable-next-line unicorn/prefer-top-level-await
  2. const nativePromisePrototype = (async () => {})().constructor.prototype;
  3. const descriptors = ['then', 'catch', 'finally'].map(property => [
  4. property,
  5. Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property),
  6. ]);
  7. // The return value is a mixin of `childProcess` and `Promise`
  8. export const mergePromise = (spawned, promise) => {
  9. for (const [property, descriptor] of descriptors) {
  10. // Starting the main `promise` is deferred to avoid consuming streams
  11. const value = typeof promise === 'function'
  12. ? (...args) => Reflect.apply(descriptor.value, promise(), args)
  13. : descriptor.value.bind(promise);
  14. Reflect.defineProperty(spawned, property, {...descriptor, value});
  15. }
  16. };
  17. // Use promises instead of `child_process` events
  18. export const getSpawnedPromise = spawned => new Promise((resolve, reject) => {
  19. spawned.on('exit', (exitCode, signal) => {
  20. resolve({exitCode, signal});
  21. });
  22. spawned.on('error', error => {
  23. reject(error);
  24. });
  25. if (spawned.stdin) {
  26. spawned.stdin.on('error', error => {
  27. reject(error);
  28. });
  29. }
  30. });