mana-swift-event-sync/Sources/ManaEventSync/Core/EventSyncError.swift
Till JS 630e4254c7 0.9.0: 402-Handling (kein aktives Cloud-Sync-Abo)
EventSyncError.subscriptionRequired (402-Mapping in SyncHTTPClient),
onSyncRequired-Hook + isSyncRequired. Push/Pull: Events bleiben in der
Outbox (kein Verlust, kein Attempt-Increment), event-getriggerte
Push/Pull unterdrückt, Poll prüft weiter (force) → Auto-Recovery.
Wire-Parität zu @mana/event-sync 0.9.0. swift build + tests grün.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 15:26:20 +02:00

43 lines
1.9 KiB
Swift

import Foundation
/// Fehler der Sync-Library. Apps dürfen ihre eigenen Domänen-Fehler
/// daneben definieren; diese hier decken die Plattform-Mechanik ab.
public enum EventSyncError: LocalizedError, Sendable, Equatable {
/// Schreiben/Pushen ohne gültige Session versucht (sollte im
/// Anonymous-Mode nicht auftreten — dort emittet die Engine lokal).
case notAuthenticated
/// Aggregat nach Event-Replay nicht projizierbar.
case reducerGap(String)
/// Engine wurde vor `start()` benutzt o.Ä.
case engineUnavailable
/// Server meldet Schema-Hash-Drift (`422`); App-Update nötig.
case schemaOutdated
/// Server lehnt Sync mangels aktivem Cloud-Sync-Abo ab (`402`). Events
/// bleiben lokal in der Outbox (kein Verlust); die App kann Cloud-Sync
/// aktivieren. Auto-Recovery, sobald das Abo aktiv ist.
case subscriptionRequired
/// Payload eines gepullten Events konnte nicht entschlüsselt werden
/// (falscher Key, beschädigter Ciphertext, oder kein Key verfügbar).
case decryptFailed(eventId: String)
/// HTTP-Transport-Fehler mit Status + optionalem Body-Auszug.
case transport(status: Int, body: String?)
public var errorDescription: String? {
switch self {
case .notAuthenticated:
"Nicht eingeloggt."
case let .reducerGap(id):
"Reducer-Lücke: \(id) nach Event-Emit nicht projiziert."
case .engineUnavailable:
"Event-Sync nicht initialisiert."
case .schemaOutdated:
"Diese App-Version ist veraltet — bitte aktualisieren."
case .subscriptionRequired:
"Cloud-Sync benötigt ein aktives Abo. Deine Daten bleiben lokal erhalten."
case let .decryptFailed(eventId):
"Event \(eventId) konnte nicht entschlüsselt werden."
case let .transport(status, body):
"Sync-Transport-Fehler \(status)\(body.map { ": \($0)" } ?? "")."
}
}
}