import type { Listener, Register } from "../types"; /** * Listens for an event with the provided `register` function until it happens or until `sentinel(event)` returns a truthy value. * If a `signal` is provided, listens to it to cancel the promise. * * @param register Function that registers a listener for the event to catch. * @param signal Optional signal parameter on which the `abort` event will be listened to. * @param sentinel Optional sentinel function that validates an `event` occurence. * @returns A promise that resolves to the `event`. */ export function until( register: Register, any>, signal?: AbortSignal, sentinel?: (event: E) => boolean, ): Promise; export function until( register: Register, undefined>, signal?: AbortSignal, sentinel?: () => boolean, ): Promise; export function until( register: Register, any | undefined>, signal?: AbortSignal, sentinel?: ((event: E) => boolean) | (() => boolean), ): Promise { return new Promise((resolve, reject) => { const clear = register((event?: E) => { if (sentinel !== undefined && !sentinel(event!)) { return; } clear(); resolve(event!); }); if (signal !== undefined) { if (signal.aborted) { clear(); reject(signal.reason); } signal.addEventListener("abort", () => { clear(); reject(signal.reason); }); } }); }