@rewaa/event-broker
Version:
A broker for all the events that Rewaa will ever produce or consume
230 lines • 8.91 kB
JavaScript
;
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