type AnyEventData = TEventName extends any ? { data: TConfig[TEventName]; event: TEventName; } : never; type AnyRemitterListener = (data: AnyEventData) => void; type ErrorRemitterListener = (error: unknown) => void; type Fn = (...args: any[]) => any; type RemitterDatalessEventName = { [EventName in keyof TConfig]: TConfig[EventName] extends never | undefined | void ? EventName : never; }[keyof TConfig]; type RemitterDisposer = () => void; type RemitterEventNames = keyof TConfig; type RemitterListener = RemitterEventNames> = (eventData: TConfig[TEventName]) => void; type EventReceiver = Omit, "emit" | "remit" | "remitAny">; declare class Remitter { /** * Remove all listeners from the eventName or all events. * @param eventName Optional eventName to clear. */ clear>(eventName?: TEventName): void; /** * Remove all listeners from `ANY_EVENT`. */ clearAny(): void; /** * Remove all listeners from `ERROR_EVENT`. */ clearError(): void; dispose(): void; /** * Emit an event to `eventName` listeners. */ emit>(eventName: TEventName): void; /** * Emit an event with payload to `eventName` listeners. */ emit>(eventName: TEventName, eventData: TConfig[TEventName]): void; /** * If the eventName has any listener. * @param eventName Optional eventName to check. * @returns `true` if the eventName has any listener, `false` otherwise. If no eventName is provided, returns `true` if the Remitter has any listener. */ has>(eventName?: TEventName): boolean; /** * If the `ANY_EVENT` has any listener. * @returns `true` if the `ANY_EVENT` has any listener, `false` otherwise. */ hasAny(): boolean; /** * If the `ERROR_EVENT` has any listener. * @returns `true` if the `ERROR_EVENT` has any listener, `false` otherwise. */ hasError(): boolean; /** * Remove a listener from the eventName. */ off>(eventName: TEventName, listener: Fn): void; /** * Remove a listener from `ANY_EVENT`. */ offAny(listener: AnyRemitterListener): void; /** * Remove a listener from `ERROR_EVENT`. */ offError(listener: ErrorRemitterListener): void; /** * Add a listener to the eventName. */ on>(eventName: TEventName, listener: RemitterListener): RemitterDisposer; /** * Add an `ANY_EVENT` listener to receive all events. */ onAny(listener: AnyRemitterListener): RemitterDisposer; /** * Add a one-time listener to the eventName. */ once>(eventName: TEventName, listener: RemitterListener): RemitterDisposer; /** * Add a one-time listener to `ANY_EVENT` to receive all events. */ onceAny(listener: AnyRemitterListener): RemitterDisposer; /** * Add a one-time listener to `ERROR_EVENT` to receive unhandled subscriber errors. */ onceError(listener: ErrorRemitterListener): RemitterDisposer; /** * Add an `ERROR_EVENT` listener to receive unhandled subscriber errors. */ onError(listener: ErrorRemitterListener): RemitterDisposer; /** * Start a side effect when the eventName has a first listener. * Dispose the side effect when the eventName has no listeners. * Useful for tapping into other events. * * @param eventName * @param start A function that is called when listener count of `eventName` grows from 0 to 1. * Returns a disposer when listener count of `eventName` drops from 1 to 0. */ remit>(eventName: TEventName, start: (remitter: Remitter) => RemitterDisposer): RemitterDisposer; /** * Start a side effect when the first listener. * Dispose the side effect when the eventName has no listeners. * Useful for tapping into other events. * * @param start A function that is called when all listener count grows from 0 to 1. * Returns a disposer when all listener count drops from 1 to 0. */ remitAny(start: (remitter: Remitter) => RemitterDisposer): RemitterDisposer; } export { type AnyEventData, type AnyRemitterListener, type ErrorRemitterListener, type EventReceiver, Remitter, type RemitterDatalessEventName, type RemitterDisposer, type RemitterEventNames, type RemitterListener };