eq8-core v2.0.1
eq8-core
EQuateJS Core API Library - A loose interface for CQRS/ES
Overview
The core building blocks are:
- commands in the form of events for updating the application state; and,
- queries are used for returning the current state of the application.
The core API provides an ability to register handlers for events and queries, but more importantly, it also allows adding new registrars:
- registrars are layers of abstractions that map to sets of events or queries.
Contents
Installation
npm install --save eq8-coreEvents
Basically, eq8-core extends the EventEmitter class and has the following events:
Event: 'dispatch'
Emitted when Core#dispatch gets called
Event: 'subscribe'
Emitted when Core#subscribe gets called
Event: 'register:registry'
Emitted when Core#register gets called for a specific registry
Constructor
var Core = require('eq8-core');
var api = new Core(options);Parameters
optionsis an optional objectloggeris awinston.Loggeroptions objectonis an object with the following properties:dispatchis an array ofdispatchevent listenerssubscribeis an array ofsubscribeevent listeners
Methods
Core#dispatch(e, done)
Emits a dispatch event and passes the parameters e and done to the event handler
Parameters
eis an arbitrary object to represent a command event
Core#subscribe(q, done)
Emits a subscribe event and passes the parameters q and done to the event handler
Parameters
qis an arbitrary object to represent a query eventdoneis an arbitrary callback function but conventionally takes an error-first argument:var done = function(err, ...){ ...}
Core#chainListener(e, listener, done)
Similar to EventEmitter.addListener except it removes the previously chained listener and adds it as a prior argument for the newly chained listener.
For example:
var Core = require('eq8-core');
var api = new Core();
var async = require('async');
function bottomOfStack(e, done) {
console.log('bottomOfStack', e);
done();
}
function topOfStack(e, done, prior) {
console.log('topOfStack:', e);
prior(e, done);
}
async.series([
function(done) {
api.chainListener('dispatch', bottomOfStack, done);
},
function(done) {
api.chainListener('dispatch', topOfStack, done);
}
], function seriesDone() {
api.dispatch('someEvent');
});Result:
topOfStack: someEvent
bottomOfStack: someEventParameters
eis the event name - see list of events abovelisteneris the handler for the eventdoneis the callback function that gets called after the listener chaining lifecycle
Core#addRegistrar(registrars, done)
Chains a listener for register:<registryKey> events that occur during a Core#register method call
For example:
var Core = require('eq8-core');
var api = new Core();
var registrars = {
'actions': function createAction(actions) {
console.log('create actions:', actions);
},
'views': function createView(views) {
console.log('create views:', views);
}
};
api.addRegistrar(registrars);
var registries = {
'actions': [
{e: 'e1'},
{e: 'e2'}
],
'views': [
{q: 'q1'},
{q: 'q2'}
]
};
api.register(registries);Result:
create actions: [ { e: 'e1' }, { e: 'e2' } ]
create views: [ { q: 'q1' }, { q: 'q2' } ]Parameters
registrarsis an object that takes the form:
{
'registryKey<n>': function handler(registryInitObj){},
...
}doneis an optional error-first callback function that gets called after the registrar adding lifecycle
Core#register(registries, done)
Triggers a register:<registryKey> event for each registryKey<n> in registries
NOTE: See usage example in Core#addRegister
Parameters
registriesis an object that takes the form:
{
registryKey1: registryInitObj1,
...
}doneis an optional error-first callback function that gets called after the registration lifecycle