hivest-js
Version:
A simple, fast and minimalist framework for Node.js that allows you to create modular applications with dependency injection using decorators
113 lines • 3.73 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventManager = void 0;
require("reflect-metadata");
const tsyringe_1 = require("tsyringe");
let EventManager = class EventManager {
constructor() {
this.listeners = new Map();
this.emitters = new Map();
}
/**
* Register event listeners from a class using metadata
*/
registerListeners(target) {
const listeners = Reflect.getMetadata('event:listeners', target.constructor) || [];
listeners.forEach((listener) => {
this.on(listener.eventName, listener.handler.bind(target));
});
}
/**
* Register event emitters from a class using metadata
*/
registerEmitters(target) {
const emitters = Reflect.getMetadata('event:emitters', target.constructor) || [];
emitters.forEach((emitter) => {
if (!this.emitters.has(emitter.eventName)) {
this.emitters.set(emitter.eventName, []);
}
this.emitters.get(emitter.eventName).push(emitter);
});
}
/**
* Register a listener for a specific event
*/
on(eventName, handler) {
if (!this.listeners.has(eventName)) {
this.listeners.set(eventName, []);
}
this.listeners.get(eventName).push(handler);
}
/**
* Remove a specific listener for an event
*/
off(eventName, handler) {
const handlers = this.listeners.get(eventName);
if (handlers) {
const index = handlers.indexOf(handler);
if (index > -1) {
handlers.splice(index, 1);
}
}
}
/**
* Remove all listeners for an event
*/
offAll(eventName) {
this.listeners.delete(eventName);
}
/**
* Emit an event to all registered listeners
*/
async emit(eventName, data) {
const handlers = this.listeners.get(eventName);
if (handlers) {
const promises = handlers.map((handler) => {
try {
return Promise.resolve(handler(data));
}
catch (error) {
console.error(`Error in event handler for ${eventName}:`, error);
return Promise.resolve();
}
});
await Promise.all(promises);
}
}
/**
* Get all registered listeners for an event
*/
getListeners(eventName) {
return this.listeners.get(eventName) || [];
}
/**
* Get all registered emitters for an event
*/
getEmitters(eventName) {
return this.emitters.get(eventName) || [];
}
/**
* Get all registered event names
*/
getEventNames() {
return Array.from(this.listeners.keys());
}
/**
* Clear all listeners and emitters
*/
clear() {
this.listeners.clear();
this.emitters.clear();
}
};
exports.EventManager = EventManager;
exports.EventManager = EventManager = __decorate([
(0, tsyringe_1.injectable)()
], EventManager);
//# sourceMappingURL=event-manager.js.map