wise-json-db
Version:
Blazing fast, crash-proof embedded JSON database for Node.js with batch operations, TTL, indexes, and segmented checkpointing.
72 lines (64 loc) • 2.39 kB
JavaScript
// collection/events.js
const logger = require('../logger');
/**
* Класс EventEmitter для локальных событий в Collection.
*/
class CollectionEventEmitter {
constructor(collectionName) {
this._listeners = {};
this._collectionName = collectionName || 'unnamed';
}
/**
* Подписка на событие.
* @param {string} eventName
* @param {Function} listener
*/
on(eventName, listener) {
if (typeof listener !== 'function') {
throw new Error(`Collection (${this._collectionName}): listener должен быть функцией.`);
}
if (!this._listeners[eventName]) {
this._listeners[eventName] = [];
}
this._listeners[eventName].push(listener);
}
/**
* Отписка от события. Если listener не указан — удаляет всех.
* @param {string} eventName
* @param {Function} [listener]
*/
off(eventName, listener) {
if (!this._listeners[eventName]) return;
if (!listener) {
delete this._listeners[eventName];
} else {
this._listeners[eventName] = this._listeners[eventName].filter(l => l !== listener);
if (this._listeners[eventName].length === 0) {
delete this._listeners[eventName];
}
}
}
/**
* Вызов события.
* @param {string} eventName
* @param {...any} args
*/
emit(eventName, ...args) {
const listeners = this._listeners[eventName];
if (!listeners || listeners.length === 0) return;
const filteredArgs = args.filter(arg => arg !== undefined);
for (const listener of listeners) {
try {
const result = listener(...filteredArgs);
if (result instanceof Promise) {
result.catch(e =>
logger.error(`Collection (${this._collectionName}) async event error '${eventName}': ${e.message}`)
);
}
} catch (e) {
logger.error(`Collection (${this._collectionName}) sync event error '${eventName}': ${e.message}`);
}
}
}
}
module.exports = CollectionEventEmitter;