1import * as emrc from "@distilled.cloud/aws/emr-containers";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Binding from "../../Binding.ts";
5import { isBindingHost } from "../Lambda/Function.ts";
6import { virtualClusterPolicyStatement } from "./BindingHttp.ts";
7import { StartJobRun } from "./StartJobRun.ts";
8import type { VirtualCluster } from "./VirtualCluster.ts";
9
10export const StartJobRunHttp = Layer.effect(
11 StartJobRun,
12 Effect.gen(function* () {
13 const op = yield* emrc.startJobRun;
14
15 // Bespoke (not the shared builder): `clientToken` is required on the wire
16 // schema but auto-generated by the SDK's idempotency-token filling when
17 // omitted, so the binding's request keeps it optional.
18 return Effect.fn(function* (virtualCluster: VirtualCluster) {
19 const VirtualClusterId = yield* virtualCluster.virtualClusterId;
20 if (!globalThis.__ALCHEMY_RUNTIME__) {
21 const host = yield* Binding.Host;
22 if (isBindingHost(host)) {
23 yield* host.bind`Allow(${host}, AWS.EMRContainers.StartJobRun(${virtualCluster}))`(
24 {
25 policyStatements: [
26 virtualClusterPolicyStatement(virtualCluster, [
27 "emr-containers:StartJobRun",
28 ]),
29 ],
30 },
31 );
32 }
33 }
34 return Effect.fn(
35 `AWS.EMRContainers.StartJobRun(${virtualCluster.LogicalId})`,
36 )(function* (
37 request: Omit<
38 emrc.StartJobRunRequest,
39 "virtualClusterId" | "clientToken"
40 > & { clientToken?: string },
41 ) {
42 return yield* op({
43 ...request,
44 virtualClusterId: yield* VirtualClusterId,
45 } as emrc.StartJobRunRequest);
46 });
47 });
48 }),
49);