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>
43 lines
1.9 KiB
Swift
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)" } ?? "")."
|
|
}
|
|
}
|
|
}
|