@cumulus/aws-client
Version:
Utilities for working with AWS
161 lines • 6.01 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sqsQueueExists = exports.deleteSQSMessage = exports.parseSQSMessageBody = exports.isSQSRecordLike = exports.receiveSQSMessages = exports.sendSQSMessage = exports.getQueueAttributes = exports.deleteQueue = exports.createQueue = exports.getQueueUrlByName = exports.getQueueUrl = exports.getQueueNameFromUrl = void 0;
//@ts-check
/**
* @module SQS
*/
const logger_1 = __importDefault(require("@cumulus/logger"));
const get_1 = __importDefault(require("lodash/get"));
const isObject_1 = __importDefault(require("lodash/isObject"));
const isString_1 = __importDefault(require("lodash/isString"));
const isNil_1 = __importDefault(require("lodash/isNil"));
const client_sqs_1 = require("@aws-sdk/client-sqs");
const services_1 = require("./services");
const log = new logger_1.default({ sender: '@cumulus/aws-client/SQS' });
const getQueueNameFromUrl = (queueUrl) => queueUrl.split('/').pop();
exports.getQueueNameFromUrl = getQueueNameFromUrl;
const getQueueUrl = (sourceArn, queueName) => {
const arnParts = sourceArn.split(':');
return `https://sqs.${arnParts[3]}.amazonaws.com/${arnParts[4]}/${queueName}`;
};
exports.getQueueUrl = getQueueUrl;
const getQueueUrlByName = async (queueName) => {
const command = new client_sqs_1.GetQueueUrlCommand({ QueueName: queueName });
const response = await (0, services_1.sqs)().send(command);
return response.QueueUrl;
};
exports.getQueueUrlByName = getQueueUrlByName;
/**
* Create an SQS Queue. Properly handles localstack queue URLs
*/
async function createQueue(QueueName) {
const command = new client_sqs_1.CreateQueueCommand({ QueueName });
const createQueueResponse = await (0, services_1.sqs)().send(command)
.catch((error) => {
log.error(error);
throw error;
});
return createQueueResponse.QueueUrl;
}
exports.createQueue = createQueue;
const deleteQueue = (queueUrl) => {
const command = new client_sqs_1.DeleteQueueCommand({ QueueUrl: queueUrl });
return (0, services_1.sqs)().send(command)
.catch((error) => {
log.error(error);
throw error;
});
};
exports.deleteQueue = deleteQueue;
const getQueueAttributes = async (queueName) => {
const queueUrl = await (0, exports.getQueueUrlByName)(queueName);
if (!queueUrl) {
throw new Error(`Unable to determine QueueUrl of ${queueName}`);
}
const command = new client_sqs_1.GetQueueAttributesCommand({
AttributeNames: ['All'],
QueueUrl: queueUrl,
});
const response = await (0, services_1.sqs)().send(command);
return {
...response.Attributes,
name: queueName,
};
};
exports.getQueueAttributes = getQueueAttributes;
/**
* Send a message to AWS SQS
**/
const sendSQSMessage = (queueUrl, message, logOverride = undefined) => {
const logger = logOverride || log;
let messageBody;
if ((0, isString_1.default)(message))
messageBody = message;
else if ((0, isObject_1.default)(message))
messageBody = JSON.stringify(message);
else
throw new Error('body type is not accepted');
const command = new client_sqs_1.SendMessageCommand({
MessageBody: messageBody,
QueueUrl: queueUrl,
});
return (0, services_1.sqs)().send(command)
.catch((error) => {
logger.error(error);
throw error;
});
};
exports.sendSQSMessage = sendSQSMessage;
/**
* Receives SQS messages from a given queue. The number of messages received
* can be set and the timeout is also adjustable.
*/
const receiveSQSMessages = async (queueUrl, options) => {
const params = {
QueueUrl: queueUrl,
AttributeNames: [client_sqs_1.QueueAttributeName.All],
// 0 is a valid value for VisibilityTimeout
VisibilityTimeout: (0, isNil_1.default)(options.visibilityTimeout) ? 30 : options.visibilityTimeout,
WaitTimeSeconds: options.waitTimeSeconds || 0,
MaxNumberOfMessages: options.numOfMessages || 1,
};
const command = new client_sqs_1.ReceiveMessageCommand(params);
const messages = await (0, services_1.sqs)().send(command)
.catch((error) => {
log.error(error);
throw error;
});
return (messages.Messages ?? []);
};
exports.receiveSQSMessages = receiveSQSMessages;
/**
* Bare check for SQS message Shape
*/
const isSQSRecordLike = (message) => (message instanceof Object
&& ('body' in message || 'Body' in message));
exports.isSQSRecordLike = isSQSRecordLike;
/**
* Extract SQS message body
*/
const parseSQSMessageBody = (message) => JSON.parse((0, get_1.default)(message, 'Body', (0, get_1.default)(message, 'body')) ?? '{}');
exports.parseSQSMessageBody = parseSQSMessageBody;
/**
* Delete a given SQS message from a given queue.
*/
const deleteSQSMessage = (QueueUrl, ReceiptHandle) => {
const command = new client_sqs_1.DeleteMessageCommand({ QueueUrl, ReceiptHandle });
return (0, services_1.sqs)().send(command)
.catch((error) => {
log.error(error);
throw error;
});
};
exports.deleteSQSMessage = deleteSQSMessage;
/**
* Test if an SQS queue exists
*/
const sqsQueueExists = async (queueUrl) => {
const QueueName = (0, exports.getQueueNameFromUrl)(queueUrl);
if (!QueueName) {
throw new Error(`Unable to determine QueueName from ${queueUrl}`);
}
const command = new client_sqs_1.GetQueueUrlCommand({ QueueName });
try {
await (0, services_1.sqs)().send(command);
return true;
}
catch (error) {
if (error.name === 'QueueDoesNotExist') {
log.warn(`Queue ${QueueName} does not exist`);
return false;
}
log.error(error);
throw error;
}
};
exports.sqsQueueExists = sqsQueueExists;
//# sourceMappingURL=SQS.js.map
;