1import * as GCP from "@/GCP";
2import * as Effect from "effect/Effect";
3import { serveProbes } from "../../bindingHost.ts";
4
5export const Registry = GCP.ServiceDirectory.Namespace("Registry", {
6 location: "us-central1",
7});
8
9/** Service the bindings are granted on (roles/servicedirectory.viewer). */
10export const Api = Effect.gen(function* () {
11 const namespace = yield* Registry;
12 return yield* GCP.ServiceDirectory.Service("Api", {
13 namespace: namespace.name,
14 });
15});
16
17export const ENDPOINT_ADDRESS = "10.0.0.2";
18export const ENDPOINT_PORT = 443;
19
20export const Https = Effect.gen(function* () {
21 const service = yield* Api;
22 return yield* GCP.ServiceDirectory.Endpoint("Https", {
23 service: service.name,
24 address: ENDPOINT_ADDRESS,
25 port: ENDPOINT_PORT,
26 });
27});
28
29/**
30 * Effect-native Cloud Run service exercising every Service Directory
31 * binding as its own runtime service account. Deployed from
32 * {@link ../Bindings.test.ts}.
33 */
34export default class ServiceDirectoryBindingsHost extends GCP.Function<ServiceDirectoryBindingsHost>()(
35 "ServiceDirectoryBindingsHost",
36 { main: import.meta.url, invokerIamDisabled: true },
37 Effect.gen(function* () {
38 const resolve = yield* GCP.ServiceDirectory.Resolve(Api);
39 const getEndpoint = yield* GCP.ServiceDirectory.GetEndpoint(Https);
40
41 return {
42 fetch: serveProbes({
43 resolve: resolve(),
44 getEndpoint: getEndpoint(),
45 }),
46 };
47 }).pipe(
48 Effect.provide(GCP.ServiceDirectory.ResolveHttp),
49 Effect.provide(GCP.ServiceDirectory.GetEndpointHttp),
50 ),
51) {}