time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

promise.js (1109B)


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