PortableEventBus.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. type Listener = (...args: any[]) => void;
  2. /**
  3. * 轻量事件总线(可替换):默认本地发布订阅
  4. * - 迁移到有全局 EventBus 的项目时,可替换为项目总线
  5. */
  6. export class PortableEventBus {
  7. private listeners: Map<string, Set<Listener>> = new Map();
  8. on(event: string, listener: Listener) {
  9. if (!this.listeners.has(event)) this.listeners.set(event, new Set());
  10. this.listeners.get(event)!.add(listener);
  11. }
  12. once(event: string, listener: Listener) {
  13. const wrap: Listener = (...args: any[]) => {
  14. this.off(event, wrap);
  15. listener(...args);
  16. };
  17. this.on(event, wrap);
  18. }
  19. off(event: string, listener: Listener) {
  20. this.listeners.get(event)?.delete(listener);
  21. }
  22. emit(event: string, ...args: any[]) {
  23. const set = this.listeners.get(event);
  24. if (!set) return;
  25. for (const l of Array.from(set)) {
  26. try { l(...args); } catch { /* swallow */ }
  27. }
  28. }
  29. }
  30. export const BulletEvents = {
  31. BULLET_CREATE_REQUEST: 'BULLET_CREATE_REQUEST',
  32. BULLET_HIT: 'BULLET_HIT',
  33. BULLET_DESTROY: 'BULLET_DESTROY'
  34. } as const;