amqp-delegate

A remote worker system that uses AMQP to coordinate jobs.

Usage no npm install needed!

<script type="module">
  import amqpDelegate from 'https://cdn.skypack.dev/amqp-delegate';
</script>

README

amqp-delegate

A remote worker system that uses AMQP to coordinate jobs.

NPM

See Also

  • amqp-simple-pub-sub — A library that simplifies use of AMQP based publishers and subscribers.

Usage

npm install amqp-delegate

Worker

const { makeWorker } = require('amqp-delegate')

const worker = makeWorker({
  url: 'ampq://localhost:5672', // the default
  name: 'the name of the worker', // required
  task: async () => 'any pure async function', // required
  onError: err => { // optional
    console.error('A connection error happened', err) // or do something clever
  }
  onClose: () => { // optional
    console.log('The connection has closed.') // or do something clever
  }
})

// start it
worker.start().then(() => {
  console.log('worker', worker.name, 'started')
})

// stop it
worker.stop().then(() => {
  console.log('worker', worker.name, 'stopped')
})

Delegator

const { makeDelegator } = require('amqp-delegate')

const delegator = makeWorker({
  url: 'ampq://localhost:5672', // the default
  onError: err => { // optional
    console.error('A connection error happened', err) // or something clever
  }
  onClose: () => { // optional
    console.log('The connection has closed.') // or something clever
  }
})

delegator
  .start()
  .then(() => {
    delegator.invoke('worker name', ...params)
    console.log('job name', result)
  })
  .catch(err => {
    console.error('worker name', err)
  })

A concrete example

The worker

const { makeWorker } = require('amqp-delegate')

const task = (a, b) => new Promise(resolve => setTimeout(() => resolve(a + b), 10))

const worker = makeWorker({
  name: 'adder',
  task
})

worker
  .start()
  .then(() => {
    process.on('SIGINT', () => {
      worker.stop().then(() => {
        process.exit(0)
      })
    })
  })
  .catch(err => {
    console.error('caught', err)
  })

The delegator

const { makeDelegator } = require('amqp-delegate')

const delegator = makeDelegator()

delegator
  .start()
  .then(() => delegator.invoke('adder', 10, 15))
  .then(result => {
    console.log('result', result)
  })
  .catch(err => {
    console.error('caught', err)
  })

Development

Branches

branch status coverage Audit notes
develop CircleCI codecov Vulnerabilities Work in progress
master CircleCI codecov Vulnerabilities Latest stable release

Prerequisites

Initialisation

npm install

To Start the queue server for integration testing.

docker-compose up -d

Runs Rabbit MQ.

Test it

  • npm test — runs the unit tests (does not need rabbitmq)
  • npm run test:unit:cov — runs the unit tests with code coverage (does not need rabbitmq)
  • npm run test:integration — runs the integration tests (needs rabbitmq)

Lint it

npm run lint

Contributing

Please see the contributing notes.