123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /**
- * Events allow for applications to use the observer pattern, which
- * allows subscribing and publishing events, outside the normal
- * execution paths.
- *
- * @_section api/utils/events:Events [about-events]
- */
- import { defineProperties } from "./properties.js";
- /**
- * A callback function called when a an event is triggered.
- */
- export type Listener = (...args: Array<any>) => void;
- /**
- * An **EventEmitterable** behaves similar to an EventEmitter
- * except provides async access to its methods.
- *
- * An EventEmitter implements the observer pattern.
- */
- export interface EventEmitterable<T> {
- /**
- * Registers a %%listener%% that is called whenever the
- * %%event%% occurs until unregistered.
- */
- on(event: T, listener: Listener): Promise<this>;
- /**
- * Registers a %%listener%% that is called the next time
- * %%event%% occurs.
- */
- once(event: T, listener: Listener): Promise<this>;
- /**
- * Triggers each listener for %%event%% with the %%args%%.
- */
- emit(event: T, ...args: Array<any>): Promise<boolean>;
- /**
- * Resolves to the number of listeners for %%event%%.
- */
- listenerCount(event?: T): Promise<number>;
- /**
- * Resolves to the listeners for %%event%%.
- */
- listeners(event?: T): Promise<Array<Listener>>;
- /**
- * Unregister the %%listener%% for %%event%%. If %%listener%%
- * is unspecified, all listeners are unregistered.
- */
- off(event: T, listener?: Listener): Promise<this>;
- /**
- * Unregister all listeners for %%event%%.
- */
- removeAllListeners(event?: T): Promise<this>;
- /**
- * Alias for [[on]].
- */
- addListener(event: T, listener: Listener): Promise<this>;
- /**
- * Alias for [[off]].
- */
- removeListener(event: T, listener: Listener): Promise<this>;
- }
- /**
- * When an [[EventEmitterable]] triggers a [[Listener]], the
- * callback always ahas one additional argument passed, which is
- * an **EventPayload**.
- */
- export class EventPayload<T> {
- /**
- * The event filter.
- */
- readonly filter!: T;
- /**
- * The **EventEmitterable**.
- */
- readonly emitter!: EventEmitterable<T>;
- readonly #listener: null | Listener;
- /**
- * Create a new **EventPayload** for %%emitter%% with
- * the %%listener%% and for %%filter%%.
- */
- constructor(emitter: EventEmitterable<T>, listener: null | Listener, filter: T) {
- this.#listener = listener;
- defineProperties<EventPayload<any>>(this, { emitter, filter });
- }
- /**
- * Unregister the triggered listener for future events.
- */
- async removeListener(): Promise<void> {
- if (this.#listener == null) { return; }
- await this.emitter.off(this.filter, this.#listener);
- }
- }
|