4nm
Version:
TypeScript reimplementation of Telegram's official library for communicating with Telegram Web Apps.
72 lines (71 loc) • 2.09 kB
JavaScript
/**
* 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);
}
}
}