2.0 KiB
2.0 KiB
Task 4: talkd-Daemon + Queue + Mute
Blockiert durch: 02, 03. Liefert: Daemon-betriebene, serialisierte Ansagen mit persistentem Mute.
cmd/talkd: Daemon-Prozess; HTTP-Server auf127.0.0.1:<port>(Port Default7800, konfigurierbarTALK_PORT/configserver.port); Endpunkte:POST /speak— JSON{text, priority?, provider?, voice?, lang?, now?}→ enqueued, Antwort202 {id}; bei Mute:202 {muted:true}(verworfen, dokumentiertes Verhalten).GET /status— JSON: Queue-Länge, aktuelles Item, Mute-State, aktiver Provider, Version.POST /cancel— bricht aktive Ansage ab + leert Queue, Antwort200 {cancelled:n}.POST /mute,POST /unmute— toggelt persistenten Mute-State (Dateimuteim Config-Dir).
internal/queue: serialisierte Abarbeitung (eine Ansage gleichzeitig), Priorität (high > normal > low; gleiches Level: FIFO),now-Items springen vor; IDs (z. B. fortlaufend/zufällig kurz); konfigurierbares Rate-Limit existiert als Struktur, Limit-Wiring folgt Task 05 (Default unendlich in T04-Tests, dokumentiert).- CLI-Anbindung:
talk say(und Default) erkennt Daemon viaGET /status; läuft er: enqueue + sofort zurück (non-blocking Default);--waitpollt bis abgearbeitet;--nowsetztnow:true;mute/unmute/status/cancelwerden Daemon-Aufrufe mit plain Output. - Degraded Mode: Daemon antwortet nicht → Lock-File
talk.lockim Config-Dir, sequenzielles lokale Abspielen (best-effort; Kollision = warten), mute wird respektiert. - Tests an der Prozessgrenze (primäre Seam): talkd mit Fake-Provider-Endpunkt +
audio.sink=nullstarten; per CLI/HTTP enqueue; assert: Serialisierung (2 schnell nacheinander → nacheinander abgespielt, an Fake+Sink beobachtbar), Priorität, Mute-Persistenz über Daemon-Restart, cancel, non-blocking-Verhalten (say kehrt vor Abspielende zurück), Degraded Mode (Daemon tot → Lock-File-Pfad). - Abnahme: alle Prozessgrenzen-Tests grün;
talkd &+ 3 paralleletalk-Aufrufe → drei Ansagen nacheinander;talk mute→ Daemon-Restart → weiter stumm.