1/**
2 * Process bootstrap for the hosted `AWS.EC2.Instance` program (a systemd
3 * unit running bun). The generated entry imports this module and the user's
4 * `main`, nothing else — see {@link ./Process.ts} for why.
5 */
6import * as Credentials from "@distilled.cloud/aws/Credentials";
7import * as Region from "@distilled.cloud/aws/Region";
8import { BunServices } from "@effect/platform-bun";
9import * as ConfigProvider from "effect/ConfigProvider";
10import * as Effect from "effect/Effect";
11import * as Layer from "effect/Layer";
12import * as Logger from "effect/Logger";
13import * as FetchHttpClient from "effect/http/FetchHttpClient";
14import { BunHttpServer } from "../../Http.ts";
15import { reifyBoundConfigProvider } from "../../Runtime.ts";
16import {
17 entrypointLayer,
18 resolveProgram,
19 runProcess,
20 stackFromEnv,
21} from "./Process.ts";
22
23/** Serve the bundled program with a Bun HTTP server on the instance's `PORT`. */
24export const bootstrap = (entrypoint: unknown): Promise<void> => {
25 const platform = Layer.mergeAll(
26 BunServices.layer,
27 FetchHttpClient.layer,
28 Logger.layer([Logger.consolePretty()]),
29 );
30
31 const program = resolveProgram("program", { telemetry: true }).pipe(
32 Effect.provide(
33 entrypointLayer(entrypoint).pipe(
34 Layer.provideMerge(stackFromEnv),
35 // The instance profile: credentials come from IMDS, not the env.
36 Layer.provideMerge(Credentials.fromChain()),
37 Layer.provideMerge(Region.fromEnv()),
38 Layer.provideMerge(BunHttpServer()),
39 Layer.provideMerge(platform),
40 Layer.provideMerge(
41 Layer.succeed(
42 ConfigProvider.ConfigProvider,
43 reifyBoundConfigProvider(ConfigProvider.fromEnv(), process.env),
44 ),
45 ),
46 ),
47 ),
48 Effect.scoped,
49 );
50
51 return runProcess("Instance", program);
52};