Kotlin-Event-Sync-Client (Pendant zu ManaEventSync), E2E AES-GCM — Apache-2.0, Spiegel des Vereins mana.
| devlog | ||
| gradle | ||
| src | ||
| .editorconfig | ||
| .gitignore | ||
| build.gradle.kts | ||
| CHANGELOG.md | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
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→subre-taggen + re-encrypt + drainen), Poll-Timer, Soft-Fail, Schema-Outdated-Stop, Crypto-Degraded- Pause, Aggregate-Change-Listener. Port von SwiftEventSyncEngine.EventStore(Interface) +InMemoryEventStore— Event-Log + Outbox- Meta + Retention. Saubere Trennung: die Android-App liefert einen Room-
Adapter (
EventStore-Impl), die Engine bleibt pure Kotlin.
- Meta + Retention. Saubere Trennung: die Android-App liefert einen Room-
Adapter (
SyncTransport/SyncWebSocket— Transport-Abstraktionen (SyncHttpClientimplementiertSyncTransport; 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;sequenceNumbertoleriert JSON-String und -Zahl (mana-sync Gojson:",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 desEventStore-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.