UNPKG

@rewaa/event-broker

Version:

A broker for all the events that Rewaa will ever produce or consume

230 lines 8.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SQSProducer = void 0; const client_sqs_1 = require("@aws-sdk/client-sqs"); const constants_1 = require("../constants"); const uuid_1 = require("uuid"); class SQSProducer { constructor(logger, config) { this.logger = logger; this.send = async (queueUrl, message, messageOptions) => { return await this.sqs.sendMessage(this.getSendMessageRequestInput(queueUrl, message, messageOptions)); }; this.sendBatch = async (queueUrl, messages) => { return await this.sqs.sendMessageBatch(this.getBatchMessageRequest(queueUrl, messages)); }; this.createQueue = async (queueName, attributes, tags) => { attributes = attributes || {}; if (this.isFifoQueue(queueName)) { attributes.FifoQueue = "true"; } const params = { QueueName: queueName, Attributes: attributes, tags, }; try { const { QueueUrl } = await this.sqs.createQueue(params); return QueueUrl; } catch (error) { this.logger.error(`Queue creation failed: ${queueName}`); throw error; } }; this.getQueueAttributes = async (queueUrl, attributes) => { const params = { QueueUrl: queueUrl, AttributeNames: attributes, }; try { const { Attributes } = await this.sqs.getQueueAttributes(params); return Attributes; } catch (error) { this.logger.error(`Failed to fetch queue attributes: ${queueUrl}`); throw error; } }; this.deleteQueue = async (queueUrl) => { const params = { QueueUrl: queueUrl, }; try { await this.sqs.deleteQueue(params); return true; } catch (error) { this.logger.error(`Queue deletion failed: ${queueUrl}`); throw error; } }; this.deleteMessage = async (queueUrl, receiptHandle) => { const params = { QueueUrl: queueUrl, ReceiptHandle: receiptHandle, }; try { await this.sqs.deleteMessage(params); return true; } catch (error) { this.logger.error(`Message deletion failed: ${queueUrl} - ${receiptHandle}`); throw error; } }; this.deleteMessages = async (queueUrl, receiptHandles) => { const params = { QueueUrl: queueUrl, Entries: receiptHandles.map((receiptHandle) => ({ Id: (0, uuid_1.v4)(), ReceiptHandle: receiptHandle, })), }; try { await this.sqs.deleteMessageBatch(params); return true; } catch (error) { this.logger.error(`Batch message deletion failed: ${queueUrl} - ${receiptHandles}`); throw error; } }; this.getQueueUrl = async (queueName) => { const params = { QueueName: queueName, }; try { const result = await this.sqs.getQueueUrl(params); return result.QueueUrl; } catch (error) { this.logger.error(`Queue not found, creating new: ${queueName} \n ${error}`); return undefined; } }; this.setQueueAttributes = async (queueUrl, attributes) => { const params = { QueueUrl: queueUrl, Attributes: attributes, }; try { await this.sqs.setQueueAttributes(params); } catch (error) { this.logger.error(`setQueueAttributes failed for queueUrl: ${queueUrl}`); throw error; } }; this.tagQueue = async (queueUrl, tags) => { const params = { QueueUrl: queueUrl, Tags: tags, }; try { await this.sqs.tagQueue(params); } catch (error) { this.logger.error(`tagQueue failed for queueUrl: ${queueUrl}`); throw error; } }; this.isFifoQueue = (queueUrl) => queueUrl.includes(".fifo"); this.sqs = new client_sqs_1.SQS(config); } get client() { return this.sqs; } getSendMessageRequestInput(queueUrl, message, messageOptions) { const params = { MessageBody: JSON.stringify(message), QueueUrl: queueUrl, DelaySeconds: messageOptions.delay, MessageAttributes: this.getMessageAttributes(queueUrl, message), }; if (this.isFifoQueue(queueUrl)) { params.MessageDeduplicationId = message.deduplicationId || (0, uuid_1.v4)(); params.MessageGroupId = message.messageGroupId; } return params; } getBatchMessageRequest(queueUrl, messages) { const isFifo = this.isFifoQueue(queueUrl); const params = { Entries: messages.map((message) => { return Object.assign({ Id: message.id, DelaySeconds: message.delay, MessageAttributes: this.getMessageAttributes(queueUrl, message), MessageBody: JSON.stringify(message) }, (isFifo && { MessageDeduplicationId: message.deduplicationId || (0, uuid_1.v4)(), MessageGroupId: message.messageGroupId, })); }), QueueUrl: queueUrl, }; return params; } async createQueueFromTopic(params) { const { queueName, topic, isDLQ, queueArn, dlqArn } = params; let queueAttributes = { VisibilityTimeout: `${topic.visibilityTimeout || constants_1.DEFAULT_VISIBILITY_TIMEOUT}`, DelaySeconds: `${topic.delay || constants_1.DEFAULT_MESSAGE_DELAY}`, MessageRetentionPeriod: `${(topic === null || topic === void 0 ? void 0 : topic.retentionPeriod) || (isDLQ ? constants_1.DEFAULT_DLQ_MESSAGE_RETENTION_PERIOD : constants_1.DEFAULT_MESSAGE_RETENTION_PERIOD)}`, Policy: JSON.stringify({ Statement: [ { Effect: "Allow", Principal: { Service: "sns.amazonaws.com", }, Resource: queueArn, Action: "sqs:SendMessage", }, ], }), }; if (!isDLQ && topic.deadLetterQueueEnabled) { queueAttributes.RedrivePolicy = `{\"deadLetterTargetArn\":\"${dlqArn}\",\"maxReceiveCount\":\"${topic.maxRetryCount || constants_1.DEFAULT_MAX_RETRIES}\"}`; } else { queueAttributes.RedrivePolicy = ""; } if (this.isFifoQueue(queueName)) { if (topic.enableHighThroughput) { queueAttributes.DeduplicationScope = "messageGroup"; queueAttributes.FifoThroughputLimit = "perMessageGroupId"; } else { queueAttributes.DeduplicationScope = "queue"; queueAttributes.FifoThroughputLimit = "perQueue"; } queueAttributes.ContentBasedDeduplication = `${!!(topic === null || topic === void 0 ? void 0 : topic.contentBasedDeduplication)}`; } const queueUrl = await this.getQueueUrl(queueName); if (queueUrl) { await this.setQueueAttributes(queueUrl, queueAttributes); if (topic.tags) { await this.sqs.tagQueue({ QueueUrl: queueUrl, Tags: topic.tags, }); } return; } await this.createQueue(queueName, queueAttributes, topic.tags); } getMessageAttributes(queueUrl, message) { return Object.assign(Object.assign({}, (message.messageAttributes || {})), { ContentType: { DataType: "String", StringValue: "JSON", }, QueueUrl: { DataType: "String", StringValue: queueUrl, }, PayloadVersion: { DataType: "String", StringValue: constants_1.PAYLOAD_STRUCTURE_VERSION_V1, } }); } } exports.SQSProducer = SQSProducer; //# sourceMappingURL=producer.sqs.js.map