63 lines
1.2 KiB
JavaScript
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
|
|
};
|