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 { TestNamespace } from "./namespace.ts";
6import { readRoutes } from "./read-routes.ts";
7import { writeRoutes } from "./write-routes.ts";
8
9/** Read + write access via the native Worker binding (`ReadWriteNamespaceBinding`). */
10export default class KVReadWriteBindingWorker extends Cloudflare.Worker<KVReadWriteBindingWorker>()(
11 "KVReadWriteBindingWorker",
12 { main: import.meta.url },
13 Effect.gen(function* () {
14 const namespace = yield* TestNamespace;
15 const kv = yield* Cloudflare.KV.ReadWriteNamespace(namespace);
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(kv, request, url)) ??
24 (yield* readRoutes(kv, url));
25 return handled ?? HttpServerResponse.text("Not Found", { status: 404 });
26 }),
27 };
28 }).pipe(Effect.provide(Cloudflare.KV.ReadWriteNamespaceBinding)),
29) {}