Kotlin-Event-Sync-Client (Pendant zu ManaEventSync), E2E AES-GCM — Apache-2.0, Spiegel des Vereins mana.
Find a file
2026-06-16 19:30:39 +02:00
devlog devlog: Repo-Historie nachgezogen (spieler+macher) 2026-06-16 01:44:27 +02:00
gradle 0.3.0: KtorSyncWebSocket in die Lib (statt 5x App-Kopie) 2026-06-10 18:28:33 +02:00
src feat: EventStore.purgeByAggregatePrefix + engine.purgeAggregatePrefix — lokaler Wipe (A3, 0.7.0) 2026-06-16 19:30:39 +02:00
.editorconfig mana-kotlin-event-sync v0.1 — Crypto + Envelope + Vault + Sync-HTTP 2026-06-04 18:30:39 +02:00
.gitignore mana-kotlin-event-sync v0.1 — Crypto + Envelope + Vault + Sync-HTTP 2026-06-04 18:30:39 +02:00
build.gradle.kts feat: EventStore.purgeByAggregatePrefix + engine.purgeAggregatePrefix — lokaler Wipe (A3, 0.7.0) 2026-06-16 19:30:39 +02:00
CHANGELOG.md feat: EventStore.purgeByAggregatePrefix + engine.purgeAggregatePrefix — lokaler Wipe (A3, 0.7.0) 2026-06-16 19:30:39 +02:00
gradle.properties mana-kotlin-event-sync v0.1 — Crypto + Envelope + Vault + Sync-HTTP 2026-06-04 18:30:39 +02:00
gradlew mana-kotlin-event-sync v0.1 — Crypto + Envelope + Vault + Sync-HTTP 2026-06-04 18:30:39 +02:00
gradlew.bat mana-kotlin-event-sync v0.1 — Crypto + Envelope + Vault + Sync-HTTP 2026-06-04 18:30:39 +02:00
README.md v0.2.0 — EventSyncEngine (Phase 2 Teil 2) 2026-06-04 19:44:29 +02:00
settings.gradle.kts mana-kotlin-event-sync v0.1 — Crypto + Envelope + Vault + Sync-HTTP 2026-06-04 18:30:39 +02:00

mana-kotlin-event-sync

Kotlin-Port des Event-Sync-Clients von mana e.V. — 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.