@message-queue-toolkit/sqs
Version:
SQS adapter for message-queue-toolkit
128 lines (127 loc) • 4.8 kB
TypeScript
import type { SQSClient } from '@aws-sdk/client-sqs';
import type { AbstractSqsConsumer } from '../sqs/AbstractSqsConsumer.ts';
import type { AbstractSqsPublisher } from '../sqs/AbstractSqsPublisher.ts';
/**
* Options for publishing messages with TestSqsPublisher.
* Supports multiple mutually exclusive ways to specify the target queue.
*/
export type TestSqsPublishOptions = {
queueUrl: string;
queueName?: never;
consumer?: never;
publisher?: never;
MessageGroupId?: string;
MessageDeduplicationId?: string;
} | {
queueName: string;
queueUrl?: never;
consumer?: never;
publisher?: never;
MessageGroupId?: string;
MessageDeduplicationId?: string;
} | {
consumer: AbstractSqsConsumer<any, any, any, any, any>;
queueUrl?: never;
queueName?: never;
publisher?: never;
MessageGroupId?: string;
MessageDeduplicationId?: string;
} | {
publisher: AbstractSqsPublisher<any>;
queueUrl?: never;
queueName?: never;
consumer?: never;
MessageGroupId?: string;
MessageDeduplicationId?: string;
};
/**
* TestSqsPublisher - A testing utility for publishing arbitrary messages to SQS queues without validation.
*
* This publisher bypasses all message validation, schema checking, deduplication, and payload offloading
* to enable testing edge cases, invalid messages, and integration scenarios.
*
* **IMPORTANT: This is a testing utility only. Do not use in production code.**
*
* Features:
* - Publish any JSON-serializable payload to any SQS queue
* - No Zod schema validation
* - No message deduplication
* - No payload offloading
* - Accept queueUrl string or consumer/publisher instance per publish call
* - Automatically resolve queueUrl from consumer/publisher
* - Support FIFO queue options (MessageGroupId, MessageDeduplicationId)
*
* @example
* ```typescript
* // Create a single publisher for all queues
* const publisher = new TestSqsPublisher(sqsClient)
*
* // Publish to different queues
* await publisher.publish({ any: 'data' }, { queueUrl: 'https://sqs...' })
* await publisher.publish({ test: 'message' }, { queueName: 'my-queue' })
* await publisher.publish({ test: 'message' }, { consumer: myConsumer })
* await publisher.publish({ other: 'data' }, { publisher: myPublisher })
*
* // FIFO queue with options
* await publisher.publish(
* { test: 'message' },
* {
* queueUrl: 'https://sqs.../my-queue.fifo',
* MessageGroupId: 'group1',
* MessageDeduplicationId: 'unique-id'
* }
* )
* ```
*/
export declare class TestSqsPublisher {
private readonly sqsClient;
/**
* Creates a new TestSqsPublisher instance.
*
* @param sqsClient - AWS SQS client instance
*/
constructor(sqsClient: SQSClient);
/**
* Publishes a message to an SQS queue without any validation.
*
* @param payload - Any JSON-serializable object to publish
* @param options - Queue and message options
* @param options.queueUrl - Direct queue URL (mutually exclusive with queueName/consumer/publisher)
* @param options.queueName - Queue name to resolve to URL (mutually exclusive with queueUrl/consumer/publisher)
* @param options.consumer - Consumer instance to extract queue URL from (mutually exclusive with queueUrl/queueName/publisher)
* @param options.publisher - Publisher instance to extract queue URL from (mutually exclusive with queueUrl/queueName/consumer)
* @param options.MessageGroupId - Required for FIFO queues (queue name ends with .fifo)
* @param options.MessageDeduplicationId - Optional deduplication ID for FIFO queues
*
* @returns Promise that resolves when message is published
* @throws {Error} If none of queueUrl/queueName/consumer/publisher is provided
* @throws {Error} If consumer/publisher has not been initialized (no queueUrl available)
* @throws {Error} If SQS publish fails
*
* @example
* ```typescript
* // Using with a queue URL
* await publisher.publish({ test: 'data' }, { queueUrl: 'https://sqs...' })
*
* // Using with a queue name
* await publisher.publish({ test: 'data' }, { queueName: 'my-queue' })
*
* // Using with a consumer
* await publisher.publish({ test: 'data' }, { consumer: myConsumer })
*
* // Using with a publisher
* await publisher.publish({ test: 'data' }, { publisher: myPublisher })
*
* // FIFO queue
* await publisher.publish(
* { test: 'data' },
* {
* queueUrl: 'https://sqs.../queue.fifo',
* MessageGroupId: 'group1',
* MessageDeduplicationId: 'unique-id'
* }
* )
* ```
*/
publish(payload: unknown, options: TestSqsPublishOptions): Promise<void>;
}