{"version":3,"file":"EventBus.cjs","sources":["../../../src/events/EventBus.ts"],"sourcesContent":["import EventEmitter from 'eventemitter3';\nimport { Unsubscribable, Observable, Subscriber } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport {\n  EventBus,\n  LegacyEmitter,\n  BusEventHandler,\n  BusEventType,\n  LegacyEventHandler,\n  BusEvent,\n  AppEvent,\n  EventFilterOptions,\n} from './types';\n\n/**\n * @alpha\n */\nexport class EventBusSrv implements EventBus, LegacyEmitter {\n  private emitter: EventEmitter;\n  private subscribers = new Map<Function, Subscriber<BusEvent>>();\n\n  constructor() {\n    this.emitter = new EventEmitter();\n  }\n\n  publish<T extends BusEvent>(event: T): void {\n    this.emitter.emit(event.type, event);\n  }\n\n  subscribe<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n    return this.getStream(typeFilter).subscribe({ next: handler });\n  }\n\n  getStream<T extends BusEvent = BusEvent>(eventType: BusEventType<T>): Observable<T> {\n    return new Observable<T>((observer) => {\n      const handler = (event: T) => {\n        observer.next(event);\n      };\n\n      this.emitter.on(eventType.type, handler);\n      this.subscribers.set(handler, observer);\n\n      return () => {\n        this.emitter.off(eventType.type, handler);\n        this.subscribers.delete(handler);\n      };\n    });\n  }\n\n  newScopedBus(key: string, filter?: EventFilterOptions): ScopedEventBus {\n    return new ScopedEventBus([key], this, filter);\n  }\n\n  /**\n   * Legacy functions\n   */\n  emit<T>(event: AppEvent<T> | string, payload?: T): void {\n    // console.log(`Deprecated emitter function used (emit), use $emit`);\n\n    if (typeof event === 'string') {\n      this.emitter.emit(event, { type: event, payload });\n    } else {\n      this.emitter.emit(event.name, { type: event.name, payload });\n    }\n  }\n\n  on<T>(event: AppEvent<T> | string, handler: LegacyEventHandler<T>) {\n    // console.log(`Deprecated emitter function used (on), use $on`);\n\n    // need this wrapper to make old events compatible with old handlers\n    handler.wrapper = (emittedEvent: BusEvent) => {\n      handler(emittedEvent.payload);\n    };\n\n    if (typeof event === 'string') {\n      this.emitter.on(event, handler.wrapper);\n    } else {\n      this.emitter.on(event.name, handler.wrapper);\n    }\n  }\n\n  off<T>(event: AppEvent<T> | string, handler: LegacyEventHandler<T>) {\n    if (typeof event === 'string') {\n      this.emitter.off(event, handler.wrapper);\n      return;\n    }\n\n    this.emitter.off(event.name, handler.wrapper);\n  }\n\n  removeAllListeners() {\n    this.emitter.removeAllListeners();\n    for (const [key, sub] of this.subscribers) {\n      sub.complete();\n      this.subscribers.delete(key);\n    }\n  }\n}\n\n/**\n * Wraps EventBus and adds a source to help with identifying if a subscriber should react to the event or not.\n */\nclass ScopedEventBus implements EventBus {\n  // will be mutated by panel runners\n  filterConfig: EventFilterOptions;\n\n  // The path is not yet exposed, but can be used to indicate nested groups and support faster filtering\n  constructor(\n    public path: string[],\n    private eventBus: EventBus,\n    filter?: EventFilterOptions\n  ) {\n    this.filterConfig = filter ?? { onlyLocal: false };\n  }\n\n  publish<T extends BusEvent>(event: T): void {\n    if (!event.origin) {\n      event.origin = this;\n    }\n    this.eventBus.publish(event);\n  }\n\n  filter<T extends BusEvent>(event: T) {\n    if (this.filterConfig.onlyLocal) {\n      return event.origin === this;\n    }\n    return true;\n  }\n\n  getStream<T extends BusEvent>(eventType: BusEventType<T>): Observable<T> {\n    return this.eventBus.getStream(eventType).pipe(filter(this.filter.bind(this)));\n  }\n\n  // syntax sugar\n  subscribe<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n    return this.getStream(typeFilter).subscribe({ next: handler });\n  }\n\n  removeAllListeners(): void {\n    this.eventBus.removeAllListeners();\n  }\n\n  /**\n   * Creates a nested event bus structure\n   */\n  newScopedBus(key: string, filter: EventFilterOptions): EventBus {\n    return new ScopedEventBus([...this.path, key], this, filter);\n  }\n}\n"],"names":["EventEmitter","Observable","filter"],"mappings":"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"}