Object-pattern-matching-based routing
- Patterns are plain objects
- Messages are plain objects
- Messages are matched structurally against patterns
- Most specific patterns match route
- Router is a runtime-agnostic Writable stream
npm install pattern-routerconst Router = require('pattern-router')import Router from 'pattern-router'const router = new Router()
router.register({ type: 'ping' }, (message) => {
console.log('ping', message)
})
router.register({ type: 'ping', extra: { deep: 'stuff' } }, (message) => {
console.log('specific ping', message)
})
router.write({ type: 'ping', extra: { deep: 'stuff' }, id: 1 })
//specific ping { type: 'ping', extra: { deep: 'stuff' }, id: 1 }
router.write({ type: 'ping', id: 2 })
//ping { type: 'ping', id: 2 }
router.write({ type: 'pong' })
// nothingCreates a streamx.Writable in objectMode.
options are passed to Writable
options.multi - set to true to match and call multiple pattern handlers
Registers a pattern and its handler function.
patternmust be an objecthandler(message, pattern)is called for each match- more specific patterns run first
- registration order breaks ties
Returns router instance.
Throws TypeError if handler is not a function.
Returns the first matching pattern for message,
using the same ordering rules as write().
Does not call handlers.
Writes a message to the router.
- invokes all matching handlers
- handlers run synchronously
- errors thrown by handlers error the stream
Return value follows streamx.Writable#write.
Pattern matching is performed by ptnm.
- pattern keys must exist in the message
- values are compared using
=== - matching is recursive for objects
- extra message keys are ignored
Patterns are ordered by structural depth.
- each own enumerable key adds weight
- nested objects add weight recursively
- ties are broken by registration order
Ordering is computed lazily:
- on first
lookup()orwrite() - after each
register()
Apache-2.0