- Added session log documenting Web-App stabilization, including fixes for Webpack build and login issues. - Implemented full-sync workaround in `PingEventRepositoryImpl` due to SQLDelight async driver limitations. - Updated `PingDashboard` to display sync completion messages. - Added `libs.sqldelight.coroutines` dependency and regenerated SQLDelight queries. - Updated roadmap and journal with progress on frontend sync integration.
3.3 KiB
3.3 KiB
| type | status | owner | date | participants | |||
|---|---|---|---|---|---|---|---|
| Journal | COMPLETED | Curator | 2026-01-27 |
|
Session Log: 27. Jänner 2026
Zielsetzung
Stabilisierung der Web-Applikation (JS/Wasm), Behebung von Build-Fehlern und Inbetriebnahme des Delta-Syncs.
Durchgeführte Arbeiten
1. Web-App Build & Runtime Fixes
- Problem: Webpack-Build schlug fehl wegen
sqlite3.wasmHandling. - Lösung: Revertierung komplexer Webpack-Hacks. Der Build funktioniert nun standardmäßig, da die Abhängigkeiten korrekt konfiguriert sind.
- Problem: Login schlug fehl mit 404 auf
/members/sync. - Lösung: Veralteten Aufruf im
LoginViewModelentfernt (Members-Modul existiert nicht mehr).
2. SQLDelight Async Driver Issues (JS/Wasm)
- Problem: Laufzeitfehler
The driver used with SQLDelight is asynchronous, so SQLDelight should be configured for asynchronous usagebeim Aufruf vongetLatestSince(Select). - Analyse: Trotz
generateAsync = trueinbuild.gradle.ktsscheint der generierte Code fürexecuteAsOneOrNull()oderexecuteAsList()im Browser-Kontext Probleme zu machen, wenn er synchron aufgerufen wird (was beisuspendeigentlich nicht passieren sollte, aber evtl. durch fehlende Coroutine-Extensions im Classpath verursacht wurde). - Versuche:
- Transaktion entfernt/hinzugefügt -> Kein Effekt.
executeAsList()stattexecuteAsOneOrNull()-> Kein Effekt.- Explizites
await()-> Kompilierfehler (daupsertbereitssuspend Unitist). - Hinzufügen von
libs.sqldelight.coroutineszuping-feature-> Kein Effekt auf den Laufzeitfehler.
- Lösung (Workaround): Bypass in
PingEventRepositoryImpl.getLatestSince(). Die Methode gibt nun immernullzurück, was einen Full-Sync erzwingt. - Ergebnis: Der Sync (
upsert) läuft nun erfolgreich durch! Das Schreiben in die DB funktioniert asynchron und transaktional.
3. UI/UX
- Das Ping-Service Dashboard zeigt nun im Event-Log erfolgreich "Sync completed successfully" an.
Offene Punkte & Nächste Schritte
-
SQLDelight Async Select Fix:
- Tiefere Analyse, warum
selectQueries im JS-Target den Fehler werfen, währendinsertQueries funktionieren. Eventuell ein Bug in SQLDelight 2.0.2 in Kombination mit Kotlin 2.1.0 oder WebWorkerDriver Konfiguration. - Langfristig sollte der Bypass entfernt werden, um echten Delta-Sync zu ermöglichen.
- Tiefere Analyse, warum
-
Daten-Visualisierung:
- Erweiterung des Dashboards um eine Ansicht der lokal gespeicherten Ping-Events, um den Sync auch visuell zu verifizieren (nicht nur via Logs).
Technische Erkenntnisse
- SQLDelight & JS: Die Kombination aus
generateAsync=true,WebWorkerDriverund Multiplatform-Modulen ist fragil. Schreiboperationen (suspend Unit) scheinen robuster zu sein als Leseoperationen (ExecutableQuery), bei denen die asynchrone Ausführung explizit sichergestellt werden muss. - Tracer Bullet: Der Ansatz, erst die Infrastruktur (Ping Service) komplett durchzustechen, hat sich bewährt. Wir haben fundamentale Probleme im Frontend-Stack (Wasm/DB) identifiziert und gelöst (bzw. mitigiert), bevor wir komplexe Fachlichkeit implementieren.
Status: 🟢 Web-App Running / 🟡 Sync (Full-Sync Workaround)