1/**
2 * Process bootstrap for `Docker.Service` (a bun process serving the
3 * bundled program). The generated entry imports this module and the user's
4 * `main`, nothing else — see {@link ./Process.ts} for why.
5 */
6import { BunServices } from "@effect/platform-bun";
7import * as ConfigProvider from "effect/ConfigProvider";
8import * as Effect from "effect/Effect";
9import * as Layer from "effect/Layer";
10import * as Logger from "effect/Logger";
11import * as FetchHttpClient from "effect/http/FetchHttpClient";
12import { BunHttpServer } from "../../Http.ts";
13import { reifyBoundConfigProvider } from "../../Runtime.ts";
14import {
15 entrypointLayer,
16 resolveProgram,
17 runProcess,
18 stackFromEnv,
19} from "./Process.ts";
20
21/**
22 * Resolve the bundled program (the runners registered via `host.run` /
23 * serve) and run it with a Bun HTTP server bound to `PORT`, so the returned
24 * `{ fetch }` handler is actually served and `host.run` loops stay alive.
25 */
26export const bootstrap = (entrypoint: unknown): Promise<void> => {
27 const platform = Layer.mergeAll(
28 BunServices.layer,
29 FetchHttpClient.layer,
30 Logger.layer([Logger.consolePretty()]),
31 );
32
33 const program = resolveProgram("program").pipe(
34 Effect.provide(
35 entrypointLayer(entrypoint).pipe(
36 Layer.provideMerge(stackFromEnv),
37 Layer.provideMerge(BunHttpServer()),
38 Layer.provideMerge(platform),
39 Layer.provideMerge(
40 Layer.succeed(
41 ConfigProvider.ConfigProvider,
42 reifyBoundConfigProvider(ConfigProvider.fromEnv(), process.env),
43 ),
44 ),
45 ),
46 ),
47 Effect.scoped,
48 );
49
50 return runProcess("Docker service", program);
51};