1.0.0 • Published 8 years ago
hyperwork v1.0.0
Hyperwork
A rapid, ES6 based, background worker and mailer infrastructure for node.js based on bull.
Quick Start
Add and initialize hyperwork:
$ cd your-project
$ yarn add hyperworker
$ hyperworker init appYou can run workers as part of an existing service process,
or in a separate one with the runWorkers flag on init.
Below is a full default hyperwork config that does the following:
- Lays out
bullqueue configuration - Discovers and registers
mailersandworkersfor service use - Loads
nodemailer - Runs workers in a diffeent process if the
HYPERWORKenv var is set - Configures Arena, the
bullUI and exports it for use by a service
// src/
// app/
// mailers/
// workers/
// config/
// hyperwork.js
// nodemailer.js
require('babel-register')
const runWorkers = !!process.env.HYPERWORK
const { init } = require('../app/workers/support/hyperwork')
const mailTransport = require('./nodemailer')
const path = require('path')
const queueConfigs = {
mailers: {
name: 'mailers',
port: 6379,
host: '127.0.0.1',
hostId: 'localhost'
},
system: {
name: 'system',
port: 6379,
host: '127.0.0.1',
hostId: 'localhost'
}
}
init(
[
path.join(__dirname, '../app/mailers'),
path.join(__dirname, '../app/workers') /* CleanupWorker, DatabaseVaccum */
],
{
log: console.log,
mailTransport,
runWorkers,
queueConfigs
}
)
const Arena = require('bull-arena')
const hyperworkAdmin = Arena({ queues: queueConfigs })
module.exports = {
hyperworkAdmin
}Background Worker
const { Worker } = require('./support/hyperwork')
class CleanupWorker extends Worker {
async perform({ data }) {
await request('http://foobar.com'+data.id)
console.log('worker: cleaned up')
}
}
module.exports = CleanupWorkerMailer
Build a mailer like so:
const { Mailer } = require('../workers/support/hyperwork')
class RegistrationMailer extends Mailer {
static defaults = {
from: 'acme <acme@acme.org>'
}
static sendWelcome(user) {
// https://nodemailer.com/message/
this.mail({
to: user.email,
template: 'welcome',
locals: {
bill: '$13'
}
})
}
}
module.exports = RegistrationMailerAnd place templates (if you specify one, like above) like this:
mailers/
registration-mailer.js
welcome/
html.ejs
text.ejs
subject.ejsIn each, you can use locals as an immediately available variable:
(html.ejs)
<br/> you owe <%= bill %>Contributing
Fork, implement, add tests, pull request, get my everlasting thanks and a respectable place here :).
Thanks:
To all Contributors - you make this happen, thanks!
Copyright
Copyright (c) 2017 Dotan Nahum @jondot. See LICENSE for further details.
1.0.0
8 years ago