UNPKG

@cumulus/aws-client

Version:
161 lines 6.01 kB
"use strict"; 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