/* This wait for event logic is borrowed from wait-for-event package by @jameslnewell https://github.com/jameslnewell/wait-for-event */ export const waitFor = ( event: Event, emitter: EventEmitter, callback?: Callback, ): Promise => { const promise = new Promise((resolve, reject) => { const startListening = (): void => { addListener(emitter, event, handleEvent); addListener(emitter, 'error', handleError); }; const stopListening = (): void => { removeListener(emitter, event, handleEvent); removeListener(emitter, 'error', handleError); }; const handleEvent = (): void => { stopListening(); resolve(); }; const handleError = (error: any): void => { stopListening(); reject(error); }; startListening(); }); if (callback) { promise.then( () => callback(undefined), (error) => callback(error), ); } return promise; }; const addListener = ( emitter: EventEmitterOn | EventEmitterAddListener, event: Event | 'error', listener: EventListener, ): void => { if (typeof (emitter as EventEmitterOn).on === 'function') { (emitter as EventEmitterOn).on(event, listener); } else if ( typeof (emitter as EventEmitterAddListener).addListener === 'function' ) { (emitter as EventEmitterAddListener).addListener(event, listener); } }; export const removeListener = ( emitter: EventEmitterOff | EventEmitterRemoveListener, event: Event | 'error', listener: EventListener, ): void => { if (typeof (emitter as EventEmitterOff).off === 'function') { (emitter as EventEmitterOff).off(event, listener); } else if ( typeof (emitter as EventEmitterRemoveListener).removeListener === 'function' ) { (emitter as EventEmitterRemoveListener).removeListener( event, listener, ); } }; interface Callback { (error: any): void; } interface EventListener { (...args: any[]): void; } interface EventEmitterOn { on(event: Event | 'error', listener: EventListener): void; } interface EventEmitterOff { off(event: Event | 'error', listener: EventListener): void; } interface EventEmitterAddListener { addListener(event: Event | 'error', listener: EventListener): void; } interface EventEmitterRemoveListener { removeListener(event: Event | 'error', listener: EventListener): void; } type EventEmitter = ( | EventEmitterOn | EventEmitterAddListener ) & (EventEmitterOff | EventEmitterRemoveListener);