1import { Compute } from "@/Prisma/Compute.ts";
2import {
3 ReadWriteBucket,
4 ReadWriteBucketBinding,
5} from "@/Prisma/ReadWriteBucket.ts";
6import * as Effect from "effect/Effect";
7import { HttpServerRequest } from "effect/http/HttpServerRequest";
8import * as HttpServerResponse from "effect/http/HttpServerResponse";
9import { TestBucket, TestProject } from "./bucket.ts";
10import { readRoutes } from "./read-routes.ts";
11import { writeRoutes } from "./write-routes.ts";
12
13/** Read + write access via the native Compute binding (`ReadWriteBucketBinding`). */
14export default Compute(
15 "PrismaReadWriteBucketCompute",
16 Effect.gen(function* () {
17 const project = yield* TestProject;
18 return {
19 project,
20 appName: "alchemy-bucket-binding-readwrite",
21 main: import.meta.filename,
22 port: 8080,
23 timeoutSeconds: 240,
24 destroyOldDeployment: true,
25 };
26 }),
27 Effect.gen(function* () {
28 const bucket = yield* TestBucket;
29 const store = yield* ReadWriteBucket(bucket);
30 // A second bind of the same bucket and access level must resolve to the
31 // SAME bucket-key logical id (pinned by the identity tests) and reuse
32 // that resource; registering a conflicting duplicate would fail the
33 // deploy.
34 yield* ReadWriteBucket(bucket);
35 return {
36 fetch: Effect.gen(function* () {
37 const request = yield* HttpServerRequest;
38 const url = new URL(request.url, "http://x");
39 // The ReadWrite client composes both halves; route to whichever
40 // matches so we exercise read *and* write through one client.
41 const handled =
42 (yield* writeRoutes(store, request, url)) ??
43 (yield* readRoutes(store, url));
44 return handled ?? HttpServerResponse.text("Not Found", { status: 404 });
45 }),
46 };
47 }).pipe(Effect.provide(ReadWriteBucketBinding)),
48);