UNPKG

@tlgr/component

Version:
92 lines (91 loc) 2.75 kB
"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;