1import * as batch from "@distilled.cloud/aws/batch";
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 type { JobDefinition } from "./JobDefinition.ts";
7import type { JobQueue } from "./JobQueue.ts";
8import { SubmitJob, type SubmitJobRequest } from "./SubmitJob.ts";
9
10export const SubmitJobHttp = Layer.effect(
11 SubmitJob,
12 Effect.gen(function* () {
13 const submitJob = yield* batch.submitJob;
14
15 return Effect.fn(function* (queue: JobQueue, jobDefinition: JobDefinition) {
16 // Outputs yield a DEFERRED effect — resolve again per invocation below.
17 const JobQueueArn = yield* queue.jobQueueArn;
18 const JobDefinitionArn = yield* jobDefinition.jobDefinitionArn;
19 if (!globalThis.__ALCHEMY_RUNTIME__) {
20 const host = yield* Binding.Host;
21 if (isBindingHost(host)) {
22 yield* host.bind`Allow(${host}, AWS.Batch.SubmitJob(${queue}, ${jobDefinition}))`(
23 {
24 policyStatements: [
25 {
26 Effect: "Allow",
27 Action: ["batch:SubmitJob"],
28 Resource: [queue.jobQueueArn, jobDefinition.jobDefinitionArn],
29 },
30 ],
31 },
32 );
33 }
34 }
35 return Effect.fn(
36 `AWS.Batch.SubmitJob(${queue.LogicalId}, ${jobDefinition.LogicalId})`,
37 )(function* (request: SubmitJobRequest) {
38 const jobQueueArn = yield* JobQueueArn;
39 const jobDefinitionArn = yield* JobDefinitionArn;
40 return yield* submitJob({
41 ...request,
42 jobQueue: jobQueueArn,
43 jobDefinition: jobDefinitionArn,
44 });
45 });
46 });
47 }),
48);