Minimal Typed Event Emitter
Build a small publish and subscribe emitter that registers listeners per event name and supports one-shot subscribers and clean removal.
Code
export class EventEmitter {
constructor() {
this.listeners = new Map();
}
on(event, handler) {
const set = this.listeners.get(event) ?? new Set();
set.add(handler);
this.listeners.set(event, set);
return () => this.off(event, handler);
}
once(event, handler) {
const off = this.on(event, (payload) => {
off();
handler(payload);
});
return off;
}
off(event, handler) {
const set = this.listeners.get(event);
if (set) set.delete(handler);
}
emit(event, payload) {
const set = this.listeners.get(event);
if (!set) return 0;
for (const handler of [...set]) handler(payload);
return set.size;
}
}Report a problem with this exampleOpens a pre-filled issue on GitHub.