import type { PgClient } from "@effect/sql-pg/PgClient"; import * as Cloudflare from "alchemy/Cloudflare"; import * as Drizzle from "alchemy/Drizzle"; import * as Planetscale from "alchemy/Planetscale"; import * as Alchemy from "alchemy"; import * as RemovalPolicy from "alchemy/RemovalPolicy"; import type { EffectPgDatabase } from "drizzle-orm/effect-postgres"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import { relayDatabaseMode } from "./dbConfig.ts"; export class RelayDb extends Context.Service< RelayDb, EffectPgDatabase & { readonly $client: PgClient; } >()("t3code-relay/db/RelayDb") {} export const PlanetscaleDatabase = Effect.gen(function* () { const { stage } = yield* Alchemy.Stack; const schema = yield* Drizzle.Schema("RelaySchema", { schema: "./src/persistence/schema.ts", out: "./migrations/postgres", dialect: "postgres", }); const mode = relayDatabaseMode(stage); const database = mode === "shared-database" ? yield* Planetscale.PostgresDatabase("RelayPostgresDatabase", { name: "t3coderelay", region: { slug: "us-west" }, clusterSize: "PS_5", migrationsDir: schema.out, migrationsTable: "relay_migrations", replicas: 0, // BUMP BEFORE GOING TO PROD }).pipe(RemovalPolicy.retain()) : yield* Planetscale.PostgresDatabase.ref("RelayPostgresDatabase", { stage: "prod", }); const branch = mode === "stage-branch" ? yield* Planetscale.PostgresBranch("RelayPostgresBranch", { database, migrationsDir: schema.out, migrationsTable: "relay_migrations", }) : undefined; const runtimeRole = yield* Planetscale.PostgresRole("RelayPostgresRuntimeRole", { database, ...(branch ? { branch } : {}), inheritedRoles: ["pg_read_all_data", "pg_write_all_data"], }); return { branch, database, runtimeRole }; }); export const RelayHyperdrive = Effect.gen(function* () { const { runtimeRole } = yield* PlanetscaleDatabase; return yield* Cloudflare.Hyperdrive("RelayHyperdrive", { origin: runtimeRole.origin, caching: { disabled: true, }, originConnectionLimit: 20, }); });