1import * as Cloudflare from "@/Cloudflare";
2import * as Effect from "effect/Effect";
3import { HttpServerRequest } from "effect/http/HttpServerRequest";
4import * as HttpServerResponse from "effect/http/HttpServerResponse";
5import { RemoteContainerObject } from "./object.ts";
6
7export default class RemoteContainerWorker extends Cloudflare.Worker<RemoteContainerWorker>()(
8 "RemoteContainerWorker",
9 {
10 main: import.meta.url,
11 },
12 Effect.gen(function* () {
13 const objects = yield* RemoteContainerObject;
14
15 return {
16 fetch: Effect.gen(function* () {
17 const request = yield* HttpServerRequest;
18 const url = new URL(request.url, "http://x");
19
20 if (url.pathname === "/hello") {
21 const text = yield* objects.getByName("default").hello();
22 return HttpServerResponse.text(text);
23 }
24
25 if (url.pathname.startsWith("/passthrough")) {
26 // Forward the raw incoming request through the DO's fetch handler
27 // to the container port (see the fixture object's `fetch`).
28 return yield* objects.getByName("default").fetch(request);
29 }
30
31 return HttpServerResponse.text("ok");
32 }).pipe(
33 Effect.catchTag("HttpClientError", (err) =>
34 Effect.succeed(
35 err.response
36 ? HttpServerResponse.fromClientResponse(err.response)
37 : HttpServerResponse.text(err.message, {
38 status: 500,
39 }),
40 ),
41 ),
42 ),
43 };
44 }),
45) {}