From d1159d3af9a8d7d8896b3a1f87f50de61de3b761 Mon Sep 17 00:00:00 2001 From: argusagent Date: Tue, 17 Mar 2026 20:22:05 -0400 Subject: [PATCH] fix(share): guard against uninitialized DB connection on /share routes (#5677) --- apps/server/src/share/sql.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/server/src/share/sql.ts b/apps/server/src/share/sql.ts index 36cca4b5ec..5a127e791f 100644 --- a/apps/server/src/share/sql.ts +++ b/apps/server/src/share/sql.ts @@ -5,12 +5,14 @@ import dataDir from "../services/data_dir.js"; import sql_init from "../services/sql_init.js"; let dbConnection!: Database.Database; +let dbConnectionReady = false; sql_init.dbReady.then(() => { dbConnection = new Database(dataDir.DOCUMENT_PATH, { readonly: true, nativeBinding: process.env.BETTERSQLITE3_NATIVE_PATH || undefined }); + dbConnectionReady = true; [`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `SIGTERM`].forEach((eventType) => { process.on(eventType, () => { @@ -23,18 +25,31 @@ sql_init.dbReady.then(() => { }); }); +function assertDbReady(): void { + if (!dbConnectionReady) { + throw new Error("Share database connection is not yet ready. The application may still be initializing."); + } +} + function getRawRows(query: string, params = []): T[] { + assertDbReady(); return dbConnection.prepare(query).raw().all(params) as T[]; } function getRow(query: string, params: string[] = []): T { + assertDbReady(); return dbConnection.prepare(query).get(params) as T; } function getColumn(query: string, params: string[] = []): T[] { + assertDbReady(); return dbConnection.prepare(query).pluck().all(params) as T[]; } +export function isShareDbReady(): boolean { + return dbConnectionReady; +} + export default { getRawRows, getRow,