Skip to content

A simple, but performant, remote worker system that uses AMQP to coordinate jobs.

License

Notifications You must be signed in to change notification settings

davesag/amqp-delegate

Repository files navigation

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
main CircleCI codecov Vulnerabilities Latest stable release

Prerequisites

  • NodeJS, 10.0+ (I use nvm to manage Node versions — brew install nvm.)
  • Docker (Use Docker for Mac, not the homebrew version)

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.

About

A simple, but performant, remote worker system that uses AMQP to coordinate jobs.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •