diff --git a/source/one-event.ts b/source/one-event.ts index b7a4c39..cd2c72f 100644 --- a/source/one-event.ts +++ b/source/one-event.ts @@ -1,5 +1,3 @@ -import {addListener} from './add-listener.js'; - type AnyFunction = (...parameters: any[]) => void; type RemovableEvent unknown> = { @@ -25,21 +23,21 @@ export async function oneEvent>( return; } - const controller = new AbortController(); - const complete = controller.abort.bind(controller); - signal?.addEventListener('abort', complete, {once: true}); - - const listener = filter ? (...parameters: EventParameters) => { - if (filter(...parameters)) { - complete(); - } - } : complete; - - addListener(event, listener, { - signal: controller.signal, - }); - - await new Promise(resolve => { - controller.signal.addEventListener('abort', resolve, {once: true}); + await new Promise(resolve => { + // TODO: VoidFunction should not be necessary, it's equivalent to using "any" + const listener: VoidFunction = (...parameters: EventParameters) => { + if (!filter || filter(...parameters)) { + resolve(); + event.removeListener(listener); + } + }; + + event.addListener(listener); + + // TODO: The abort listener is left behind if never aborted + signal?.addEventListener('abort', () => { + resolve(); + event.removeListener(listener); + }); }); }