1import * as sqs from "@distilled.cloud/aws/sqs";
2import * as Effect from "effect/Effect";
3import * as Binding from "../../Binding.ts";
4import type { Queue } from "./Queue.ts";
5
6export interface SendMessageRequest extends Omit<
7 sqs.SendMessageRequest,
8 "QueueUrl"
9> {}
10
11/**
12 * Runtime binding for `sqs:SendMessage`.
13 *
14 * Bind this operation to a {@link Queue} inside a function runtime to get a
15 * callable that automatically injects the `QueueUrl`. The binding grants the
16 * host function `sqs:SendMessage` on the queue. Provide the `SendMessageHttp`
17 * layer on the Function to implement the binding.
18 * ### Sending Messages
19 * **Example:** Send a Message from a Lambda Function
20 * ```typescript
21 * export class ApiFunction extends Lambda.Function<Lambda.Function>()(
22 * "ApiFunction",
23 * ) {}
24 *
25 * export default ApiFunction.make(
26 * { main: import.meta.url, functionUrl: true },
27 * Effect.gen(function* () {
28 * const queue = yield* SQS.Queue("Jobs");
29 *
30 * // init: bind the operation to the queue (grants sqs:SendMessage)
31 * const sendMessage = yield* SQS.SendMessage(queue);
32 *
33 * return {
34 * fetch: Effect.gen(function* () {
35 * // runtime: QueueUrl is injected automatically
36 * const result = yield* sendMessage({ MessageBody: "hello" });
37 * return yield* HttpServerResponse.json({
38 * messageId: result.MessageId,
39 * });
40 * }).pipe(Effect.orDie),
41 * };
42 * }).pipe(Effect.provide(SQS.SendMessageHttp)),
43 * );
44 * ```
45 *
46 * **Example:** Delay Delivery
47 * ```typescript
48 * yield* sendMessage({ MessageBody: "process later", DelaySeconds: 60 });
49 * ```
50 *
51 * @binding
52 */
53export interface SendMessage extends Binding.Service<
54 SendMessage,
55 "AWS.SQS.SendMessage",
56 (
57 queue: Queue,
58 ) => Effect.Effect<
59 (
60 request: SendMessageRequest,
61 ) => Effect.Effect<sqs.SendMessageResult, sqs.SendMessageError>
62 >
63> {}
64
65export const SendMessage = Binding.Service<SendMessage>("AWS.SQS.SendMessage");