/** * Database client and connection pool */ import { drizzle } from 'drizzle-orm/node-postgres'; import { migrate } from 'drizzle-orm/node-postgres/migrator'; import pg from 'pg'; import * as schema from './schema.js'; const { Pool } = pg; if (!process.env.DATABASE_URL) { throw new Error('DATABASE_URL environment variable is required'); } const pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 20, // Maximum connections idleTimeoutMillis: 20000, // Close idle connections after 20s connectionTimeoutMillis: 10000, // Connection timeout (increased for complex queries) maxUses: 7500, // Max queries per connection before refresh (prevents memory leaks) allowExitOnIdle: false, // Keep pool alive during idle periods }); // Log pool errors for debugging pool.on('error', (err) => { console.error('[DB Pool Error]', err.message); }); export const db = drizzle(pool, { schema }); export async function closeDatabase(): Promise { await pool.end(); } export async function checkDatabaseConnection(): Promise { try { const client = await pool.connect(); await client.query('SELECT 1'); client.release(); return true; } catch (error) { console.error('Database connection check failed:', error); return false; } } export async function runMigrations(migrationsFolder: string): Promise { await migrate(db, { migrationsFolder }); }