Kotlin- & Java-Schnellstart
Am Ende dieser Seite läuft ein Kotlin-Programm, das einen Ende-zu-Ende-verschlüsselten Dokumentenspeicher anlegt, ein Todo schreibt und es wieder ausliest. Derselbe Client funktioniert aus Java, Spring, Ktor oder jedem anderen JVM-Backend.
So funktioniert es
Der JVM-Client steuert die echte MindooDB-Engine, die in einem kleinen Node.js-Sidecar auf demselben Rechner läuft. Beide sprechen über einen authentifizierten Loopback-WebSocket miteinander, und jede Benutzersitzung bekommt einen eigenen Prozess, sodass sich entschlüsselte Schlüssel nie vermischen. Verschlüsselung, Signaturen, Sync und Zugriffskontrolle sind derselbe Code wie in Node.js, im Browser und in React Native.
1) Client und Sidecar holen
Du brauchst JDK 21+ und Node.js 22.13+. Klone beide Projekte nebeneinander und baue den Sidecar:
git clone https://github.com/klehmann/mindoodb-jvm-bridge.git
git clone https://github.com/klehmann/mindoodb-kmp-client.git
cd mindoodb-jvm-bridge && npm install && npm run build && cd .. Füge den Client dann deinem Gradle-Build hinzu, zum Beispiel als eingebundenen Build in settings.gradle.kts:
// settings.gradle.kts
includeBuild("../mindoodb-kmp-client")
// build.gradle.kts
dependencies {
implementation("com.mindoo.db:mindoodb-kmp-client:0.0.1")
} 2) Main.kt anlegen
Sidecar.start startet die Engine. createTenant erzeugt alle kryptografischen Schlüssel und registriert in einem Schritt den ersten Benutzer. Danach öffnen wir eine Sitzung, legen ein Dokument an und lesen es wieder aus — jede Änderung wird signiert und verschlüsselt, bevor sie gespeichert wird.
import com.mindoo.db.bridge.*
import java.nio.file.Paths
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
// Starts the Node.js sidecar that runs the MindooDB engine
val sidecar = Sidecar.start(
Paths.get("../mindoodb-jvm-bridge/dist/index.js"),
Paths.get("./mindoodb-data"),
)
// One call creates admin + user keys, KeyBag, and directory
MindooDBBridge.createTenant(
sidecar.endpoint,
tenantId = "my-first-tenant",
adminName = "cn=admin/o=demo", adminPassword = "admin-password",
userId = "cn=alice/o=demo", password = "user-password",
databases = listOf("todos"),
)
val session = MindooDBBridge.openSession(
sidecar.endpoint, "my-first-tenant", "cn=alice/o=demo",
"user-password", listOf("todos"),
)
// Create a todo document and read it back
val todos = session.database("todos")
val todo = todos.documents.create(mapOf("title" to "Buy milk", "done" to false))
println("Loaded todo: " + todos.documents.get(todo.id).data)
session.close()
sidecar.stop()
} 3) Ausführen
./gradlew run Erwartete Ausgabe:
Loaded todo: {"_attachments":[],"done":false,"title":"Buy milk"} Wie geht es weiter?
Die ausführliche Anleitung behandelt Feldtypen, Rich Text, Anhänge, Abfragen, Virtual Views, den Changefeed, das Veröffentlichen auf einem Server, Sync, neue Benutzer und den Aufruf aus Java.