Files
meridian-os/js/core/bus.js

37 lines
751 B
JavaScript

/**
* Simple pub/sub event bus.
* on(evt, cb) - subscribe
* emit(evt, data) - publish
*/
const Bus = (() => {
const listeners = new Map();
return {
on(evt, cb) {
if (!listeners.has(evt)) listeners.set(evt, new Set());
listeners.get(evt).add(cb);
return () => this.off(evt, cb);
},
off(evt, cb) {
const set = listeners.get(evt);
if (set) {
set.delete(cb);
if (set.size === 0) listeners.delete(evt);
}
},
emit(evt, data) {
const set = listeners.get(evt);
if (set) {
for (const cb of set) {
try { cb(data); } catch (e) { console.error(`Bus emit error (${evt}):`, e); }
}
}
}
};
})();
export default Bus;
export { Bus };