@iamdeniz/aws-sqs-consumer
Version:
Advanced AWS SQS message consumer with retry, DLQ, batch processing, metrics, and middleware support
163 lines (162 loc) • 5.53 kB
TypeScript
/// <reference types="node" />
import { EventEmitter } from 'events';
import { ConsumerOptions } from '../interfaces/config';
import { BatchMiddleware, MessageMiddleware } from '../types/middleware';
/**
* QueueConsumer class for processing AWS SQS queue messages
* Provides both individual message processing and batch processing capabilities
* Supports middleware, retry logic, dead letter queues, and performance metrics
*/
export default class QueueConsumer extends EventEmitter {
private readonly _client;
private readonly _url;
private readonly _handler;
private readonly _batchHandler;
private _isShuttingDown;
private _isRunning;
private _stoppedFunction;
private readonly _retryOptions;
private readonly _dlqOptions;
private readonly _metricsOptions;
private readonly _batchOptions;
private readonly _middlewareOptions;
private readonly _awsConfig;
private _messageMiddleware;
private _batchMiddleware;
private _startTime;
private _messagesProcessed;
private _messagesFailed;
private _messagesSentToDlq;
private _totalRetries;
private _totalProcessingTime;
private _messagesFiltered;
private static readonly DEFAULT_RETRY_OPTIONS;
private static readonly DEFAULT_DLQ_OPTIONS;
private static readonly DEFAULT_METRICS_OPTIONS;
private static readonly DEFAULT_BATCH_OPTIONS;
private static readonly DEFAULT_MIDDLEWARE_OPTIONS;
private static readonly DEFAULT_AWS_CONFIG;
/**
* Creates a new QueueConsumer instance
* @param options Configuration options for the consumer
*/
constructor(options: ConsumerOptions);
/**
* Starts the queue consumer
* @returns This instance for chaining
*/
run(): Promise<void>;
/**
* Stops the queue consumer gracefully
* @returns Promise that resolves when consumer has fully stopped
*/
stop(): void;
/**
* Returns the number of available messages in the queue
* @returns Promise resolving to the number of available messages
*/
getAvailableQueueNumber(): Promise<number>;
/**
* Sets a function to be called when the consumer stops
* @param stopFunction Function to execute when consumer stops
*/
setStoppedFunction(stopFunction: () => Promise<void>): void;
/**
* Registers a message middleware function
* @param middleware The middleware function to register
* @returns This instance for chaining
*/
use(middleware: MessageMiddleware): QueueConsumer;
/**
* Registers a batch middleware function
* @param middleware The middleware function to register
* @returns This instance for chaining
*/
useBatch(middleware: BatchMiddleware): QueueConsumer;
get isRunning(): boolean;
/**
* Extract region from queue URL
* @param queueUrl The SQS queue URL
* @returns The AWS region extracted from the URL
*/
private getRegionFromQueueUrl;
/**
* Process received messages
* @param messages Array of SQS messages to process
*/
private processMessages;
/**
* Get consumer metrics
* @returns Object containing current consumer metrics
*/
private getMetrics;
/**
* Process a group of messages
* @param groupId Group ID for the messages
* @param messages Array of SQS messages to process
*/
private processMessageGroup;
/**
* Process an individual message
* @param message SQS message to process
* @param groupId Group ID for the message
*/
private processIndividualMessage;
/**
* Execute batch middleware pipeline
* @param context Batch middleware context
*/
private executeBatchMiddlewarePipeline;
/**
* Execute message middleware pipeline
* @param context Message middleware context
*/
private executeMessageMiddlewarePipeline;
/**
* Send a failed message to the Dead Letter Queue
* @param message Failed SQS message
* @param error Error that caused the failure
* @param retryCount Number of retries attempted
*/
private sendToDeadLetterQueue;
/**
* Calculate retry backoff delay using exponential backoff
* @param retryCount Current retry attempt number
* @returns Delay in milliseconds before next retry
*/
private calculateBackoffDelay;
/**
* Extend visibility timeout for a message
* @param message SQS message
* @param visibilityTimeout New visibility timeout in seconds
*/
private extendMessageVisibility;
/**
* Sleep for a specified duration
* @param ms Time to sleep in milliseconds
*/
private sleep;
/**
* Main polling loop for retrieving messages from the queue
*/
private pollMessages;
/**
* Parses an SQS message into a more usable format
* @param message Raw SQS message
* @param groupId Group ID for the message
* @returns Parsed message or null if parsing failed
*/
private parseMessage;
/**
* Deletes a batch of messages in a single SQS request
* @param messages Array of SQS messages to delete
* @returns Object containing arrays of successful and failed message IDs
*/
private deleteMessageBatch;
/**
* Process a batch of messages using the batch handler
* @param groupId Group ID for the batch
* @param messages Array of SQS messages to process as a batch
*/
private processBatchWithBatchHandler;
}