import EventEmitter from "node:events"; // Define a type for the events map, where keys are event names and values are event payloads export type EventsMap = Record; /** * TypedEventEmitter extends the Node.js EventEmitter with type safety * * @template T - EventsMap defining event names as keys and their payload types as values */ export class TypedEventEmitter extends EventEmitter { // Override emit to provide type checking for event names and payloads emit(event: E, ...args: [T[E]]): boolean { return super.emit(event as string, ...args); } // Override on method with proper typing on(event: E, listener: (payload: T[E]) => void): this { return super.on(event as string, listener); } // Override once method with proper typing once(event: E, listener: (payload: T[E]) => void): this { return super.once(event as string, listener); } // Override off/removeListener method with proper typing off(event: E, listener: (payload: T[E]) => void): this { return super.off(event as string, listener); } // Override addListener method with proper typing addListener( event: E, listener: (payload: T[E]) => void, ): this { return super.addListener(event as string, listener); } // Override removeListener method with proper typing removeListener( event: E, listener: (payload: T[E]) => void, ): this { return super.removeListener(event as string, listener); } } // Define an interface for your application's events export interface ServerEvents { "server:start": { port: number }; "server:stop": { code: number }; "server:ping": { test: number; timestamp: number }; "user:login": { userId: string; timestamp: number }; "user:logout": { userId: string; timestamp: number }; "instructions:execute": any; "instructions:results": any; "instructions:summary": { summaryId: string; stream: AsyncIterable; results: any; }; "file:change": { type: "add" | "change" | "unlink"; projectName: string; relativePath: string; }; "file:error": { projectName: string; error: string; }; // Add other events as needed } // Create and export a typed event emitter instance export const ee = new TypedEventEmitter();