Offline-Bearbeitung beim Wiederverbinden und Sync bei nicht erreichbarem Server #228
Labels
No labels
priority/could
priority/must
priority/should
priority/wont
status/blocked
status/claimed
status/done-migrated
type/bug
type/feature
type/infra
type/tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/todo#228
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beobachtung
1. Bearbeiten beim Wiederverbinden schlägt fehl
2. Handy und Laptop zeigen unterschiedliche Einkaufszettel
s1.butzei.de/git.butzei.de/todo.moekies.dekomplett nicht erreichbar). Die Änderung liegt vermutlich noch in der Offline-Warteschlange des Handys. Die App macht diesen Zustand aber für niemanden sichtbar: beide Geräte zeigen still ihre lokale Kopie, als wäre es der Serverstand.Vermutete Ursachen (aus dem Code, nicht verifiziert)
offlineSync.tsdrainQueue()läuft nur beimonline-Event und beim App-Start. Schlägt dieser eine Versuch fehl (auf Mobilgeräten kommt das Event oft, bevor die Verbindung wirklich steht, oder der Server ist schlicht down), wird bis zum nächsten offline->online-Wechsel bzw. App-Neustart nicht erneut gesendet.callApireiht Schreibaktionen nur ein, wennfetch()selbst rejected. Antwortet ein Zwischenserver (Traefik) mit 502/503/504, oder hängt die Anfrage (kein Timeout), wird nichts vorgemerkt - die Änderung schlägt fehl bzw. es passiert nichts.callApiCached/ Read-Cache-Fallback zeigt bei nicht erreichbarem Server still die lokale Kopie, ohne Hinweis, dass es sich um einen alten Stand handelt.Akzeptanzkriterien
backendReachabilitymeldet Erfolg).Abgrenzung
Claimed by session "Offene Issues [08a09a]"
Starte mit Design: Retry der Offline-Warteschlange (Timer mit Backoff, visibilitychange, Server wieder erreichbar), Vormerken auch bei Timeout/502/503/504, Zeitlimit fuer Anfragen, sichtbare Anzeige vorgemerkter Aenderungen und veralteter lokaler Kopie.
Design (Architect) + Security-Vorpruefung, Session "Offene Issues [08a09a]"
Fehlerarten (
rawApi.ts): Ein Request gilt als "Server nicht erreichbar", wennfetchrejected, nach 20 s abgebrochen wird (AbortController) oder 502/503/504 liefert. Nur dann wird vorgemerkt bzw. die lokale Kopie gezeigt; alle anderen Status (400, 401, 403, 404, 500) laufen wie bisher als Fehler.callApi: 502/503/504 nehmen denselben Pfad wie ein Netzwerkfehler (Vormerken bzw. Read-Cache). Health-Ping bekommt ebenfalls ein Zeitlimit (5 s), sonst haengt die Ausfallerkennung.
Warteschlange (
offlineSync.ts): Neuer Versuch per Timer mit Backoff (5 s, verdoppelt, max. 60 s), solange noch etwas vorgemerkt ist und der letzte Versuch an der Erreichbarkeit scheiterte; ausserdem bei visibilitychange->sichtbar und sobaldbackendReachabilitywieder Erfolg meldet. State bekommtsyncFailingundoldestPendingAt.Smart-Add: Ein neues Produkt nimmt den vormerkbaren Weg (AddOrActivate) auch, wenn der Browser online, der Server aber als nicht erreichbar bekannt ist.
Sichtbarkeit: OfflineBanner zeigt bei online + vorgemerkt die Anzahl und "wird gesendet, sobald der Server erreichbar ist"; nach >10 min ohne Erfolg eine Warnung mit Uhrzeit. Read-Cache speichert pro Eintrag den Zeitpunkt; zeigt die App wegen Nichterreichbarkeit lokale Daten, nennt das Banner "Stand von ".
Security: keine neuen Endpunkte/Daten; Queue-Verhalten bei 401/403 unveraendert (nicht verwerfen). Bekanntes Restrisiko: bei 504/Zeitlimit kann der Server die Anfrage doch verarbeitet haben -> Wiederholung koennte bei +/-1-Aktionen (Vorrat ein/aus) doppelt zaehlen. Bei 502/503/Verbindungsfehler wurde nichts verarbeitet. Bewusst akzeptiert, im Abschluss dokumentiert.
Umgesetzt in
8752494f(Frontend) und75f2ca93(E2E-Test).Scope
offline/connectivity.ts, loest auch ein Neuladen der angezeigten Daten aus).Tests
e2e/offline-sync.spec.ts: offline hinzufuegen -> online, Proxy antwortet 503 -> Server wieder da -> Produkt kommt ohne Neuladen an und ist in zweitem Browser-Kontext sichtbar. Lokal in Chromium gruen (Firefox startet auf diesem Rechner nicht, laeuft in der CI).Security-Review: keine Findings. Bekanntes, bewusst akzeptiertes Restrisiko (siehe Design-Kommentar): bei 504 oder Zeitlimit kann der Server die Anfrage doch verarbeitet haben; eine Wiederholung zaehlt dann bei nicht-idempotenten Befehlen doppelt (Vorrat ein/aus/Undo, CreatePantryProduct, Mengen-Merge bei AddOrActivate). Ausschliessen ist im Browser nicht moeglich, da ein toter Host und ein langsamer Server gleich aussehen. Saubere Loesung waere ein Idempotenz-Schluessel pro vorgemerkter Aktion, den das Backend dedupliziert - Vorschlag fuer ein eigenes Issue.
Offen aus der Beschreibung: ob die Handy-Aenderung vom 2026-10-01 von selbst ankam, kann nur auf dem Geraet geprueft werden.