1/// <reference types="node" />
2
3import * as Credentials from "@distilled.cloud/cloudflare/Credentials";
4import * as NodeServices from "@effect/platform-node/NodeServices";
5import * as Effect from "effect/Effect";
6import * as Layer from "effect/Layer";
7import * as FetchHttpClient from "effect/http/FetchHttpClient";
8import { KvNamespace } from "../../../dist/core/node/bindings/index.mjs";
9import * as WorkerProxy from "../../../dist/core/node/proxy/WorkerProxy.mjs";
10import * as Runtime from "../../../dist/core/node/Runtime.mjs";
11import * as RuntimeServices from "../../../dist/core/node/RuntimeServices.mjs";
12
13const main = Effect.gen(function* () {
14 const runtime = yield* Runtime.Runtime;
15 const workerProxy = yield* WorkerProxy.WorkerProxy;
16 const proxyInstance = yield* workerProxy.serve({ port: 0 });
17 const upstreamUrl = yield* runtime.start({
18 name: "test",
19 compatibilityDate: "2026-01-01",
20 compatibilityFlags: [],
21 bindings: [KvNamespace.remote("TEST", "ff74cfc28c744cdfb77664ff07050b13")],
22 modules: [
23 {
24 name: "test.js",
25 type: "ESModule",
26 content: `export default { fetch: async (request, env) => {
27 const list = await env.TEST.list();
28 return Response.json(list);
29 } }`,
30 },
31 ],
32 });
33 yield* proxyInstance.set(upstreamUrl);
34 console.log(proxyInstance.url.href);
35 const res = yield* Effect.promise(async () => {
36 const res = await fetch(new URL("/", proxyInstance.url));
37 return {
38 status: res.status,
39 body: await res.text(),
40 };
41 });
42 console.log(res);
43 return res;
44});
45
46const services = RuntimeServices.layerRuntime({
47 api: { accountId: process.env.CLOUDFLARE_ACCOUNT_ID! },
48}).pipe(
49 Layer.provide(
50 Layer.mergeAll(
51 Credentials.fromEnv(),
52 NodeServices.layer,
53 FetchHttpClient.layer,
54 ),
55 ),
56);
57
58await main.pipe(Effect.provide(services), Effect.scoped, Effect.runPromise);