v2.55.1 — Code-Review-Fixes: Singleton, Race-Conditions, Fallback-Timer, Log-Security

CRITICAL (C1): RealtimeSyncService jetzt Singleton (Factory-Pattern)
  - Verhindert doppelte SSE-Verbindungen durch home_screen + settings
  - UI-Notifier (istVerbundenNotifier) app-weit konsistent

HIGH (H1): _reconnecteOderFallback + starteWennAktiviert setzen
  cloud_interval vor starteAutoSyncTimer() — sonst bleibt Timer
  bei Fallback auf 0 (kein Sync)

HIGH (H2): Race-Condition in _verbinde() nach await request.close()
  — _pausiert-Flag re-check; bei true → clean exit mit _laeuft=false

HIGH (H3): fortsetzen() re-checkt _pausiert nach starteWennAktiviert()
  — verhindert Leak bei schnellem App-Umschalten

MEDIUM (M1): _syncModusSetzen stoppt SSE bei Wechsel auf manual/interval
  (vorher lief die Verbindung weiter)

MEDIUM (M2): Event-Logging loggt nur noch Event-Typ, nicht rohe Daten
  (Privacy: Song-IDs/Titel/Künstler nicht im Log)

LOW (L1): _verbinde() setzt _laeuft=false bei Token-Fehler (kein Deadlock)
This commit is contained in:
Dustin
2026-08-06 18:04:52 +02:00
parent 3f169fa1d9
commit b4d63509d1
2 changed files with 35 additions and 5 deletions
+5 -3
View File
@@ -109,19 +109,21 @@ class _SettingsScreenState extends State<SettingsScreen> {
await p.setString('sync_modus', modus);
// Realtime-Service entsprechend starten/stoppen
final rs = RealtimeSyncService();
switch (modus) {
case 'realtime':
// SSE sofort starten
final rs = RealtimeSyncService();
await rs.starteWennAktiviert();
break;
case 'manual':
// Kein Auto-Sync — Timer stoppen
// Kein Auto-Sync — SSE stoppen, Timer deaktivieren
rs.stoppe();
await p.setInt('cloud_interval', 0); // alten Timer deaktivieren
await SyncService.starteAutoSyncTimer();
break;
case 'interval':
// Intervall-Timer mit cloud_interval_stunden starten
// Intervall-Timer — SSE stoppen, Timer mit cloud_interval_stunden starten
rs.stoppe();
await p.setInt('cloud_interval', _cloudIntervallStunden);
await SyncService.starteAutoSyncTimer();
break;