@luxuryescapes/lib-events

SNS messages and SQS queues helper lib

Usage no npm install needed!

<script type="module">
  import luxuryescapesLibEvents from 'https://cdn.skypack.dev/@luxuryescapes/lib-events';
</script>

README

lib-events

SNS messages and SQS queues helper lib

Publisher

A small wrapper around SNS

const { createPublisher } = require('lib-events');

const publisher = createPublisher({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: 'ap-southeast-2',
  topic: 'arn:aws:sns:ap-southeast-2:1234:my-sns-topic',
  apiHost: 'https://our-api.com'
})

Dispatch

const { createPublisher, ORDER_CREATED } = require('lib-events');

const publisher = createPublisher({ ... })

publisher.dispatch({
  type: ORDER_CREATED,
  uri: `/api/orders/${order.id_orders}`,
  checksum: order.checksum,
  source: process.env.HEROKU_APP_NAME,
  message: `${user.fullname} just purchased ${order.offer.name}`
})

Publishing to a fifo queue

const publisher = createPublisher({ ..., topic: 'arn:aws:sns:ap-southeast-2:1234:my-fifo-topic.fifo' })

publisher.dispatch({
  type: ORDER_CREATED,
  uri: `/api/orders/${order.id_orders}`,
  checksum: order.checksum,
  source: process.env.HEROKU_APP_NAME,
  message: `${user.fullname} just purchased ${order.offer.name}`,
  transactionId: '123456', // this is used for deduplication, required for fifo queues
  groupId: '123'// this is used for partitioning, required for fifo queues
})

Consumers

A small wrapper around SQS

const { createConsumer } = require('lib-events');

const consumer = createConsumer({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: 'ap-southeast-2',
  queueUrl: 'https://sqs.ap-southeast-2.amazonaws.com/1234/my-sqs-name'
})

Poll

const { createConsumer, ORDER_CREATED } = require('lib-events');

const consumer = createConsumer({ ... })

async function processMessage({ type, source, id, checksum }, ack) {
  if (type === ORDER_CREATED) {
    console.log(`${source} created an order!`);
  }

  await ack()
}

exports.process = async function () {
  await consumer.poll(processMessage, {
    maxNumberOfMessages: 10,
    maxIterations: 10
  });
}

Running tests

yarn test

Publishing

Update the version in package.json as part of your PR and CircleCI will do the rest.