38 lines
742 B
JavaScript
38 lines
742 B
JavaScript
/* exported EventEmitter */
|
|
'use strict';
|
|
|
|
function EventEmitter() {
|
|
const listeners = new Map();
|
|
return {
|
|
on(ev, cb, opt) {
|
|
if (!listeners.has(ev)) {
|
|
listeners.set(ev, new Map());
|
|
}
|
|
listeners.get(ev).set(cb, opt);
|
|
if (opt && opt.runNow) {
|
|
cb();
|
|
}
|
|
},
|
|
off(ev, cb) {
|
|
const cbs = listeners.get(ev);
|
|
if (cbs) {
|
|
cbs.delete(cb);
|
|
}
|
|
},
|
|
emit(ev, ...args) {
|
|
const cbs = listeners.get(ev);
|
|
if (!cbs) return;
|
|
for (const [cb, opt] of cbs.entries()) {
|
|
try {
|
|
cb(...args);
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
if (opt && opt.once) {
|
|
cbs.delete(cb);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}
|