Source: deployment-queue/deployment-queue.js

const {
  SQSClient,
  SendMessageCommand,
  DeleteMessageCommand,
  ReceiveMessageCommand
} = require('@aws-sdk/client-sqs')
const { AwsCredentialsService } = require('../aws-credentials')
const { logInfo, logError, logDebug } = require('../log')

/**
  * @class
*/
class DeploymentQueueService {

  static sendDeploymentRequest(platformConfig, deploymentRequest) {
    logInfo({ message: '[DeploymentQueueService] Starting deployment sequence' })
    return DeploymentQueueService.createAwsSqsClient(platformConfig)
      .then(sqsClient => {

        const sendMessageParams = {
          QueueUrl: platformConfig.awsDeploymentSqsArn,
          MessageBody: JSON.stringify(deploymentRequest)
        }

        logDebug({ message: '[DeploymentQueueService] SendMessageCommand params', data: sendMessageParams })
        const command = new SendMessageCommand(sendMessageParams)

        return sqsClient.send(command)
          .then(() => logInfo({ message: '[DeploymentQueueService] Deployment request sent' }))
          .catch(error => logError({ message: '[DeploymentQueueService] Could not send deployment request', error }))
      })

  }

  static pollForDeploymentRequests(platformConfig, handleDeploymentRequest) {
    logInfo({ message: '[DeploymentQueueService] Starting polling for deployment requests' })
    DeploymentQueueService.createAwsSqsClient(platformConfig).then(sqsClient => {
      const FIVE_MINUTES = 3000

      setInterval(() => {

        const receiveMessageCommand = new ReceiveMessageCommand({ QueueUrl: platformConfig.awsDeploymentSqsArn })

        sqsClient.send(receiveMessageCommand)
          .then(data => data.Messages.map(message => {

            logInfo({ message: '[DeploymentQueueService] Received deployment request' })

            handleDeploymentRequest(JSON.parse(message.Body))
              .then(() => {

                const deleteMessageCommand = new DeleteMessageCommand({
                  QueueUrl: platformConfig.awsDeploymentSqsArn,
                  ReceiptHandle: message.ReceiptHandle
                })

                sqsClient.send(deleteMessageCommand)
                  .then(() => logInfo({ message: '[DeploymentQueueService] Removing deployment request from queue' }))
                  .catch(error => logError({ message: '[DeploymentQueueService] Could not delete message from queue', error }))
              })

          }))
          .catch(error => logError({ message: '[ContainerManagerServer] Could not handle incoming deployment request', error }))
      }, FIVE_MINUTES)

    })
  }

  static createAwsSqsClient(platformConfig) {
    return AwsCredentialsService.resolveAwsCredentials(platformConfig)
      .then(awsCredentials => new SQSClient({
        region: platformConfig.awsRegion,
        credentials: awsCredentials
      }))
  }

}

module.exports = {
  DeploymentQueueService
}