46 lines
1.6 KiB
TypeScript
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;
|
|
}
|