From 7fdea613ff932e06f79df86b49d1e9c78f0ab675 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 2 Sep 2025 11:50:53 +0300 Subject: [PATCH] feat(dx/desktop): perfect way to override bettersqlite native --- apps/desktop/scripts/rebuild.mts | 7 ++----- apps/desktop/scripts/start.mts | 3 ++- apps/server/src/services/sql.ts | 13 ++++++++++--- apps/server/src/share/sql.ts | 5 ++++- package.json | 1 + 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/apps/desktop/scripts/rebuild.mts b/apps/desktop/scripts/rebuild.mts index 8f05c9db5..a37c72075 100644 --- a/apps/desktop/scripts/rebuild.mts +++ b/apps/desktop/scripts/rebuild.mts @@ -9,7 +9,7 @@ const workspaceRoot = join(desktopProjectRoot, "../.."); function copyNativeDependencies() { const destPath = join(desktopProjectRoot, "node_modules/better-sqlite3"); - + if (existsSync(destPath)) { rmSync(destPath, { recursive: true }); } @@ -30,10 +30,7 @@ function rebuildNativeDependencies() { rebuild({ projectRootPath: desktopProjectRoot, buildPath: desktopProjectRoot, - // on NixOS the prebuilt native fails with "Error: libstdc++.so.6: cannot open shared object file: No such file or directory" so we need to build from source. - force: isNixOS(), - electronVersion: electronVersion, - buildFromSource: true + electronVersion }); } diff --git a/apps/desktop/scripts/start.mts b/apps/desktop/scripts/start.mts index 192f36f4c..df956fc48 100644 --- a/apps/desktop/scripts/start.mts +++ b/apps/desktop/scripts/start.mts @@ -17,6 +17,7 @@ execSync("electron ./src/main.ts", { NODE_ENV: "development", TRILIUM_ENV: "dev", TRILIUM_DATA_DIR: "data", - TRILIUM_RESOURCE_DIR: "../server/src" + TRILIUM_RESOURCE_DIR: "../server/src", + BETTERSQLITE3_NATIVE_PATH: join(projectRoot, "node_modules/better-sqlite3/build/Release/better_sqlite3.node") } }); diff --git a/apps/server/src/services/sql.ts b/apps/server/src/services/sql.ts index 15f5af389..206a828d6 100644 --- a/apps/server/src/services/sql.ts +++ b/apps/server/src/services/sql.ts @@ -15,6 +15,10 @@ import becca_loader from "../becca/becca_loader.js"; import entity_changes from "./entity_changes.js"; import config from "./config.js"; +const dbOpts: Database.Options = { + nativeBinding: process.env.BETTERSQLITE3_NATIVE_PATH || undefined +}; + let dbConnection: DatabaseType = buildDatabase(); let statementCache: Record = {}; @@ -23,15 +27,18 @@ function buildDatabase() { if (process.env.TRILIUM_INTEGRATION_TEST === "memory") { return buildIntegrationTestDatabase(); } else if (process.env.TRILIUM_INTEGRATION_TEST === "memory-no-store") { - return new Database(":memory:"); + return new Database(":memory:", dbOpts); } - return new Database(dataDir.DOCUMENT_PATH, { readonly: config.General.readOnly }); + return new Database(dataDir.DOCUMENT_PATH, { + ...dbOpts, + readonly: config.General.readOnly + }); } function buildIntegrationTestDatabase(dbPath?: string) { const dbBuffer = fs.readFileSync(dbPath ?? dataDir.DOCUMENT_PATH); - return new Database(dbBuffer); + return new Database(dbBuffer, dbOpts); } function rebuildIntegrationTestDatabase(dbPath?: string) { diff --git a/apps/server/src/share/sql.ts b/apps/server/src/share/sql.ts index 229e09ec7..36cca4b5e 100644 --- a/apps/server/src/share/sql.ts +++ b/apps/server/src/share/sql.ts @@ -7,7 +7,10 @@ import sql_init from "../services/sql_init.js"; let dbConnection!: Database.Database; sql_init.dbReady.then(() => { - dbConnection = new Database(dataDir.DOCUMENT_PATH, { readonly: true }); + dbConnection = new Database(dataDir.DOCUMENT_PATH, { + readonly: true, + nativeBinding: process.env.BETTERSQLITE3_NATIVE_PATH || undefined + }); [`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `SIGTERM`].forEach((eventType) => { process.on(eventType, () => { diff --git a/package.json b/package.json index d7bfb82fc..c7c746135 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "server:coverage": "nx test server --coverage", "server:start": "pnpm run --filter server dev", "server:start-prod": "nx run server:start-prod", + "desktop:start": "pnpm run --filter desktop dev", "electron:build": "nx build desktop", "chore:ci-update-nightly-version": "tsx ./scripts/update-nightly-version.ts", "chore:generate-openapi": "tsx ./scripts/generate-openapi.ts",