69 lines · 2.2 KB · TypeScript
RawDownload
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,  });});