import path from "path"; import grabDirNames from "../data/grab-dir-names"; import { type BunMariaDBConfig } from "../types"; import { SQL } from "bun"; type Params = { config: BunMariaDBConfig; }; /** Reuse one client per database name to avoid exhausting MariaDB connections. */ const clientCache = new Map(); export default function grabMariaDBClient({ config, }: Params): Bun.SQL | undefined { const cacheKey = config.db_name || "__default__"; const cached = clientCache.get(cacheKey); if (cached) { return cached; } // Prefer the process-wide client when it matches the requested database if ( global.MARIADB_CLIENT && (!global.CONFIG?.db_name || global.CONFIG.db_name === config.db_name) ) { clientCache.set(cacheKey, global.MARIADB_CLIENT); return global.MARIADB_CLIENT; } const { ROOT_DIR } = grabDirNames(); try { const tls = config.ssl_ca ? { ca: Bun.file(path.resolve(ROOT_DIR, config.ssl_ca)), rejectUnauthorized: false, } : { rejectUnauthorized: false, }; const MariaDBClient = new SQL({ hostname: process.env.BUN_MARIADB_SERVER_HOST, username: process.env.BUN_MARIADB_SERVER_USERNAME, password: process.env.BUN_MARIADB_SERVER_PASSWORD, database: config.db_name, port: process.env.BUN_MARIADB_SERVER_PORT ? Number(process.env.BUN_MARIADB_SERVER_PORT) : undefined, ...config.db_config, tls, adapter: "mariadb", } as Bun.SQL.Options); clientCache.set(cacheKey, MariaDBClient); return MariaDBClient; } catch (error: any) { console.error(`Couldn't grab MariaDB Client => ` + error.message); return; } }