import { LocalEvent } from "../types/local-event"; import { Logger } from "./logger"; /** * Listeners map. * * @export * @interface ListenerMap */ export interface ListenerMap { [event: string]: ListenerFunction[]; } type ListenerData = any; // eslint-disable-line export type ListenerFunction = (data?: ListenerData) => void; /** * Basic implementation of an EventEmitter. * * @export * @abstract * @class EventEmitter */ export abstract class EventEmitter { /** * Add a new listener. * * @static * @param {LocalEvent} event Event name. * @param {ListenerFunction} listener Listener function. * @memberof EventEmitter */ public static on(event: LocalEvent, listener: ListenerFunction) { let bucket = this.listeners[event]; if (bucket == null) { this.listeners[event] = bucket = []; } bucket.push(listener); } /** * Remove all listeners from an event. * * @static * @param {LocalEvent} event Event name. * @memberof EventEmitter */ public static off(event: LocalEvent) { this.listeners[event] = []; } /** * Trigger an event. * * @static * @param {LocalEvent} event Event name. * @param {ListenerData} [data] Event data. * @memberof EventEmitter */ public static trigger(event: LocalEvent, data?: ListenerData) { try { const bucket = this.listeners[event]; if (bucket != null) { for (const listener of bucket) { listener(data); } } } catch (err) { Logger.log(err); } } private static listeners: ListenerMap = {}; }