From 15f62eaebfa9eee40098049a4274af29e4dfc6b9 Mon Sep 17 00:00:00 2001 From: bootunloader Date: Fri, 31 Jan 2025 10:25:22 +0200 Subject: [PATCH] yes --- src/lib/server/connectors/surreal.db.ts | 110 ++++++++++++++++-------- 1 file changed, 73 insertions(+), 37 deletions(-) diff --git a/src/lib/server/connectors/surreal.db.ts b/src/lib/server/connectors/surreal.db.ts index 05c06f9..72e35a7 100755 --- a/src/lib/server/connectors/surreal.db.ts +++ b/src/lib/server/connectors/surreal.db.ts @@ -2,62 +2,98 @@ import Surreal, { StringRecordId } from "surrealdb"; export type { QueryResult } from "surrealdb"; try { - if (document || window) { - throw new Error("SurrealDB needs a NodeJS environment to run."); - } -} catch (err) {} + if (document || window) { + throw new Error("SurrealDB needs a NodeJS environment to run."); + } +} catch (err) { } const CONFIG = { - url: process.env.SURREAL_URL ?? "", - user: process.env.SURREAL_USER ?? "", - pass: process.env.SURREAL_PASS ?? "", - ns: process.env.SURREAL_NS ?? "", - db: process.env.SURREAL_DB ?? "", + url: process.env.SURREAL_URL ?? "", + user: process.env.SURREAL_USER ?? "", + pass: process.env.SURREAL_PASS ?? "", + ns: process.env.SURREAL_NS ?? "", + db: process.env.SURREAL_DB ?? "", } as const; const db = new Surreal(); async function connectDB() { - try { - await db.connect(`http://${CONFIG.url}/rpc`); - await db.use({ namespace: CONFIG.ns, database: CONFIG.db }); - await authenticateDB(); - } catch (error) { - console.error("Error connecting to SurrealDB:", error); - } + try { + await db.connect(`http://${CONFIG.url}/rpc`); + await db.use({ namespace: CONFIG.ns, database: CONFIG.db }); + await authenticateDB(); + return true; + } catch (error) { + console.error("Error connecting to SurrealDB:", error); + return false; + } } async function authenticateDB() { - try { - await db.signin({ username: CONFIG.user, password: CONFIG.pass }); - console.log("🔑 Successfully authenticated with SurrealDB"); - } catch (error) { - console.error("❌ Authentication failed:", error); - } + try { + await db.signin({ username: CONFIG.user, password: CONFIG.pass }); + console.log("🔑 Successfully authenticated with SurrealDB"); + return true; + } catch (error) { + console.error("❌ Authentication failed:", error); + return false; + } } async function ensureAuthenticated() { - try { - console.log("⏳ Ensuring authentication with SurrealDB..."); - await db.query("RETURN 1"); - } catch (error) { - const e = error as any; - if (e.status === 401) { - console.warn("⚠️ Token expired. Re-authenticating..."); - await authenticateDB(); - } else { - console.error("Unexpected database error:", e); + try { + console.log("⏳ Ensuring authentication with SurrealDB..."); + await db.query("RETURN 1"); + } catch (error: any) { + if (error.status === 401) { + console.warn("⚠️ Token expired. Attempting reconnection..."); + try { + // Full reconnection instead of just re-authentication + await db.close(); + const success = await connectDB(); + if (success) { + console.log("✅ Successfully reconnected to database"); + } else { + console.error("❌ Failed to reconnect to database"); + } + } catch (reconnectError) { + console.error("❌ Reconnection failed:", reconnectError); + } + } else { + console.error("Unexpected database error:", error); + } } - } } -const MINS_5 = 5 * 60 * 1000; -setInterval(ensureAuthenticated, MINS_5); +// 1 minute +const CHECK_INTERVAL = 60 * 1000; +let intervalId: NodeJS.Timeout; -await connectDB(); +async function initializeDB() { + const success = await connectDB(); + if (success) { + // Only start the interval if initial connection was successful + intervalId = setInterval(ensureAuthenticated, CHECK_INTERVAL); + } else { + console.error("Failed to initialize database connection"); + // Optionally implement retry logic here + } +} + +export function cleanup() { + if (intervalId) { + clearInterval(intervalId); + } + return db.close(); +} + +await initializeDB(); export const surreal = db as Surreal; export function parseToRID(idStr: string) { - return new StringRecordId(idStr); + return new StringRecordId(idStr); } + +process.on("SIGTERM", cleanup); +process.on("SIGINT", cleanup);