63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
|
import { PrismaClient } from "@prisma/client";
|
||
|
import invariant from "tiny-invariant";
|
||
|
|
||
|
let prisma: PrismaClient;
|
||
|
|
||
|
declare global {
|
||
|
var __db__: PrismaClient;
|
||
|
}
|
||
|
|
||
|
// this is needed because in development we don't want to restart
|
||
|
// the server with every change, but we want to make sure we don't
|
||
|
// create a new connection to the DB with every change either.
|
||
|
// in production we'll have a single connection to the DB.
|
||
|
if (process.env.NODE_ENV === "production") {
|
||
|
prisma = getClient();
|
||
|
} else {
|
||
|
if (!global.__db__) {
|
||
|
global.__db__ = getClient();
|
||
|
}
|
||
|
prisma = global.__db__;
|
||
|
}
|
||
|
|
||
|
function getClient() {
|
||
|
const { DATABASE_URL } = process.env;
|
||
|
invariant(typeof DATABASE_URL === "string", "DATABASE_URL env var not set");
|
||
|
|
||
|
const databaseUrl = new URL(DATABASE_URL);
|
||
|
|
||
|
const isLocalHost = databaseUrl.hostname === "localhost";
|
||
|
|
||
|
const PRIMARY_REGION = isLocalHost ? null : process.env.PRIMARY_REGION;
|
||
|
const FLY_REGION = isLocalHost ? null : process.env.FLY_REGION;
|
||
|
|
||
|
const isReadReplicaRegion = !PRIMARY_REGION || PRIMARY_REGION === FLY_REGION;
|
||
|
|
||
|
if (!isLocalHost) {
|
||
|
databaseUrl.host = `${FLY_REGION}.${databaseUrl.host}`;
|
||
|
if (!isReadReplicaRegion) {
|
||
|
// 5433 is the read-replica port
|
||
|
databaseUrl.port = "5433";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
console.log(`🔌 setting up prisma client to ${databaseUrl.host}`);
|
||
|
// NOTE: during development if you change anything in this function, remember
|
||
|
// that this only runs once per server restart and won't automatically be
|
||
|
// re-run per request like everything else is. So if you need to change
|
||
|
// something in this file, you'll need to manually restart the server.
|
||
|
const client = new PrismaClient({
|
||
|
datasources: {
|
||
|
db: {
|
||
|
url: databaseUrl.toString(),
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
// connect eagerly
|
||
|
client.$connect();
|
||
|
|
||
|
return client;
|
||
|
}
|
||
|
|
||
|
export { prisma };
|