import type { z } from "zod"; import type { IRealtimeBroadcaster } from "./realtime-broadcaster.interface"; import type { RealtimeChannelDescriptor } from "./realtime-channel"; type Listener = (payload: T) => Promise | void; export class InMemoryRealtimeBroadcaster implements IRealtimeBroadcaster { private readonly listeners = new Map[]>(); async broadcast( descriptor: RealtimeChannelDescriptor>, payload: T, ): Promise { descriptor.schema.parse(payload); const arr = this.listeners.get(descriptor.name) ?? []; for (const l of arr) await l(payload); } // Test-friendly: lets unit tests subscribe directly without a Socket.IO server. subscribe( descriptor: RealtimeChannelDescriptor>, listener: Listener, ): void { const arr = this.listeners.get(descriptor.name) ?? []; arr.push(listener as Listener); this.listeners.set(descriptor.name, arr); } }