1/**
2 * Process bootstrap for `AWS.Batch.JobDefinition` 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 {
15 entrypointLayer,
16 resolveProgram,
17 runProcess,
18 stackFromEnv,
19} from "./Process.ts";
20
21/**
22 * Run the bundled job to completion: no HTTP server, and the process exits 0
23 * explicitly once the program finishes (Batch waits on the container).
24 */
25export const bootstrap = (entrypoint: unknown): Promise<void> => {
26 const platform = Layer.mergeAll(
27 BunServices.layer,
28 FetchHttpClient.layer,
29 Logger.layer([Logger.consolePretty()]),
30 );
31
32 const program = resolveProgram("program").pipe(
33 Effect.provide(
34 entrypointLayer(entrypoint).pipe(
35 Layer.provideMerge(stackFromEnv),
36 Layer.provideMerge(Credentials.fromEnv()),
37 Layer.provideMerge(Region.fromEnv()),
38 Layer.provideMerge(platform),
39 Layer.provideMerge(
40 Layer.succeed(
41 ConfigProvider.ConfigProvider,
42 ConfigProvider.fromEnv(),
43 ),
44 ),
45 ),
46 ),
47 Effect.scoped,
48 );
49
50 return runProcess("Batch job", program, { exitOnComplete: true });
51};