mu
Version:
A message-pattern based router for building distributed systems
99 lines (82 loc) • 2.88 kB
JavaScript
/*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
'use strict'
var assert = require('assert')
var uuid = require('uuid')
var pino = require('pino')
var muError = require('mu-error')
var createRouter = require('mu-router')
var DEFAULT_TTL = 10
function createMu (opts) {
opts = opts || {}
// see mu-error for error options
opts.errors = opts.errors || {}
var logger = opts.logger || pino()
var dev = opts.dev
var mue = muError(Object.assign({
dev: dev
}, opts.errors))
var router = createRouter({logger: logger, mue: mue})
if (opts.logLevel) {
logger.level = opts.logLevel
}
var instance = {
inbound: inbound,
outbound: outbound,
define: define,
dispatch: dispatch,
tearDown: router.tearDown,
print: router.print,
log: logger,
error: mue,
DEV_MODE: dev,
transports: router.transports
}
return instance
function define (pattern, tf) {
assert(pattern, 'define requires a valid pattern')
assert(tf, 'define requires a valid transport or pattern handler')
logger.debug('adding pattern route: ' + pattern)
if (typeof tf === 'function') {
router.addRoute(pattern, {muid: uuid(), tf: tf, type: 'handler'})
} else {
router.addRoute(pattern, tf)
}
}
function inbound (pattern, tf) {
define(pattern, tf(instance, {direction: 'inbound'}))
}
function outbound (pattern, tf) {
define(pattern, tf(instance, {direction: 'outbound'}))
}
function dispatch (message, cb) {
var id = uuid()
cb = cb || noop
assert(message, 'dispatch requires a valid message')
assert(typeof cb === 'function', 'dispatch requires a valid callback handler')
logger.debug('dispatching message: ' + message)
if (!(message.pattern || message.response)) {
router.addRoute(null, {muid: id, tf: cb, type: 'callback'})
router.route({pattern: message, protocol: {path: [id], trace: [id], ttl: DEFAULT_TTL}}, cb)
return
}
router.route(message, cb)
}
}
function noop () {}
createMu.log = Object.keys(pino.levels.values).reduce((acc, key) => {
acc['level' + key[0].toUpperCase() + key.slice(1)] = key
return acc
}, {})
module.exports = createMu