mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-13 04:03:07 +00:00
101 lines
2.8 KiB
TypeScript
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);
|
|
}; |