1/**
2 * Process bootstrap for `GCP.Run.Job` and `GCP.Run.WorkerPool`. No HTTP
3 * server — the program's `run` executes, and for a Job the process exits 0
4 * once it finishes (Cloud Run marks the task complete on exit). A worker
5 * pool's long-running `run` loop keeps its instance alive.
6 *
7 * Runtime credentials come from the metadata server (the host's runtime
8 * service account).
9 */
10import { BunServices } from "@effect/platform-bun";
11import * as ConfigProvider from "effect/ConfigProvider";
12import * as Effect from "effect/Effect";
13import * as Layer from "effect/Layer";
14import * as FetchHttpClient from "effect/http/FetchHttpClient";
15import * as Logger from "effect/Logger";
16import { fromMetadataServer } from "../../GCP/MetadataCredentials.ts";
17import { reifyBoundConfigProvider } from "../../Runtime.ts";
18import {
19 entrypointLayer,
20 resolveProgram,
21 runProcess,
22 stackFromEnv,
23} from "./Process.ts";
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", { telemetry: true }).pipe(
33 Effect.provide(
34 entrypointLayer(entrypoint).pipe(
35 Layer.provideMerge(stackFromEnv),
36 Layer.provideMerge(fromMetadataServer()),
37 Layer.provideMerge(platform),
38 Layer.provideMerge(
39 Layer.succeed(
40 ConfigProvider.ConfigProvider,
41 reifyBoundConfigProvider(ConfigProvider.fromEnv(), process.env),
42 ),
43 ),
44 ),
45 ),
46 Effect.scoped,
47 );
48
49 return runProcess("Cloud Run job", program, { exitOnComplete: true });
50};