UNPKG

@ayanaware/bento

Version:

Modular runtime framework designed to solve complex tasks

75 lines 2.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LiteEmitter = exports.LiteEmitterError = void 0; const errors_1 = require("@ayanaware/errors"); class LiteEmitterError extends errors_1.GenericError { } exports.LiteEmitterError = LiteEmitterError; /** * LiteEmitter is a very simplified implementation of a eventemitter. */ class LiteEmitter { constructor() { this.handlers = new Map(); } /** * Add a handler function for a given event * * @param name name of event * @param fn handler function */ addListener(name, fn) { // create new set if required if (!this.handlers.has(name)) this.handlers.set(name, new Set()); // add the new handler const handlers = this.handlers.get(name); handlers.add(fn); } /** * Remove one or all handler functions for a given event * * @param name name of event * @param fn optional handler to detach */ removeListener(name, fn) { const handlers = this.handlers.get(name); if (!handlers) return; // a specfic fn was provided, try to find it if (fn && handlers.has(fn)) { handlers.delete(fn); // if no handlers left, delete the set if (handlers.size === 0) this.handlers.delete(name); } else { // delete all handlers this.handlers.delete(name); } } /** * Emit a new event to handlers * * @param name name of event * @param args event arguments */ emit(name, ...args) { const handlers = this.handlers.get(name); if (!handlers) return; for (const handler of handlers) { try { handler(...args); } catch (e) { if (name === 'error') throw new LiteEmitterError('Caught Error in "error" handler function').setCause(e); // emit as an error this.emit('error', new LiteEmitterError('Caught Error in handler function').setCause(e)); } } } } exports.LiteEmitter = LiteEmitter; //# sourceMappingURL=LiteEmitter.js.map