// Fertig gesprochene Nachrichten, bis die Browser-Quelle sie abholt. // // Warum nicht direkt im Ereignis: eine WAV von 200 Zeichen hat gut 500 KB. // Der Ereignisstrom geht an alle Browser-Sources, auch an Chat und // Statusleiste - die sollen das nicht mitschleppen. Also geht nur die ID // hinaus, und `/tts` holt sich den Ton einzeln. // // Bewusst im Arbeitsspeicher und kurzlebig: niemand braucht eine vorgelesene // Nachricht von gestern, und fremder Text soll nicht auf der Platte liegen. export type AudioAblage = { ablegen: (id: string, wav: Buffer) => void; holen: (id: string) => Buffer | undefined; leeren: () => void; }; export function createAudioAblage(opts: { maximal?: number; haltbarMs?: number } = {}): AudioAblage { const maximal = opts.maximal ?? 20; const haltbarMs = opts.haltbarMs ?? 10 * 60_000; // Map haelt die Einfuegereihenfolge; das Aelteste steht vorn. const ablage = new Map(); const aufraeumen = (jetzt: number): void => { for (const [id, e] of ablage) if (jetzt - e.seit > haltbarMs) ablage.delete(id); while (ablage.size > maximal) { const aeltestes = ablage.keys().next().value; if (aeltestes === undefined) break; ablage.delete(aeltestes); } }; return { ablegen(id, wav) { ablage.set(id, { wav, seit: Date.now() }); aufraeumen(Date.now()); }, holen(id) { aufraeumen(Date.now()); return ablage.get(id)?.wav; }, leeren: () => ablage.clear(), }; }