btrz-sqs
Version:
Betterez simple client to send messages to an AWS SQS queue with a very convenient interface
101 lines (87 loc) • 2.44 kB
JavaScript
;
const BATCH_SIZE = 10;
const AWS = require("@aws-sdk/client-sqs");
function entryId(entry) {
return entry.Id;
}
function createError(failedMessages) {
if (failedMessages.length === 0) {
return null;
}
return new Error(`Failed to send messages: ${failedMessages.join(", ")}`);
}
function isValidMsg(msg, index) {
if (msg.Id && msg.MessageBody && msg.Id.indexOf(" ") === -1) {
return "";
} else {
return {index: index, msg: msg};
}
}
function validateMessages(messages) {
return messages
.map(isValidMsg)
.filter(function (msg) {
return msg !== "";
});
}
async function recursiveSend(failedMessages, messages, queueUrl, sqs) {
let params = {
Entries: messages.splice(0, BATCH_SIZE),
QueueUrl: queueUrl
};
if (params.Entries.length > 0) {
try {
const result = await sqs.sendMessageBatch(params);
failedMessages = failedMessages.concat((result.Failed || []).map(entryId));
recursiveSend(failedMessages, messages, queueUrl, sqs);
} catch(err) {
throw err;
}
} else {
return Promise.resolve(failedMessages);
}
}
function Queue(config, queueName) {
this.awsConfig = config;
this.queueConfig = config.sqs[queueName];
this.sqs = new AWS.SQS({
credentials: {
accessKeyId: this.awsConfig.key,
secretAccessKey: this.awsConfig.secret,
},
region: this.queueConfig.region
});
}
Queue.prototype.get = function () {
let self = this;
return self.sqs.receiveMessage({ QueueUrl: self.queueConfig.queueUrl });
};
Queue.prototype.send = function(messages) {
let self = this;
let failures = [];
if (!Array.isArray(messages)) {
throw new Error("messages should be an array of Queue.messages");
}
let invalidMsgs = validateMessages(messages);
if (invalidMsgs.length > 0) {
let indexes = invalidMsgs.map((m) => m.index).join(", ");
throw new Error(`invalid messages at indexes ${indexes}`);
}
try {
failures = recursiveSend([], messages, self.queueConfig.queueUrl, self.sqs);
} catch (err) {
return Promise.reject(err);
}
if (failures.length > 0) {
return Promise.reject(createError(failures));
}
return Promise.resolve(true);
};
Queue.createMessage = function (id, message) {
return {
Id: id.toString(),
MessageBody: JSON.stringify(message)
};
};
exports.Queue = Queue;
exports.SQSWorker = require("./worker.js");