import cron, {validate} from "node-cron"; import {Class} from "../types/Class"; import {randomUUID} from "node:crypto"; export type EventConfiguration = { name: string, maxExecutions?: number, } export interface TimedEvent { configuration: EventConfiguration, cronExpression: string, execute: () => void } export class EventHandler { private eventHandlers: Map> = new Map(); constructor() { } public addHandler(eventName: string, handler: (event: T) => void): string { if (!this.eventHandlers.has(eventName)) { this.eventHandlers.set(eventName, new Map()); } const id = randomUUID(); this.eventHandlers.get(eventName)?.set(id, handler); return id; } public removeHandler(eventName: string, id: string) { if (!this.eventHandlers.has(eventName)) { return; } const localEventHandlers = this.eventHandlers.get(eventName); if (!localEventHandlers || !localEventHandlers.has(id)) { return; } localEventHandlers.delete(id); } public dispatch(event: T) { const eventName = event.constructor.name; if (!this.eventHandlers.has(eventName)) { return; } this.eventHandlers.get(eventName)?.forEach((handler) => { handler(event); }) } public addTimed(event: TimedEvent) { if (!cron.validate(event.cronExpression)) { throw new Error(`Can't create event with name '${event.configuration.name}': Invalid cron expression.`) } cron.schedule(event.cronExpression, event.execute.bind(event), event.configuration); } }