diff --git a/src/modules/esl-utils/async/promise/event.ts b/src/modules/esl-utils/async/promise/event.ts index d0cec954f..892e8d062 100644 --- a/src/modules/esl-utils/async/promise/event.ts +++ b/src/modules/esl-utils/async/promise/event.ts @@ -24,14 +24,14 @@ export function promisifyEvent( options?: boolean | AddEventListenerOptions ): Promise { return new Promise((resolve, reject) => { - function eventCallback(e: Event): void { + function eventCallback(e?: Event): void { target.removeEventListener(event, eventCallback, options); - resolve(e); + e ? resolve(e) : reject(new Error('Rejected by timeout')); } target.addEventListener(event, eventCallback, options); if (typeof timeout === 'number' && timeout >= 0) { - setTimeout(() => reject(new Error('Rejected by timeout')), timeout); + setTimeout(eventCallback, timeout); } }); } diff --git a/src/modules/esl-utils/async/test/promise/event.test.ts b/src/modules/esl-utils/async/test/promise/event.test.ts index 1bff94a39..381731aa0 100644 --- a/src/modules/esl-utils/async/test/promise/event.test.ts +++ b/src/modules/esl-utils/async/test/promise/event.test.ts @@ -11,12 +11,32 @@ describe('async/promise/event', () => { el.dispatchEvent(new CustomEvent('test')); return expect(promise$.then((e) => e.type)).resolves.toBe('test'); }); + test('Resolved converter unsubscribes from target', async () => { + const el = document.createElement('div'); + const spy = jest.spyOn(el, 'removeEventListener'); + const promise$ = promisifyEvent(el, 'test'); + el.dispatchEvent(new CustomEvent('test')); + await promise$; + return expect(spy).toBeCalledWith('test', expect.any(Function), undefined); + }); + test('Rejected by timeout if it is exceeded', () => { const el = document.createElement('div'); const promise$ = promisifyEvent(el, 'test', 10); jest.advanceTimersByTime(100); return expect(promise$).rejects.toBeInstanceOf(Error); }); + test('Listener unsubscribed if promise was rejected by timeout', async () => { + const el = document.createElement('div'); + const spy = jest.spyOn(el, 'removeEventListener'); + const promise$ = promisifyEvent(el, 'test', 10); + jest.advanceTimersByTime(100); + try { + await promise$; + } catch { + expect(spy).toBeCalledWith('test', expect.any(Function), undefined); + } + }); }); describe('promisifyMarker', () => {