UNPKG

rabbitmq-enterprise-toolkit

Version:

🚀 Enterprise-grade RabbitMQ wrapper for Node.js & TypeScript - High-throughput messaging with automatic retry, DLQ, batch processing & graceful shutdown. Production-ready AMQP client with zero message loss guarantee.

72 lines • 3.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RetryHandler = void 0; const helpers_1 = require("../utils/helpers"); class RetryHandler { constructor(getChannel) { this.getChannel = getChannel; } async handleRetry(msg, options, error) { const headers = msg.properties.headers || {}; const retryCount = headers.retryCount || 0; const retryOptions = options.retryOptions; if (retryOptions && retryCount < retryOptions.maxRetries) { await this.retryMessage(msg, options, retryCount + 1, error); } else { await this.sendToDeadLetterQueue(msg, retryCount, error); } } async retryMessage(msg, options, newRetryCount, error) { const channel = this.getChannel(); const delay = (0, helpers_1.calculateDelay)(newRetryCount - 1, options.retryOptions); const retryQueueName = (0, helpers_1.createRetryQueueName)(options.queueName, newRetryCount); try { await this.createRetryQueue(channel, retryQueueName, delay, options.queueName); const updatedHeaders = this.buildRetryHeaders(msg, newRetryCount, options.queueName, error); await this.publishToRetryQueue(channel, retryQueueName, msg, updatedHeaders); channel.ack(msg); console.log(`Message retried: ${newRetryCount}/${options.retryOptions.maxRetries}, delay: ${delay}ms`); } catch (retryError) { console.error('Retry operation failed:', retryError); channel.nack(msg, false, false); // Send to DLQ } } async createRetryQueue(channel, retryQueueName, delay, originalQueueName) { await channel.assertQueue(retryQueueName, { durable: true, arguments: { 'x-message-ttl': delay, 'x-dead-letter-exchange': '', 'x-dead-letter-routing-key': (0, helpers_1.normalizeQueueName)(originalQueueName) } }); } buildRetryHeaders(msg, newRetryCount, originalQueueName, error) { return { ...msg.properties.headers, retryCount: newRetryCount, originalQueue: originalQueueName, errorMessage: (0, helpers_1.formatError)(error), firstFailedAt: msg.properties.headers?.firstFailedAt || Date.now() }; } async publishToRetryQueue(channel, retryQueueName, msg, headers) { channel.publish('', retryQueueName, msg.content, { ...msg.properties, headers }); } async sendToDeadLetterQueue(msg, retryCount, error) { const channel = this.getChannel(); console.error(`Message retry exhausted, sending to DLQ:`, { messageId: msg.properties.messageId, retryCount, error: (0, helpers_1.formatError)(error) }); channel.nack(msg, false, false); // Send to DLQ } } exports.RetryHandler = RetryHandler; //# sourceMappingURL=retry-handler.js.map