1import * as Cloudflare from "@/Cloudflare/index.ts";
2import * as Effect from "effect/Effect";
3import { HttpServerRequest } from "effect/http/HttpServerRequest";
4import * as HttpServerResponse from "effect/http/HttpServerResponse";
5import { TestBucket } from "./bucket.ts";
6import { readRoutes } from "./read-routes.ts";
7import { writeRoutes } from "./write-routes.ts";
8
9/** Read + write access via a scoped HTTP API token (`ReadWriteBucketHttp`). */
10export default class R2ReadWriteHttpWorker extends Cloudflare.Worker<R2ReadWriteHttpWorker>()(
11 "R2ReadWriteHttpWorker",
12 { main: import.meta.url },
13 Effect.gen(function* () {
14 const bucket = yield* TestBucket;
15 const r2 = yield* Cloudflare.R2.ReadWriteBucket(bucket);
16 return {
17 fetch: Effect.gen(function* () {
18 const request = yield* HttpServerRequest;
19 const url = new URL(request.url, "http://x");
20 // The ReadWrite client composes both halves; route to whichever
21 // matches so we exercise read *and* write through one client.
22 const handled =
23 (yield* writeRoutes(r2, request, url)) ??
24 (yield* readRoutes(r2, url));
25 return handled ?? HttpServerResponse.text("Not Found", { status: 404 });
26 }),
27 };
28 }).pipe(Effect.provide(Cloudflare.R2.ReadWriteBucketHttp)),
29) {}