2022-12-22 12:37:33 +08:00

101 lines
2.8 KiB
TypeScript

import { IPublicApiEvent } from '@alilc/lowcode-types';
import { Logger } from '@alilc/lowcode-utils';
import EventEmitter from 'events';
const logger = new Logger({ level: 'warn', bizName: 'event-bus' });
const moduleLogger = new Logger({ level: 'warn', bizName: 'module-event-bus' });
export interface IEventBus extends IPublicApiEvent {
removeListener(event: string | symbol, listener: (...args: any[]) => void): any;
addListener(event: string | symbol, listener: (...args: any[]) => void): any;
setMaxListeners(n: number): any;
removeAllListeners(event?: string | symbol): any;
}
export class EventBus implements IEventBus {
private readonly eventEmitter: EventEmitter;
private readonly name?: string;
/**
* 内核触发的事件名
*/
readonly names = [];
constructor(emitter: EventEmitter, name?: string) {
this.eventEmitter = emitter;
this.name = name;
}
private getMsgPrefix(type: string): string {
if (this.name && this.name.length > 0) {
return `[${this.name}][event-${type}]`;
} else {
return `[*][event-${type}]`;
}
}
private getLogger(): Logger {
if (this.name && this.name.length > 0) {
return moduleLogger;
} else {
return logger;
}
}
/**
* 监听事件
* @param event 事件名称
* @param listener 事件回调
*/
on(event: string, listener: (...args: any[]) => void): () => void {
this.eventEmitter.on(event, listener);
this.getLogger().debug(`${this.getMsgPrefix('on')} ${event}`);
return () => {
this.off(event, listener);
};
}
/**
* 取消监听事件
* @param event 事件名称
* @param listener 事件回调
*/
off(event: string, listener: (...args: any[]) => void) {
this.eventEmitter.off(event, listener);
this.getLogger().debug(`${this.getMsgPrefix('off')} ${event}`);
}
/**
* 触发事件
* @param event 事件名称
* @param args 事件参数
* @returns
*/
emit(event: string, ...args: any[]) {
this.eventEmitter.emit(event, ...args);
this.getLogger().debug(`${this.getMsgPrefix('emit')} name: ${event}, args: `, ...args);
}
removeListener(event: string | symbol, listener: (...args: any[]) => void): any {
return this.eventEmitter.removeListener(event, listener);
}
addListener(event: string | symbol, listener: (...args: any[]) => void): any {
return this.eventEmitter.addListener(event, listener);
}
setMaxListeners(n: number): any {
return this.eventEmitter.setMaxListeners(n);
}
removeAllListeners(event?: string | symbol): any {
return this.eventEmitter.removeAllListeners(event);
}
}
export const createModuleEventBus = (moduleName: string, maxListeners?: number): IEventBus => {
const emitter = new EventEmitter();
if (maxListeners) {
emitter.setMaxListeners(maxListeners);
}
return new EventBus(emitter, moduleName);
};