@tlgr/component
Version:
telegram component builder
92 lines (91 loc) • 2.75 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const eventemitter2_1 = __importDefault(require("eventemitter2"));
/**
* Common component builder.
*
* **NOTE**: This component have not `render()` function. Use `InlineComponent` instead.
*
* @export
* @abstract
* @class Component
* @template Events events tuple. e.g. `[Click, Submit]` etc.
* @template EventsCollection do not override. This is helper.
*/
class Component {
constructor(bot) {
this.bot = bot;
this.emitter = new eventemitter2_1.default({ delimiter: ':', wildcard: true, verboseMemoryLeak: true });
}
/**
* Subscribes to exact event by name and executes function
*
* @template Name
* @template Payload
* @param {Name} event
* @param {(...payload: RestForArrayType<Payload>) => void} listener
* @return {*} {EventEmitter}
* @memberof Component
*/
on(event, listener) {
this.emitter.on(event.toString(), (...args) => {
listener(...args);
});
return this;
}
/**
* Subscribe on any event
*
* @param {(eventName: string, ...args: any[]) => void} listener
* @memberof Component
*/
any(listener) {
this.emitter.onAny(function (event, value) {
if (Array.isArray(event)) {
event.forEach(e => {
listener(e, value);
});
return;
}
listener(event, value);
return;
});
}
once(event, listener) {
this.emitter.once(event.toString(), (...args) => {
listener(...args);
});
return this;
}
emit(event) {
return this.emitter.emit(event.name, ...event.payload);
}
cleanup(event, force = false) {
if (event) {
if (typeof event === 'string') {
const fns = this.emitter.listeners(event);
fns.forEach(fn => {
if (force) {
this.emitter.offAny(fn);
}
this.emitter.removeListener(event, fn);
});
return this;
}
const fns = this.emitter.listeners(event.name);
fns.forEach(fn => {
if (force) {
this.emitter.offAny(fn);
}
this.emitter.removeListener(event.name, fn);
});
return this;
}
this.emitter.removeAllListeners();
return this;
}
}
exports.default = Component;