Kotlin-Event-Sync-Client (Pendant zu ManaEventSync), E2E AES-GCM — Apache-2.0, Spiegel des Vereins mana.
Find a file
Till JS 297279d6e6 README: Bau-Anleitung aus offenen Klonen und Erwartungssatz
Vorbereitung für die Spiegelung nach git.mana.how/offen (Prüfliste
QUELLOEFFNUNG.md §5): Sweep sauber, keine Privat-Marker, Apache-2.0 mit
NOTICE seit Welle 1, Schriften mit OFL-Texten.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 13:35:37 +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 README: Bau-Anleitung aus offenen Klonen und Erwartungssatz 2026-09-30 13:35:37 +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.

Bauen

Kotlin/Gradle. Die mana-Bibliotheken finden sich gegenseitig über mavenLocal() — in dieser Reihenfolge veröffentlichen:

for r in mana-kotlin-core mana-kotlin-tokens mana-kotlin-event-sync \
         mana-kotlin-widget mana-kotlin-event-sync-room mana-kotlin-ui; do
  git clone https://git.mana.how/offen/$r.git && (cd $r && ./gradlew publishToMavenLocal)
done

Danach baut auch Pageta für Android.

Für Mitlesende

Dieses Repo gehört zum Ökosystem von mana und liegt offen, damit andere es lesen, einordnen und als Grundlage nutzen können — das spart Arbeit, egal ob ein Mensch oder ein Modell davorsitzt.

Was du erwarten darfst: den Code so, wie er tatsächlich in Gebrauch ist, unter Apache-2.0 (siehe LICENSE und NOTICE). Keine Attrappe, kein zurechtgeschnittener Auszug — samt seiner Geschichte.

Was du nicht erwarten darfst: Support, Antwortzeiten, Zusagen zur Abwärtskompatibilität oder die Übernahme von Änderungswünschen. Dieses Repo folgt dem, was die eigenen Anwendungen brauchen. Fehlermeldungen sind willkommen, eine Antwort ist nicht zugesagt.

Fork ist ausdrücklich erlaubt und oft der schnellere Weg als zu warten.