import { PrismaMariaDb } from "@prisma/adapter-mariadb"; import { env } from "@/env"; import { PrismaClient } from "@/generated/prisma/client"; import { resolvePrismaConnectionLimit } from "@/lib/prisma-pool"; const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient }; function createPrismaClient(): PrismaClient { const url = new URL(env.DATABASE_URL); const isBuild = process.env.NEXT_PHASE === "phase-production-build" || process.env.NEXT_PHASE === "phase-production-compile"; const connectionLimit = resolvePrismaConnectionLimit(env.DATABASE_POOL_SIZE); // Fail fast during SSG so Next can retry/fallback instead of hanging 30s+. const connectTimeout = isBuild ? Math.min(env.DATABASE_CONNECT_TIMEOUT_MS, 5_000) : env.DATABASE_CONNECT_TIMEOUT_MS; const adapter = new PrismaMariaDb({ host: url.hostname, port: Number(url.port) || 3306, user: decodeURIComponent(url.username), password: decodeURIComponent(url.password), database: url.pathname.replace(/^\//, ""), connectionLimit, connectTimeout, acquireTimeout: connectTimeout, idleTimeout: env.DATABASE_IDLE_TIMEOUT_MS, }); return new PrismaClient({ adapter, log: env.NODE_ENV === "development" ? ["error", "warn"] : ["error"], }); } export const prisma = globalForPrisma.prisma ?? createPrismaClient(); if (env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;