1/**
2 * Process bootstrap for `AWS.AppRunner.Service` containers. The generated
3 * entry imports this module and the user's `main`, nothing else — see
4 * {@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 {
16 entrypointLayer,
17 resolveProgram,
18 runProcess,
19 stackFromEnv,
20} from "./Process.ts";
21
22/** Serve the bundled program with a Bun HTTP server on the injected `PORT`. */
23export const bootstrap = (entrypoint: unknown): Promise<void> => {
24 const platform = Layer.mergeAll(
25 BunServices.layer,
26 FetchHttpClient.layer,
27 Logger.layer([Logger.consolePretty()]),
28 );
29
30 const program = resolveProgram("program").pipe(
31 Effect.provide(
32 entrypointLayer(entrypoint).pipe(
33 Layer.provideMerge(stackFromEnv),
34 Layer.provideMerge(Credentials.fromEnv()),
35 Layer.provideMerge(Region.fromEnv()),
36 Layer.provideMerge(BunHttpServer()),
37 Layer.provideMerge(platform),
38 Layer.provideMerge(
39 Layer.succeed(
40 ConfigProvider.ConfigProvider,
41 ConfigProvider.fromEnv(),
42 ),
43 ),
44 ),
45 ),
46 Effect.scoped,
47 );
48
49 return runProcess("App Runner service", program);
50};