MWSE/Source/EventEmitter.js

63 lines
1.2 KiB
JavaScript

"use strict";
const events = new Map();
function on(event, callback) {
if (!events.has(event)) {
events.set(event, []);
}
events.get(event).push(callback);
}
function emit(event, ...args) {
if (events.has(event)) {
for (const callback of events.get(event)) {
try {
callback(...args);
} catch (error) {
console.error(`Event error [${event}]:`, error);
}
}
}
}
function once(event, callback) {
const wrapper = (...args) => {
off(event, wrapper);
callback(...args);
};
on(event, wrapper);
}
function off(event, callback) {
if (events.has(event)) {
const callbacks = events.get(event);
const index = callbacks.indexOf(callback);
if (index > -1) {
callbacks.splice(index, 1);
}
}
}
function removeAllListeners(event) {
if (event) {
events.delete(event);
} else {
events.clear();
}
}
function listenerCount(event) {
return events.has(event) ? events.get(event).length : 0;
}
module.exports = {
on,
emit,
once,
off,
removeAllListeners,
listenerCount,
events
};