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 StartMessageMoveTaskRequest extends Omit<
7 sqs.StartMessageMoveTaskRequest,
8 "SourceArn" | "DestinationArn"
9> {}
10
11/**
12 * Runtime binding for `sqs:StartMessageMoveTask` (dead-letter queue
13 * redrive).
14 *
15 * Bind this operation to a dead-letter {@link Queue} (the redrive *source*)
16 * inside a function runtime to start moving its messages. Redrive requires
17 * more than the start permission alone, so the binding grants the host
18 * function `sqs:StartMessageMoveTask`, `sqs:ReceiveMessage`,
19 * `sqs:DeleteMessage`, and `sqs:GetQueueAttributes` on the source queue.
20 *
21 * Pass a `destination` Queue at bind time to redrive into a specific queue
22 * (grants `sqs:SendMessage` + `sqs:GetQueueAttributes` on it and injects its
23 * ARN as `DestinationArn`). Without a destination, messages are redriven to
24 * their original source queues — which requires `sqs:SendMessage` on those
25 * queues, so the binding grants `sqs:SendMessage` on `*` in that mode.
26 *
27 * Provide the `StartMessageMoveTaskHttp` layer on the Function to implement
28 * the binding.
29 * ### Dead-Letter Queue Redrive
30 * **Example:** Redrive a DLQ into a Specific Queue
31 * ```typescript
32 * // init (provide SQS.StartMessageMoveTaskHttp on the Function)
33 * const startMessageMoveTask = yield* SQS.StartMessageMoveTask(dlq, {
34 * destination: ordersQueue,
35 * });
36 *
37 * // runtime
38 * const { TaskHandle } = yield* startMessageMoveTask();
39 * ```
40 *
41 * **Example:** Rate-Limited Redrive
42 * ```typescript
43 * yield* startMessageMoveTask({ MaxNumberOfMessagesPerSecond: 10 });
44 * ```
45 *
46 * @binding
47 */
48export interface StartMessageMoveTask extends Binding.Service<
49 StartMessageMoveTask,
50 "AWS.SQS.StartMessageMoveTask",
51 (
52 source: Queue,
53 options?: {
54 /**
55 * The queue messages are redriven into. When omitted, messages are
56 * moved back to their original source queues (and the binding grants
57 * `sqs:SendMessage` on `*`).
58 */
59 destination?: Queue;
60 },
61 ) => Effect.Effect<
62 (
63 request?: StartMessageMoveTaskRequest,
64 ) => Effect.Effect<
65 sqs.StartMessageMoveTaskResult,
66 sqs.StartMessageMoveTaskError
67 >
68 >
69> {}
70
71export const StartMessageMoveTask = Binding.Service<StartMessageMoveTask>(
72 "AWS.SQS.StartMessageMoveTask",
73);