Spaces:
Running
Running
| import { asyncHandler } from '@helpers/async-handler'; | |
| import EventEmitter from 'node:events'; | |
| /** | |
| * EventsManager is a singleton class that manages events. | |
| * It uses the EventEmitter class from Node.js to handle events. | |
| */ | |
| export class EventsManager { | |
| private static instance: EventsManager; | |
| private emitter: EventEmitter; | |
| private constructor() { | |
| this.emitter = new EventEmitter(); | |
| } | |
| public static getInstance(): EventsManager { | |
| if (!EventsManager.instance) { | |
| EventsManager.instance = new EventsManager(); | |
| } | |
| return EventsManager.instance; | |
| } | |
| /** | |
| * Register an event listener. | |
| * @param event The event name. | |
| * @param listener The listener function. | |
| */ | |
| public static on(event: string, listener: (...args: any[]) => void | Promise<void>): void { | |
| try { | |
| EventsManager.getInstance().emitter.on(event, asyncHandler(listener)); | |
| } catch (error) { | |
| console.error(error); | |
| } | |
| } | |
| /** | |
| * Remove an event listener. | |
| * @param event The event name. | |
| * @param listener The listener function. | |
| */ | |
| public static emit(event: string, ...args: any[]): void { | |
| EventsManager.getInstance().emitter.emit(event, ...args); | |
| } | |
| /** | |
| * Create a queue to store events. | |
| * @returns An EventsQueue object. | |
| * @see EventsQueue | |
| */ | |
| public createQueue() { | |
| return new class EventsQueue { | |
| private queue: any[] = []; | |
| public add(event: string, ...args: any[]): void { | |
| this.queue.push({ event, args }); | |
| } | |
| public clear() { | |
| this.queue = []; | |
| } | |
| public process() { | |
| this.queue.forEach((item) => { | |
| EventsManager.emit(item.event, ...item.args); | |
| }); | |
| this.clear(); | |
| } | |
| } | |
| } | |
| } | |