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, });});
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,
});
});