Werkzeug-Musterstrecke
Referenzimplementierung für Upload → Verarbeitung → Download. Sync oder asynchron als Job (@/jobs). Ohne Datenbank, ohne Auth.
queued.
idleInitialzustand — Dropzone sichtbar, keine Datei ausgewählt.
validatingDatei ausgewählt — Client-Prüfung (Endung/Größe) läuft.
processingSynchron: Client-Prüfung bestanden — Server verarbeitet im Request.
queuedAsync (#21): Job über @/jobs eingereicht — Status wird per Polling abgefragt.
errorFehler (falscher Typ, zu groß, Job fehlgeschlagen) — mit deutscher Meldung.
doneVerarbeitung abgeschlossen — Ergebnis kann heruntergeladen werden.
src/lib/werkzeug.tsPure LogikRegeln + Verarbeitung (hier: Textanalyse). Ersetze analyzeText/formatResult.
src/lib/werkzeug.test.tsTestsVitest-Tests für die Pure Functions (neben der Quelle, Repo-Konvention).
src/pages/api/werkzeug/process.tsAPI-RouteHTTP-Dünnschicht: Body-Limit, Auth, FormData. Zwei Pfade (mode=sync/async); async reicht über @/jobs submit() ein.
src/components/react/UploadZone.tsxReact-IslandZustandsmodell + Dropzone + Download. Async-Pfad mit Polling (api/jobs/[id]) und localStorage-Wiederherstellung.
Aktivieren Sie den Umschalter „Lange Verarbeitung (asynchron)" in der Upload-Zone, läuft die Verarbeitung als Hintergrund-Job über die öffentliche @/jobs-Schnittstelle (submit). Die Seite pollt api/jobs/[id] bis zum Ergebnis. Sie können den Tab schließen und zurückkehren — der Job läuft serverseitig weiter, die Job-ID wird clientseitig (mit Ablauf) gespeichert und beim Laden wiederhergestellt.
Einschränkung (In-Memory, ADR-0008): laufende Jobs gehen bei einem Container-Neustart verloren, fertige Ergebnisse nach Ablauf der TTL. Für dauerhaften Betrieb lässt sich @/jobs später durch einen Valkey-Adapter ersetzen (Rezept-Ticket #22) — ohne Änderung an dieser Strecke, da ausschließlich die öffentliche Schnittstelle verwendet wird.