import EventEmitter3, { EventEmitter } from 'eventemitter3'; import { AppEvent } from '@grafana/data'; export class Emitter { private emitter: EventEmitter3; constructor() { this.emitter = new EventEmitter(); } /** * DEPRECATED. */ emit(name: string, data?: any): void; /** * Emits an `event` with `payload`. */ emit(event: AppEvent): void; emit : unknown) extends T ? Partial : never, U = any>( event: AppEvent ): void; emit(event: AppEvent, payload: T): void; emit(event: AppEvent | string, payload?: T | any): void { if (typeof event === 'string') { console.warn(`Using strings as events is deprecated and will be removed in a future version. (${event})`); this.emitter.emit(event, payload); } else { this.emitter.emit(event.name, payload); } } /** * DEPRECATED. */ on(name: string, handler: (payload?: any) => void, scope?: any): void; /** * Handles `event` with `handler()` when emitted. */ on(event: AppEvent, handler: () => void, scope?: any): void; on : unknown) extends T ? Partial : never, U = any>( event: AppEvent, handler: () => void, scope?: any ): void; on(event: AppEvent, handler: (payload: T) => void, scope?: any): void; on(event: AppEvent | string, handler: (payload?: T | any) => void, scope?: any) { if (typeof event === 'string') { console.warn(`Using strings as events is deprecated and will be removed in a future version. (${event})`); this.emitter.on(event, handler); if (scope) { const unbind = scope.$on('$destroy', () => { this.emitter.off(event, handler); unbind(); }); } return; } this.emitter.on(event.name, handler); if (scope) { const unbind = scope.$on('$destroy', () => { this.emitter.off(event.name, handler); unbind(); }); } } /** * DEPRECATED. */ off(name: string, handler: (payload?: any) => void): void; off(event: AppEvent, handler: () => void): void; off : unknown) extends T ? Partial : never, U = any>( event: AppEvent, handler: () => void, scope?: any ): void; off(event: AppEvent, handler: (payload: T) => void): void; off(event: AppEvent | string, handler: (payload?: T | any) => void) { if (typeof event === 'string') { console.warn(`Using strings as events is deprecated and will be removed in a future version. (${event})`); this.emitter.off(event, handler); return; } this.emitter.off(event.name, handler); } removeAllListeners(evt?: string) { this.emitter.removeAllListeners(evt); } getEventCount(): number { return (this.emitter as any)._eventsCount; } }