85 lines · 2.6 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 * as Layer from "effect/Layer"; import { relayDatabaseMode } from "./dbConfig.ts"; export class RelayDb extends Context.Service<  RelayDb,  EffectPgDatabase & {    readonly $client: PgClient;  }>()("t3code-relay/db/RelayDb") {} export class RelayTransactions extends Context.Service<  RelayTransactions,  {    readonly withTransaction: RelayDb["Service"]["$client"]["withTransaction"];  }>()("t3code-relay/db/RelayTransactions") {  static readonly layer = Layer.effect(    RelayTransactions,    Effect.gen(function* () {      const db = yield* RelayDb;      return RelayTransactions.of({        withTransaction: db.$client.withTransaction,      });    }),  );} 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_20",          migrations: { dir: schema.out, table: "relay_migrations" },          replicas: 2,        }).pipe(RemovalPolicy.retain())      : yield* Planetscale.PostgresDatabase.ref("RelayPostgresDatabase", {          stage: "prod",        });  const branch =    mode === "stage-branch"      ? yield* Planetscale.PostgresBranch("RelayPostgresBranch", {          database,          migrations: { dir: schema.out, table: "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.Connection("RelayHyperdrive", {    origin: runtimeRole.origin,    caching: {      disabled: true,    },    originConnectionLimit: 20,  });});