@ayanaware/bento
Version:
Modular runtime framework designed to solve complex tasks
75 lines • 2.27 kB
JavaScript
;
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