import { type LazyImport, type Constructor } from '@poppinss/utils/types'; /** * Data types for event name */ export type AllowedEventTypes = string | symbol | number | Constructor; /** * Data structure for a buffered event * * @template Event - The event type * @template Data - The data type */ export type BufferedEvent = { event: Event; data: Data; }; /** * Event list item inside buffered items * * @template EventsList - The events list type */ export type BufferedEventsList = { [Name in keyof EventsList]: BufferedEvent; }[keyof EventsList] | BufferedEvent, any>; /** * Representation of listener method on the listener class. The * spread args can type hint dependencies and container will * resolve them * * @template Data - The event data type */ export type ListenerMethod = (data: Data, ...args: any[]) => any | Promise; /** * The event listener defined as an inline callback * * @template Data - The event data type */ export type ListenerFn = (data: Data) => any | Promise; /** * Returns a union of methods from a listener that accepts * the event data as the first argument. * * @template Listener - The listener class constructor * @template Data - The event data type */ export type GetListenersMethods, Data> = { [K in keyof InstanceType]: InstanceType[K] extends ListenerMethod ? K : never; }[keyof InstanceType]; /** * Representation of listener class with handle method * * @template Data - The event data type */ export type ListenerClassWithHandleMethod = Constructor<{ handle: ListenerMethod; }>; /** * The event listener defined as an inline callback, string * listener class reference or a lazily imported listener * * @template Data - The event data type * @template ListenerClass - The listener class constructor */ export type Listener> = ListenerFn | string | [LazyImport | ListenerClass, GetListenersMethods?]; /** * The EmitterLike interface exposes a less strict API to accept * emitter as an argument to emit events. * * @template EventsList - The events list type */ export interface EmitterLike> { /** * Emit event. The event listeners will be called asynchronously * in parallel. * * You can await this method to wait for events listeners to finish * * @param event - The event to emit * @param data - The data to pass to listeners * @returns Promise that resolves when all listeners finish */ emit>(event: Event, data: InstanceType): Promise; emit(event: Name, data: EventsList[Name]): Promise; /** * Emit events serially. The event listeners will be called asynchronously * in the same sequence as they are registered. * * You can await this method to wait for events listeners to finish * * @param event - The event to emit * @param data - The data to pass to listeners * @returns Promise that resolves when all listeners finish */ emitSerial>(event: Event, data: InstanceType): Promise; emitSerial(event: Name, data: EventsList[Name]): Promise; /** * Get count of listeners for a given event or all the events * * @param event - The event to count listeners for (optional) * @returns The number of listeners */ listenerCount(event?: keyof EventsList | Constructor): number; /** * Find if an event has one or more listeners * * @param event - The event to check listeners for (optional) * @returns True if the event has listeners */ hasListeners(event?: keyof EventsList | Constructor): boolean; } /** * Data shared via the event.dispatch tracing channel */ export type EventDispatchData = { event: AllowedEventTypes; data: unknown; };