The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/apps/meteor/client/lib/streamer/emitter.ts

52 lines
1.3 KiB

export type StreamArgs = unknown[];
export type EventHandler<TArgs extends StreamArgs = any> = (...args: TArgs) => void;
type HandlerMap = {
[event: string]: EventHandler[] | undefined;
};
export class EV {
private handlers: HandlerMap = {};
emit(event: string, ...args: StreamArgs): void {
this.handlers[event]?.forEach((handler) => handler.apply(this, args));
}
emitWithScope(event: string, scope: unknown, ...args: StreamArgs): void {
this.handlers[event]?.forEach((handler) => handler.apply(scope, args));
}
listenerCount(event: string): number {
return this.handlers[event]?.length ?? 0;
}
on<TArgs extends StreamArgs>(event: string, callback: EventHandler<TArgs>): void {
if (!this.handlers[event]) {
this.handlers[event] = [];
}
this.handlers[event].push(callback);
}
once(event: string, callback: EventHandler): void {
const onetimeCallback: EventHandler = (...args) => {
this.removeListener(event, onetimeCallback);
callback.apply(this, args);
};
this.on(event, onetimeCallback);
}
removeListener(event: string, callback: EventHandler): void {
const handlers = this.handlers[event];
if (!handlers) {
return;
}
const index = handlers.indexOf(callback);
if (index > -1) {
handlers.splice(index, 1);
}
}
removeAllListeners(event: string): void {
this.handlers[event] = undefined;
}
}