1import * as GCP from "@/GCP";
2import * as Effect from "effect/Effect";
3import { serveProbes } from "../../bindingHost.ts";
4
5/**
6 * A GitHub connection must be OAuth-authorized before it can mint tokens;
7 * set GCP_TEST_CLOUDBUILD_REPO to a repository URL an authorized
8 * connection can reach.
9 */
10export const remoteUri =
11 process.env.GCP_TEST_CLOUDBUILD_REPO ??
12 "https://github.com/octocat/Hello-World.git";
13
14/** Linked repository the host reads tokens and refs for. */
15export const Source = Effect.gen(function* () {
16 const connection = yield* GCP.CloudBuild.Connection("Github", {
17 githubConfig: {},
18 });
19 return yield* GCP.CloudBuild.Repository("Source", {
20 connection: connection.name,
21 remoteUri,
22 });
23});
24
25/**
26 * Effect-native Cloud Run service exercising every Cloud Build binding as
27 * its own runtime service account. Deployed from
28 * {@link ../Bindings.test.ts}.
29 */
30export default class CloudBuildBindingsHost extends GCP.Function<CloudBuildBindingsHost>()(
31 "CloudBuildBindingsHost",
32 { main: import.meta.url, invokerIamDisabled: true },
33 Effect.gen(function* () {
34 const readToken = yield* GCP.CloudBuild.AccessReadToken(Source);
35 const readWriteToken = yield* GCP.CloudBuild.AccessReadWriteToken(Source);
36 const fetchGitRefs = yield* GCP.CloudBuild.FetchGitRefs(Source);
37
38 return {
39 fetch: serveProbes({
40 accessReadToken: readToken(),
41 accessReadWriteToken: readWriteToken(),
42 fetchGitRefs: fetchGitRefs({ refType: "BRANCH" }),
43 }),
44 };
45 }).pipe(
46 Effect.provide(GCP.CloudBuild.AccessReadTokenHttp),
47 Effect.provide(GCP.CloudBuild.AccessReadWriteTokenHttp),
48 Effect.provide(GCP.CloudBuild.FetchGitRefsHttp),
49 ),
50) {}