UNPKG

4nm

Version:

TypeScript reimplementation of Telegram's official library for communicating with Telegram Web Apps.

72 lines (71 loc) 2.09 kB
/** * EventEmitter represents classic event emitter. It allows usage of known * events and expected types as long as unknown events. */ export class EventEmitter { /** * List of currently bound events listeners. * @private */ listeners = {}; /** * List of currently bound global event listeners. * @private */ globalListeners = []; emit(event, ...args) { // Emit global listeners. this.globalListeners.forEach(l => l(event, ...args)); // Emit event specific listeners. const listeners = this.listeners[event]; if (listeners === undefined) { return; } listeners.forEach(l => l(...args)); } /** * Emits unknown event. This function is recognized dangerous and should be * used carefully as long as this function ignores event typings. * @param event - event name. * @param args - list of event listener arguments. */ emitUnsafe(event, ...args) { this.emit(event, ...args); } on(event, listener) { const listeners = this.listeners[event]; if (listeners === undefined) { this.listeners[event] = [listener]; } else { listeners.push(listener); } } off(event, listener) { const listeners = this.listeners[event]; if (listeners === undefined) { return; } const idx = listeners.indexOf(listener); if (idx >= 0) { listeners.splice(idx, 1); } } /** * Subscribes to any events appearing. * @param listener - events listener. */ subscribe(listener) { this.globalListeners.push(listener); } /** * Removes listener from global listeners. * @param listener - events listener. */ unsubscribe(listener) { const idx = this.globalListeners.indexOf(listener); if (idx >= 0) { this.globalListeners.splice(idx, 1); } } }