import events from 'events'; import { AsyncOrSync } from 'ts-essentials'; /** * Asynchronously sets up an emitter, returning it. If an error occurs during * setup, it will be emitted on the emitter. Note that the setup will always run * after the emitter is returned. */ export declare function withEmitter(ee: E, fn: (ee: E) => AsyncOrSync): E; /** Generic event lister. */ export type EventListener = (...args: any) => void; export type EventListenersFor = { readonly [E in keyof O]: EventListener; }; type EventName = string | symbol; export interface EventListeners { readonly [E: EventName]: EventListener; } type EventNamesFor> = (keyof O & EventName) | 'error'; type InternalEventNames = typeof events.errorMonitor | 'newListener' | 'removeListener'; type EventListenerFor, E extends EventNamesFor | InternalEventNames> = E extends keyof O ? O[E] : E extends 'error' | typeof events.errorMonitor ? (err: unknown) => void : E extends 'newListener' | 'removeListener' ? (name: EventName, fn: EventListener) => void : never; export interface EventProducer> { emit>(eventName: E, ...args: Parameters>): boolean; emit(eventName: EventNamesFor, arg: never): boolean; } export interface EventConsumer> { addListener | InternalEventNames>(event: E, listener: EventListenerFor): this; prependListener | InternalEventNames>(event: E, listener: EventListenerFor): this; prependOnceListener | InternalEventNames>(event: E, listener: EventListenerFor): this; removeListener | InternalEventNames>(event: E, listener: EventListenerFor): this; removeAllListeners(event?: EventNamesFor | InternalEventNames): this; once | InternalEventNames>(eventName: E, listener: EventListenerFor): this; on | InternalEventNames>(eventName: E, listener: EventListenerFor): this; off | InternalEventNames>(eventName: E, listener: EventListenerFor): this; listenerCount(type: EventNamesFor): number; listeners | InternalEventNames>(type: E): Function[]; rawListeners | InternalEventNames>(type: E): Function[]; getMaxListeners(): number; setMaxListeners(n: number): this; } /** * An event emitter with configurable specific type for event names and * listeners. Note that an error listener is implicitly added (with `unknown` * error type). * * The simplest way to use it is with a vanilla underlying event emitter: * * ``` * interface MyListeners { * foo: (n: number) => void; * } * * const ee = typedEmitter(); * ``` */ export interface TypedEmitter> extends EventProducer, EventConsumer { eventNames(): EventName[]; } export declare const TypedEmitter: new >() => TypedEmitter; export interface EventEmitterOptions { readonly captureRejections?: boolean; } /** Returns a typed emitter backed by standard `events.EventEmitter`. */ export declare function typedEmitter>(opts?: EventEmitterOptions): TypedEmitter; /** * Returns a typed event consumer. Any errors thrown during setup (synchronous * or not) will be emitted as `'error'` events on the next tick. */ export declare function withTypedEmitter>(fn: (ee: TypedEmitter) => AsyncOrSync): EventConsumer; /** * Iterates on emitted events of the given name until aborted. This is similar * to `events.on` but does not throw when aborted, the iterator simply returns. * Note that all listeners will be removed from the target when this iterator * returns. */ export declare function yieldEvents, E extends keyof O & string>(ee: TypedEmitter | EventConsumer, name: E, opts?: YieldEventsOptions): AsyncIterable>; export interface YieldEventsOptions { readonly until?: E | ReadonlyArray; readonly signal?: AbortSignal; readonly throwIfAborted?: boolean; } /** * Streams multiple events until the function's provided argument is called. If * the consumer does not have an `error` mapper, one will be automatically be * added which will cause the returned iterable to throw. * * Note that this since is implemented as a generator function, all setup logic * will only run once the returned value is used (iterated on, typically). This * means in particular that error handling logic will not be set up until then. */ export declare function mapEvents, V>(ee: EventConsumer, fn: (exit: () => void) => EventMappersFor): AsyncIterable; export type EventMappersFor, V> = { readonly [E in EventNamesFor]?: (...args: Parameters>) => AsyncOrSync; }; /** Waits for a single event. This is a typed version of `events.once`. */ export declare function waitForEvent, E extends keyof O & string>(ee: TypedEmitter | EventConsumer, name: E, opts?: { readonly signal?: AbortSignal; }): Promise>; /** * Casts a subtype of event emitter to the base type. This is useful when * dealing with union types which otherwise return an error saying "This * expression is not callable ... none of those signatures are compatible". */ export declare function asEmitter(ee: E): events.EventEmitter; export {};