import { EventBusSession, EventBus } from './eventBus'; import { sortBy } from 'lodash-es'; import { arrayLast } from '../index'; export class EventBusManager { private static instance?: EventBusManager; static getInstance(): EventBusManager { if (!this.instance) { this.instance = new EventBusManager(); } return this.instance; } private eventBuses: { eventBus: EventBus; priority: number }[] = []; private tempEventBusMap = new Map(); private tempEventSessionMap = new Map(); registerEventBus(eventBus: EventBus, priority: number) { this.eventBuses.push({ eventBus, priority, }); this.eventBuses = sortBy( this.eventBuses, (item: { priority: any }) => item.priority, ); } unregisterEventBus(eventBus: EventBus) { this.eventBuses = this.eventBuses.filter( item => item.eventBus !== eventBus, ); } getActiveEventBus(): EventBus | undefined { const lastEventBus = arrayLast(this.eventBuses); return lastEventBus?.eventBus; } registerTempEventBus(key: Symbol, priority = 1, eventBus?: EventBus) { if (!this.tempEventBusMap.get(key)) { const tempEventBus = eventBus || new EventBus(); this.registerEventBus(tempEventBus, priority); this.tempEventBusMap.set(key, tempEventBus); this.tempEventSessionMap.set(key, tempEventBus.getSession()); } return this.tempEventBusMap.get(key); } unRegisterTempEventBus(key: Symbol) { const currentEventSession = this.tempEventSessionMap.get(key); currentEventSession?.clear(); const currentEventBus = this.tempEventBusMap.get(key); if (currentEventBus) { this.unregisterEventBus(currentEventBus); this.tempEventSessionMap.delete(key); this.tempEventBusMap.delete(key); } } getTempEventBus(key: Symbol) { return this.tempEventBusMap.get(key); } getTempEventSession(key: Symbol) { if (!this.tempEventSessionMap.get(key)) { throw new Error( 'please register tempEventBus before get tempEventBusSession', ); } return this.tempEventSessionMap.get(key); } }