mana-kotlin-event-sync/README.md
Till JS bc52adebf1 mana statt »e.V.«: Schweizer Verein (kein Store-Release, nur Quelltext-Korrektur)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:32:25 +02:00

2.9 KiB

mana-kotlin-event-sync

Kotlin-Port des Event-Sync-Clients von mana — Pendant zu mana-swift-event-sync (ManaEventSync). Der Daten-Layer der event-sourced Flotte: User-eigene Decks/Cards/Reviews laufen hierüber (E2E-verschlüsselt, gegen sync2.mana.how), nicht über REST.

Reine Kotlin/JVM-Library, baut auf mana-kotlin-core (Auth) auf. Während der Entwicklung über Gradle-Composite-Build verdrahtet (includeBuild("../mana-kotlin-core")), kein Maven-Publish nötig.

Was drin ist (v0.2 — Phase 2 komplett, außer Adaptern)

Engine (Teil 2):

  • EventSyncEngine — die App-facing Orchestrierung: Anonymous-First- Identität, emit (lokal + Outbox + Crypto-Wire), Pull-Loop (decrypt + Projektion + Cursor), signIn-Claim (anon→sub re-taggen + re-encrypt + drainen), Poll-Timer, Soft-Fail, Schema-Outdated-Stop, Crypto-Degraded- Pause, Aggregate-Change-Listener. Port von Swift EventSyncEngine.
  • EventStore (Interface) + InMemoryEventStore — Event-Log + Outbox
    • Meta + Retention. Saubere Trennung: die Android-App liefert einen Room- Adapter (EventStore-Impl), die Engine bleibt pure Kotlin.
  • SyncTransport / SyncWebSocket — Transport-Abstraktionen (SyncHttpClient implementiert SyncTransport; WS-Impl im App-Modul).
  • createEventSyncEngine(...) — Produktions-Verdrahtung (HTTP + Vault).

Bausteine (v0.1 — Phase 2, Teil 1)

  • crypto.MasterKeyCryptoProvider — AES-GCM-256, byte-kompatibel zu Swift + TS (enc:1:<b64-iv>.<b64-(ct‖tag)>, WebCrypto-Layout). Bewiesen per Golden-Vektor aus dem Node/WebCrypto-Pfad (Cross-Impl-Parität).
  • crypto.NoOpCryptoProvider — Passthrough (Anonymous-Modus / Vault unerreichbar). Mixed-Log-tolerant.
  • crypto.VaultClient + createMasterKeyProviderFromVault — holt den Master-Key (/api/v1/me/encryption-vault/{key,init}), baut den Provider; ZK-Modus → wirft (Caller fällt auf NoOp zurück).
  • core.EventEnvelope + ActorContext — Wire-Format; sequenceNumber toleriert JSON-String und -Zahl (mana-sync Go json:",string").
  • core.Ulid — sortierbare IDs (Port der Swift-Generierung).
  • transport.SyncHttpClient — POST /sync/{appId} (append ≤500) + GET /sync/{appId}/pull?since=N&limit=K; 422 → SchemaOutdated.

Was noch fehlt (Adapter, im App-Modul)

  • Room-EventStore-Adapter — persistente Implementierung des EventStore-Interfaces (braucht Android-SDK).
  • Ktor-SyncWebSocket-Impl — Live-Push (braucht WS-fähige Engine + Live-Server zum Verifizieren).

Bauen & Testen

export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
./gradlew test   # 26 Tests, inkl. WebCrypto-Golden-Vektor

SOT-Plan: mana/docs/playbooks/WORDECK_ANDROID_GREENFIELD.md.