| 1 | import * as Cloudflare from "@/Cloudflare"; |
| 2 | import * as Effect from "effect/Effect"; |
| 3 | import * as HttpClientRequest from "effect/http/HttpClientRequest"; |
| 4 | import { IsolatedContainer } from "./container.ts"; |
| 5 | |
| 6 | /** Durable Object backing one {@link IsolatedContainer} instance. */ |
| 7 | export 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 | ) {} |