fiddy/apps/web/lib/server/db.ts
2026-02-11 23:45:15 -08:00

46 lines
1.6 KiB
TypeScript

if (process.env.NODE_ENV !== "test")
require("server-only");
import pg from "pg";
const { Pool } = pg;
declare global {
// eslint-disable-next-line no-var
var __fiddyPool: pg.Pool | undefined;
}
export default function getPool() {
if (!process.env.DATABASE_URL)
throw new Error("DATABASE_URL is required");
const dbName = (() => {
try {
const url = new URL(process.env.DATABASE_URL!);
const name = url.pathname.replace(/^\/+/, "");
return name ? decodeURIComponent(name) : "";
} catch {
return "";
}
})();
const allowedRaw = process.env.ALLOWED_DB_NAMES;
const allowed = allowedRaw
? allowedRaw
.split(",")
.map(value => value.trim().toLowerCase())
.filter(Boolean)
: (process.env.NODE_ENV === "test" && dbName ? [dbName.toLowerCase()] : []);
if (!allowed.length)
throw new Error("ALLOWED_DB_NAMES must include at least one database name");
if (!dbName)
throw new Error("DATABASE_URL must include a database name");
if (!allowed.includes(dbName.toLowerCase()))
throw new Error(`DATABASE_URL must target an allowed database. Found "${dbName}"`);
if (!globalThis.__fiddyPool) {
globalThis.__fiddyPool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: process.env.DATABASE_SSL === "false" ? false : { rejectUnauthorized: false },
allowExitOnIdle: process.env.NODE_ENV === "test"
});
}
return globalThis.__fiddyPool;
}