// Created on savesnippets.com ยท https://savesnippets.com/OiPhXyqqYdcBoQ class EventEmitter { #events = {}; on(event, listener) { (this.#events[event] ??= []).push(listener); return () => this.off(event, listener); } once(event, listener) { const wrapper = (...args) => { listener(...args); this.off(event, wrapper); }; return this.on(event, wrapper); } off(event, listener) { this.#events[event] = (this.#events[event] ?? []).filter((l) => l !== listener); } emit(event, ...args) { (this.#events[event] ?? []).forEach((l) => l(...args)); } } // Usage const bus = new EventEmitter(); const off = bus.on('data', (d) => console.log('received:', d)); bus.emit('data', { id: 1 }); // received: { id: 1 } off(); // unsubscribe