/** * Explain events... * * @_section api/utils/events:Events [about-events] */ import { defineProperties } from "./properties.js"; export type Listener = (...args: Array) => void; export interface EventEmitterable { on(event: T, listener: Listener): Promise; once(event: T, listener: Listener): Promise; emit(event: T, ...args: Array): Promise; listenerCount(event?: T): Promise; listeners(event?: T): Promise>; off(event: T, listener?: Listener): Promise; removeAllListeners(event?: T): Promise; // Alias for "on" addListener(event: T, listener: Listener): Promise; // Alias for "off" removeListener(event: T, listener: Listener): Promise; } export class EventPayload { readonly filter!: T; readonly emitter!: EventEmitterable; readonly #listener: null | Listener; constructor(emitter: EventEmitterable, listener: null | Listener, filter: T) { this.#listener = listener; defineProperties>(this, { emitter, filter }); } async removeListener(): Promise { if (this.#listener == null) { return; } await this.emitter.off(this.filter, this.#listener); } }