ethers.js/src.ts/utils/events.ts

42 lines
1.3 KiB
TypeScript
Raw Normal View History

2022-11-28 05:50:34 +03:00
/**
* Explain events...
*
2022-12-03 05:23:13 +03:00
* @_section api/utils/events:Events [about-events]
2022-11-28 05:50:34 +03:00
*/
2022-09-05 23:14:43 +03:00
import { defineProperties } from "./properties.js";
export type Listener = (...args: Array<any>) => void;
export interface EventEmitterable<T> {
on(event: T, listener: Listener): Promise<this>;
once(event: T, listener: Listener): Promise<this>;
emit(event: T, ...args: Array<any>): Promise<boolean>;
listenerCount(event?: T): Promise<number>;
listeners(event?: T): Promise<Array<Listener>>;
off(event: T, listener?: Listener): Promise<this>;
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>;
}
export class EventPayload<T> {
readonly filter!: T;
readonly emitter!: EventEmitterable<T>;
readonly #listener: null | Listener;
constructor(emitter: EventEmitterable<T>, listener: null | Listener, filter: T) {
this.#listener = listener;
defineProperties<EventPayload<any>>(this, { emitter, filter });
}
async removeListener(): Promise<void> {
if (this.#listener == null) { return; }
await this.emitter.off(this.filter, this.#listener);
}
}