From dd580661eb633b207693a00c95cc6d5d544c124f Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Sun, 19 Apr 2026 12:05:24 +0800 Subject: [PATCH] feat: add EventBus core module --- src/core/EventBus.ts | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/core/EventBus.ts diff --git a/src/core/EventBus.ts b/src/core/EventBus.ts new file mode 100644 index 0000000..6a2d343 --- /dev/null +++ b/src/core/EventBus.ts @@ -0,0 +1,57 @@ +type EventCallback = (...args: any[]) => void; + +class EventBus { + private events: Map> = new Map(); + + on(event: string, callback: EventCallback): () => void { + if (!this.events.has(event)) { + this.events.set(event, new Set()); + } + this.events.get(event)!.add(callback); + + // 返回取消订阅函数 + return () => this.off(event, callback); + } + + off(event: string, callback: EventCallback): void { + const callbacks = this.events.get(event); + if (callbacks) { + callbacks.delete(callback); + if (callbacks.size === 0) { + this.events.delete(event); + } + } + } + + once(event: string, callback: EventCallback): () => void { + const onceCallback: EventCallback = (...args) => { + callback(...args); + this.off(event, onceCallback); + }; + return this.on(event, onceCallback); + } + + emit(event: string, ...args: any[]): void { + const callbacks = this.events.get(event); + if (callbacks) { + callbacks.forEach(cb => { + try { + cb(...args); + } catch (e) { + console.error(`EventBus: error in event "${event}"`, e); + } + }); + } + } + + clear(): void { + this.events.clear(); + } + + getEventCount(): number { + return this.events.size; + } +} + +export const eventBus = new EventBus(); +export default eventBus;