Kotlin-Event-Sync-Client (Pendant zu ManaEventSync), E2E AES-GCM — Apache-2.0, Spiegel des Vereins mana.
Find a file
Till JS 7e7bbbd1f3 build: Abhaengigkeiten auf die heutigen Quellstaende, mavenLocal ergaenzt
🔴 Die Bibliotheks-Kette war aus den QUELLEN nicht baubar. Jede Klammer
zeigte auf eine aeltere Version, als die Quelle des Nachbarn traegt —
diese Staende existieren nur als veroeffentlichte Artefakte, und die
Repos haben keine einzige Git-Marke. Der Build fiel deshalb auf Forgejo
Packages zurueck, und das antwortet seit dem 2026-08-14 mit 401, auch
anonym. Ergebnis: auf einem frischen Rechner ging gar nichts.

Behoben, indem die Klammern auf die Staende gehoben wurden, die im Baum
liegen. Zwei Bibliotheken hatten ausserdem **kein `mavenLocal()`** in
ihrer Repository-Liste — sie konnten per Bauart nur aus dem Registry
ziehen, waehrend die Schwesterbibliotheken es laengst hatten.

Bewiesen, nicht behauptet: alle neun Artefakte liegen nach diesem Stand
in mavenLocal, und die Kartomo-Android-App baut daraus durch
(BUILD SUCCESSFUL, APK `ev.mana.kartomo`).

Sitzung: 5810ba55
2026-08-14 12:31:11 +02:00
devlog devlog: Repo-Historie nachgezogen (spieler+macher) 2026-06-16 01:44:27 +02:00
gradle build: Abhaengigkeiten auf die heutigen Quellstaende, mavenLocal ergaenzt 2026-08-14 12:31:11 +02:00
src 0.9.1 — Factory verdrahtet syncConsentLoader automatisch bei requireSyncConsent 2026-06-23 16:27:26 +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 0.9.1 — Factory verdrahtet syncConsentLoader automatisch bei requireSyncConsent 2026-06-23 16:27:26 +02:00
CHANGELOG.md 0.9.1 — Factory verdrahtet syncConsentLoader automatisch bei requireSyncConsent 2026-06-23 16:27:26 +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
LICENSE Apache-2.0: LICENSE + NOTICE 2026-08-03 23:05:06 +02:00
NOTICE Apache-2.0: LICENSE + NOTICE 2026-08-03 23:05:06 +02:00
README.md mana statt »e.V.«: Schweizer Verein (kein Store-Release, nur Quelltext-Korrektur) 2026-06-17 20:32:25 +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 — 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.