1import * as marketplace from "@distilled.cloud/gcp/authorizedbuyersmarketplace_v1";
2import * as Effect from "effect/Effect";
3import { MinimumLogLevel } from "effect/References";
4import * as Schedule from "effect/Schedule";
5
6export const logLevel = Effect.provideService(
7 MinimumLogLevel,
8 process.env.DEBUG ? "Debug" : "Info",
9);
10
11export const probeParent = "buyers/1/clients/1";
12export const probeName = `${probeParent}/users/0`;
13
14const expandParent = (value: string) => {
15 const trimmed = value.replace(/\/+$/, "").trim();
16 if (trimmed.length === 0) return trimmed;
17 if (trimmed.includes("/clients/")) {
18 return trimmed.startsWith("buyers/") ? trimmed : `buyers/${trimmed}`;
19 }
20 return trimmed;
21};
22
23const envParent = process.env.GCP_AUTHORIZEDBUYERSMARKETPLACE_PARENT?.trim();
24const envBuyer = process.env.GCP_AUTHORIZEDBUYERSMARKETPLACE_BUYER_ID?.trim();
25const envClient = process.env.GCP_AUTHORIZEDBUYERSMARKETPLACE_CLIENT_ID?.trim();
26
27// Full lifecycle needs an Authorized Buyers account with a client; set
28// GCP_AUTHORIZEDBUYERSMARKETPLACE_PARENT (or _BUYER_ID + _CLIENT_ID).
29export const lifecycleParent = envParent
30 ? expandParent(envParent)
31 : envBuyer && envClient
32 ? expandParent(`${envBuyer}/clients/${envClient}`)
33 : undefined;
34
35export const waitUntilGone = (name: string) =>
36 marketplace.getBuyersClientsUsers({ name }).pipe(
37 Effect.as("found" as const),
38 Effect.catchTag("NotFound", () => Effect.succeed("gone" as const)),
39 Effect.repeat({
40 schedule: Schedule.spaced("1 second"),
41 until: (status) => status === "gone",
42 times: 10,
43 }),
44 );