From 296ab169f1b1b768b85a97d96f53345df1d23a99 Mon Sep 17 00:00:00 2001 From: brobert Date: Sun, 12 Oct 2025 22:49:42 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20cargar=20bun:sqlite=20din=C3=A1mica?= =?UTF-8?q?mente=20y=20a=C3=B1adir=20getDb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: aider (openrouter/openai/gpt-5) --- apps/web/src/lib/server/db.ts | 19 ++++++++++++++----- apps/web/src/routes/login/+server.ts | 4 +++- apps/web/vite.config.ts | 10 +++++++++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/apps/web/src/lib/server/db.ts b/apps/web/src/lib/server/db.ts index 8077e66..dc8cfa4 100644 --- a/apps/web/src/lib/server/db.ts +++ b/apps/web/src/lib/server/db.ts @@ -1,9 +1,8 @@ -import { Database } from 'bun:sqlite'; import { mkdirSync } from 'fs'; import { dirname } from 'path'; import { resolveDbAbsolutePath } from './env'; -function applyDefaultPragmas(instance: Database): void { +function applyDefaultPragmas(instance: any): void { try { instance.exec(`PRAGMA busy_timeout = 5000;`); // Intentar activar WAL (si no es soportado, SQLite devolverá 'memory' u otro modo) @@ -19,8 +18,9 @@ function applyDefaultPragmas(instance: Database): void { /** * Abre la BD compartida sin ejecutar migraciones (las realiza el proceso del bot). + * Nota: uso de import dinámico de 'bun:sqlite' para que el build con Node no falle. */ -export function openDb(filename: string = 'tasks.db'): Database { +async function openDb(filename: string = 'tasks.db'): Promise { const absolutePath = resolveDbAbsolutePath(filename); // Crear directorio padre si no existe @@ -30,10 +30,19 @@ export function openDb(filename: string = 'tasks.db'): Database { if (err?.code !== 'EEXIST') throw err; } + const { Database } = await import('bun:sqlite'); const instance = new Database(absolutePath); applyDefaultPragmas(instance); return instance; } -// Instancia por defecto -export const db = openDb(); +let _db: any | null = null; + +/** + * Devuelve una única instancia compartida (lazy) de la BD. + */ +export async function getDb(filename: string = 'tasks.db'): Promise { + if (_db) return _db; + _db = await openDb(filename); + return _db; +} diff --git a/apps/web/src/routes/login/+server.ts b/apps/web/src/routes/login/+server.ts index 2395b7a..6f6fba2 100644 --- a/apps/web/src/routes/login/+server.ts +++ b/apps/web/src/routes/login/+server.ts @@ -1,6 +1,6 @@ import type { RequestHandler } from './$types'; import { redirect } from '@sveltejs/kit'; -import { db } from '$lib/server/db'; +import { getDb } from '$lib/server/db'; import { sha256Hex, randomTokenBase64Url } from '$lib/server/crypto'; import { sessionIdleTtlMs, isProd } from '$lib/server/env'; @@ -18,6 +18,8 @@ export const GET: RequestHandler = async (event) => { const tokenHash = await sha256Hex(token); const nowIso = toIsoSql(new Date()); + const db = await getDb(); + // Intentar canjear el token: marcarlo como usado si está vigente y no usado const res = db .prepare( diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index bbf8c7d..245ce0c 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -2,5 +2,13 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; export default defineConfig({ - plugins: [sveltekit()] + plugins: [sveltekit()], + ssr: { + // Evita que Node intente resolver el esquema 'bun:' durante el build SSR + external: ['bun:sqlite'] + }, + optimizeDeps: { + // No prebundlear 'bun:sqlite' en dev + exclude: ['bun:sqlite'] + } });