2020-03-16 07:14:57 -05:00
|
|
|
import EventEmitter3, { EventEmitter } from 'eventemitter3';
|
2019-10-14 03:27:47 -05:00
|
|
|
import { AppEvent } from '@grafana/data';
|
2016-03-22 12:21:21 -05:00
|
|
|
|
|
|
|
export class Emitter {
|
2020-03-16 07:14:57 -05:00
|
|
|
private emitter: EventEmitter3;
|
2016-03-22 12:21:21 -05:00
|
|
|
|
|
|
|
constructor() {
|
2016-04-07 18:47:48 -05:00
|
|
|
this.emitter = new EventEmitter();
|
2016-03-22 12:21:21 -05:00
|
|
|
}
|
|
|
|
|
2019-10-14 03:27:47 -05:00
|
|
|
/**
|
|
|
|
* DEPRECATED.
|
|
|
|
*/
|
|
|
|
emit(name: string, data?: any): void;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emits an `event` with `payload`.
|
|
|
|
*/
|
|
|
|
emit<T extends undefined>(event: AppEvent<T>): void;
|
|
|
|
emit<T extends Partial<T> extends T ? Partial<T> : never>(event: AppEvent<T>): void;
|
|
|
|
emit<T>(event: AppEvent<T>, payload: T): void;
|
|
|
|
emit<T>(event: AppEvent<T> | string, payload?: T | any): void {
|
|
|
|
if (typeof event === 'string') {
|
|
|
|
console.log(`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);
|
|
|
|
}
|
2016-03-22 12:21:21 -05:00
|
|
|
}
|
|
|
|
|
2019-10-14 03:27:47 -05:00
|
|
|
/**
|
|
|
|
* DEPRECATED.
|
|
|
|
*/
|
|
|
|
on(name: string, handler: (payload?: any) => void, scope?: any): void;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles `event` with `handler()` when emitted.
|
|
|
|
*/
|
|
|
|
on<T extends undefined>(event: AppEvent<T>, handler: () => void, scope?: any): void;
|
|
|
|
on<T extends Partial<T> extends T ? Partial<T> : never>(event: AppEvent<T>, handler: () => void, scope?: any): void;
|
|
|
|
on<T>(event: AppEvent<T>, handler: (payload: T) => void, scope?: any): void;
|
|
|
|
on<T>(event: AppEvent<T> | string, handler: (payload?: T | any) => void, scope?: any) {
|
|
|
|
if (typeof event === 'string') {
|
|
|
|
console.log(`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);
|
2016-03-25 09:35:58 -05:00
|
|
|
|
2016-03-25 09:52:28 -05:00
|
|
|
if (scope) {
|
2018-08-29 07:26:50 -05:00
|
|
|
const unbind = scope.$on('$destroy', () => {
|
2019-10-14 03:27:47 -05:00
|
|
|
this.emitter.off(event.name, handler);
|
2016-10-30 09:14:18 -05:00
|
|
|
unbind();
|
2016-03-25 09:35:58 -05:00
|
|
|
});
|
|
|
|
}
|
2016-03-22 12:21:21 -05:00
|
|
|
}
|
|
|
|
|
2019-10-14 03:27:47 -05:00
|
|
|
/**
|
|
|
|
* DEPRECATED.
|
|
|
|
*/
|
|
|
|
off(name: string, handler: (payload?: any) => void): void;
|
|
|
|
|
|
|
|
off<T extends undefined>(event: AppEvent<T>, handler: () => void): void;
|
|
|
|
off<T extends Partial<T> extends T ? Partial<T> : never>(event: AppEvent<T>, handler: () => void, scope?: any): void;
|
|
|
|
off<T>(event: AppEvent<T>, handler: (payload: T) => void): void;
|
|
|
|
off<T>(event: AppEvent<T> | string, handler: (payload?: T | any) => void) {
|
|
|
|
if (typeof event === 'string') {
|
|
|
|
console.log(`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);
|
2016-10-30 09:14:18 -05:00
|
|
|
}
|
|
|
|
|
2019-10-14 03:27:47 -05:00
|
|
|
removeAllListeners(evt?: string) {
|
|
|
|
this.emitter.removeAllListeners(evt);
|
2016-03-22 12:21:21 -05:00
|
|
|
}
|
2019-03-24 10:39:55 -05:00
|
|
|
|
|
|
|
getEventCount(): number {
|
|
|
|
return (this.emitter as any)._eventsCount;
|
|
|
|
}
|
2016-03-22 12:21:21 -05:00
|
|
|
}
|