/** * @fileoverview A set of helper functions to make it easier to work * with events in async/await manner. */ /** * @param {!EventTarget} target * @param {string} eventName * @return {!Promise} */ export const waitForEvent = (target: EventTarget, eventName: string) => { return new Promise(resolve => { target.addEventListener(eventName, resolve, { once: true }); }); }; /** * @param {!EventEmitter} emitter * @param {string} eventName * @return {!Promise} With Event as the first item. */ export const emittedOnce = (emitter: NodeJS.EventEmitter, eventName: string, trigger?: () => void) => { return emittedNTimes(emitter, eventName, 1, trigger).then(([result]) => result); }; export const emittedNTimes = async (emitter: NodeJS.EventEmitter, eventName: string, times: number, trigger?: () => void) => { const events: any[][] = []; const p = new Promise(resolve => { const handler = (...args: any[]) => { events.push(args); if (events.length === times) { emitter.removeListener(eventName, handler); resolve(events); } }; emitter.on(eventName, handler); }); if (trigger) { await Promise.resolve(trigger()); } return p; }; export const emittedUntil = async (emitter: NodeJS.EventEmitter, eventName: string, untilFn: Function) => { const p = new Promise(resolve => { const handler = (...args: any[]) => { if (untilFn(...args)) { emitter.removeListener(eventName, handler); resolve(args); } }; emitter.on(eventName, handler); }); return p; };