migrate(local-db): replace Room with SQLDelight for JS/WASM compatibility
Replaced Room with SQLDelight for improved multiplatform support, enabling JavaScript and WebAssembly targets. Added custom database driver implementations for JVM, JS, and WASM. Updated Gradle configurations, dependencies, and project structure accordingly.
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
package at.mocode.frontend.core.localdb
|
||||
|
||||
import app.cash.sqldelight.db.SqlDriver
|
||||
import app.cash.sqldelight.driver.worker.WebWorkerDriver
|
||||
import org.w3c.dom.Worker
|
||||
|
||||
actual class DatabaseDriverFactory {
|
||||
actual suspend fun createDriver(): SqlDriver {
|
||||
// Load the worker script. This assumes the worker is bundled correctly by Webpack.
|
||||
// We use a custom worker entry point to support OPFS if needed (as per report).
|
||||
// For now, we point to a resource we will create.
|
||||
val worker = Worker(
|
||||
js("""new URL("sqlite.worker.js", import.meta.url)""")
|
||||
)
|
||||
val driver = WebWorkerDriver(worker)
|
||||
|
||||
// Initialize schema asynchronously
|
||||
AppDatabase.Schema.create(driver).await()
|
||||
|
||||
return driver
|
||||
}
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
@file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
|
||||
|
||||
package at.mocode.frontend.core.localdb
|
||||
|
||||
import app.cash.sqldelight.db.SqlDriver
|
||||
import app.cash.sqldelight.driver.worker.WebWorkerDriver
|
||||
import org.w3c.dom.Worker
|
||||
|
||||
actual class DatabaseDriverFactory {
|
||||
actual suspend fun createDriver(): SqlDriver {
|
||||
val worker = js(
|
||||
"new Worker(new URL('@cashapp/sqldelight-sqljs-worker/sqljs.worker.js', import.meta.url))"
|
||||
) as Worker
|
||||
val driver = WebWorkerDriver(worker)
|
||||
// Create schema asynchronously
|
||||
MeldestelleDb.Schema.create(driver).await()
|
||||
return driver
|
||||
}
|
||||
}
|
||||
|
||||
actual class DatabaseProvider {
|
||||
actual suspend fun createDatabase(): MeldestelleDb {
|
||||
val driver = DatabaseDriverFactory().createDriver()
|
||||
return MeldestelleDb(driver)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import { runWorker } from '@cashapp/sqldelight-sqljs-worker';
|
||||
import sqlite3InitModule from '@sqlite.org/sqlite-wasm';
|
||||
|
||||
sqlite3InitModule({
|
||||
print: console.log,
|
||||
printErr: console.error,
|
||||
}).then((sqlite3) => {
|
||||
const opfsAvailable = 'opfs' in sqlite3;
|
||||
|
||||
runWorker({
|
||||
driver: {
|
||||
open: (name) => {
|
||||
if (opfsAvailable) {
|
||||
console.log("Initialisiere persistente OPFS Datenbank: " + name);
|
||||
return new sqlite3.oo1.OpfsDb(name);
|
||||
} else {
|
||||
console.warn("OPFS nicht verfügbar, Fallback auf In-Memory");
|
||||
return new sqlite3.oo1.DB(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user