evented-command
Project goal is to provide a simple command/event handling for evented systems like cqrs.
Usage
Get a new instance...
var evtCmd = require('evented-command')();
CDefine the command structure [optional]
The values describes the path to that property in the command message.
evtCmd.defineCommand({
id: 'id', // optional
name: 'name', // optional
context: 'context.name', // optional
aggregate: 'aggregate.name', // optional
aggregateId: 'aggregate.id' // optional
});
Define the event structure [optional]
The values describes the path to that property in the event message.
evtCmd.defineEvent({
correlationId: 'correlationId', // optional
id: 'id', // optional
name: 'name', // optional
context: 'context.name', // optional
aggregate: 'aggregate.name', // optional
aggregateId: 'aggregate.id' // optional
});
Wire up commands and events
// pass in events from your bus
bus.on('event', function(data){
evtCmd.emit('event', data);
});
// pass commands to bus
evtCmd.on('command', function(data) {
bus.emit('command', data);
});
Send commands
var cmd = new Command({
// id: 'my onwn command id', // if you don't pass an id it will generate one, when emitting the command...
name: 'changePerson',
payload: {
name: 'my name'
},
aggregate: {
id: 8,
name: 'jack'
},
context: {
name: 'hr'
}
});
// emit it
cmd.emit();
// if you want to observe the command pass a callback
cmd.emit(function(evt) {
});
// if you want to observe the command that generates any events pass an object like this:
cmd.emit({
event1: function(evt) {
},
event2: function(evt) {
}
});
Send commands with the speakable api
evtCmd.send('changePerson')
.for('person') // aggregate name
.instance('8') // aggregate id
.in('hr') // context name
.with({
// id: 'my onwn command id', // if you don't pass an id it will generate one, when emitting the command...
revision: '12',
payload: {
name: 'jack'
}
})
.go(function(evt) {
console.log('speakable', evt);
});
evtCmd.send('multi')
.for('aggregate')
.instance('instanceId')
.in('context')
.with({
revision: '43',
payload: 'data2'
})
.go({
event1: function(evt) {
console.log('speakable', evt);
},
event2: function(evt) {
console.log('speakable', evt);
}
});
Define the id generator function [optional]
you can define a synchronous function
evtCmd.idGenerator(function() {
var id = require('node-uuid').v4().toString();
return id;
});
or you can define an asynchronous function
evtCmd.idGenerator(function(callback) {
setTimeout(function() {
var id = require('node-uuid').v4().toString();
callback(null, id);
}, 50);
});