// Local type aliases matching the contracts in @repo/core-events. // Kept inline to avoid a build-graph cycle between core-testing and core-events // (mirrors the recording-tracer / recording-logger pattern). import type { z } from "zod"; type EventDescriptor = { readonly name: TName; readonly schema: TSchema; }; type EventHandler = (event: T) => Promise; interface IEventBus { publish( descriptor: EventDescriptor>, payload: T, ): Promise; subscribe( descriptor: EventDescriptor>, consumerFeature: string, handler: EventHandler, ): void; } export class RecordingEventBus implements IEventBus { readonly published: { name: string; payload: unknown }[] = []; private readonly handlers = new Map[]>(); async publish( descriptor: EventDescriptor>, payload: T, ): Promise { descriptor.schema.parse(payload); this.published.push({ name: descriptor.name, payload }); for (const h of this.handlers.get(descriptor.name) ?? []) await h(payload); } subscribe( descriptor: EventDescriptor>, _consumerFeature: string, handler: EventHandler, ): void { const arr = this.handlers.get(descriptor.name) ?? []; arr.push(handler as EventHandler); this.handlers.set(descriptor.name, arr); } }