1import * as Cloudflare from "@/Cloudflare";
2import * as Effect from "effect/Effect";
3import * as HttpClientRequest from "effect/http/HttpClientRequest";
4import { IsolatedContainer } from "./container.ts";
5
6/** Durable Object backing one {@link IsolatedContainer} instance. */
7export class IsolatedObject extends Cloudflare.DurableObject<IsolatedObject>()(
8 "IsolatedProjectObject",
9 Effect.gen(function* () {
10 const container = yield* IsolatedContainer;
11
12 return Effect.gen(function* () {
13 return {
14 // RPC into the container (forces start + proves it's up).
15 ping: () => container.ping(),
16 // HTTP over the container's TCP port.
17 hello: () =>
18 Effect.gen(function* () {
19 const { fetch } = yield* container.getTcpPort(3000);
20 const response = yield* fetch(
21 HttpClientRequest.get("http://container/"),
22 );
23 return yield* response.text;
24 }).pipe(Effect.orDie),
25 };
26 });
27 }).pipe(
28 Effect.provide(
29 Cloudflare.Containers.layer(IsolatedContainer, {
30 enableInternet: true,
31 }),
32 ),
33 ),
34) {}