Skip to content

Instantly share code, notes, and snippets.

@dmitry-tuzenkov
Created December 29, 2021 15:56
Show Gist options
  • Save dmitry-tuzenkov/77ed79b3695ad8de7e0be8a2695f6b86 to your computer and use it in GitHub Desktop.
Save dmitry-tuzenkov/77ed79b3695ad8de7e0be8a2695f6b86 to your computer and use it in GitHub Desktop.
Simple AWS SQS wrapper
const assert = require('assert')
const debug = require('debug')('app:aws-sqs')
const {
SQSClient,
DeleteMessageCommand,
SendMessageCommand,
ReceiveMessageCommand,
} = require('@aws-sdk/client-sqs')
const { pack } = require('./utils-data')
module.exports = ({
accessKeyId,
secretAccessKey,
region = 'eu-central-1',
}) => {
assert(accessKeyId, 'Parameter "accessKeyId" is required')
assert(secretAccessKey, 'Parameter "secretAccessKey" is required')
const awsQueueClient = new SQSClient({ region, accessKeyId, secretAccessKey })
debug('Initialized aws sqs with %O', {
accessKeyId,
secretAccessKey,
region,
})
const sendMessage = async (queueUrl, message) => {
const payload = {
QueueUrl: queueUrl,
DelaySeconds: 0,
VisibilityTimeout: 60,
MessageBody: pack(message),
}
debug('Try to send message to aws-sqs queue %O', payload)
const result = await awsQueueClient.send(new SendMessageCommand(payload))
debug('Got response from send aws-sqs message %O', result)
return result
}
const readMessages = async (queueUrl, { count = 10, waitTime = 10 } = {}) => {
const payload = {
QueueUrl: queueUrl,
MaxNumberOfMessages: count,
WaitTimeSeconds: waitTime,
}
debug('Try to read messages from aws-sqs queue %O', payload)
const result = await awsQueueClient.send(new ReceiveMessageCommand(payload))
debug('Got response from read aws-sqs message %O', result)
return result
}
const deleteMessage = async (queueUrl, { ReceiptHandle }) => {
debug('Try to delete message to aws-sqs queue (%s): %O', queueUrl, {
ReceiptHandle,
})
const result = await awsQueueClient.send(
new DeleteMessageCommand({
QueueUrl: queueUrl,
ReceiptHandle: ReceiptHandle,
})
)
debug('Got response from delete aws-sqs message %O', result)
return result
}
return {
deleteMessage,
sendMessage,
readMessages,
}
}
const pack = (obj) => Buffer.from(JSON.stringify(obj)).toString('base64')
const unpack = (value) => {
const raw = Buffer.from(value, 'base64').toString('utf8')
try {
return JSON.parse(raw)
} catch (ex) {
console.error(`Unable to unpack ${raw} seems corrupted`)
console.error(ex)
return {}
}
}
module.exports = {
pack,
unpack
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment