evented-command

Project goal is to provide a simple command/event handling for evented systems like cqrs.

node.js:

npm install evented-command

Build status:

Release:

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);
});