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 ReceiveMessageRequest extends Omit<
7 sqs.ReceiveMessageRequest,
8 "QueueUrl"
9> {}
10
11/**
12 * Runtime binding for `sqs:ReceiveMessage`.
13 *
14 * Bind this operation to a {@link Queue} inside a function runtime to poll
15 * messages on demand. The binding grants the host function
16 * `sqs:ReceiveMessage` on the queue. Provide the `ReceiveMessageHttp` layer
17 * on the Function to implement the binding.
18 *
19 * For push-based consumption (Lambda event-source mapping) use
20 * {@link consumeQueueMessages} instead of polling manually.
21 * ### Receiving Messages
22 * **Example:** Poll for Messages
23 * ```typescript
24 * // init (provide SQS.ReceiveMessageHttp on the Function)
25 * const receiveMessage = yield* SQS.ReceiveMessage(queue);
26 *
27 * // runtime: long-poll for up to 10 messages
28 * const result = yield* receiveMessage({
29 * MaxNumberOfMessages: 10,
30 * WaitTimeSeconds: 2,
31 * });
32 * for (const message of result.Messages ?? []) {
33 * // message.Body, message.ReceiptHandle
34 * }
35 * ```
36 *
37 * @binding
38 */
39export interface ReceiveMessage extends Binding.Service<
40 ReceiveMessage,
41 "AWS.SQS.ReceiveMessage",
42 (
43 queue: Queue,
44 ) => Effect.Effect<
45 (
46 request: ReceiveMessageRequest,
47 ) => Effect.Effect<sqs.ReceiveMessageResult, sqs.ReceiveMessageError>
48 >
49> {}
50
51export const ReceiveMessage = Binding.Service<ReceiveMessage>(
52 "AWS.SQS.ReceiveMessage",
53);