-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsaga.html
8 lines (6 loc) · 67.9 KB
/
saga.html
1
2
3
4
5
6
7
8
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="keywords" content="i18n, internationalization, translation, javascript, nodejs, js"><title>cqrs - saga</title><link href="../public/css/index.css" rel="stylesheet"><script src="../public/js/jquery-1.7.2.min.js"></script><script src="../public/js/bootstrap-2.0.2.min.js"></script><!-- HTML5 shim, for IE6-8 support of HTML5 elements--><!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]--><!--[if lt IE 8]><link href="../public/css/font-awesome-ie7-2.0.css" rel="stylesheet" type="text/css"><![endif]--></head><body><header class="header"><div class="header-inner"><div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container"><!--.btn-navbar is used as the toggle for collapsed navbar content--><a data-toggle="collapse" data-target=".nav-collapse" class="btn btn-navbar"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><!-- Be sure to leave the brand out there if you want it shown--><a href="../" class="brand">cqrs</a><!-- Everything you want hidden at 940px or less, place within here--><div class="nav-collapse"><ul class="nav"><li><a href="../index.html">Home</a></li><li><a href="../pages/domain.html">domain</a></li><li><a href="../pages/viewmodel.html">viewmodel</a></li><li><a href="../pages/eventdenormalizer.html">eventdenormalizer</a></li><li><a href="http://adrai.github.io/node-eventstore/">eventstore</a></li><li><a href="http://jamuhl.github.com/backbone.CQRS/">backbone.CQRS</a></li><li><a href="https://github.com/KABA-CCEAC/angular.CQRS/">angular.CQRS</a></li><li><a href="../pages/eventedcommand.html">evented-command</a></li><li><a href="../pages/saga.html">saga</a></li></ul></div></div></div></div></div></header><div class="main"><div class="main-inner"><div class="container"><div class="content-container"> <div class="documentation"><div class="row-fluid"><div class="span8"><div class="hero-unit"><h2>cqrs-saga</h2><p>cqrs-saga is a node.js module that helps to implement the sagas in cqrs. It can be very useful as domain component if you work with (d)ddd, cqrs, eventdenormalizer, host, etc.</p></div></div><div class="span4 downloads"><p>node.js:</p><pre><code><span class="pln">npm install cqrs</span><span class="pun">-</span><span class="pln">saga</span></code></pre><p>Build status:<a href="http://travis-ci.org/adrai/node-cqrs-saga"><img src="https://secure.travis-ci.org/adrai/node-cqrs-saga.png"></a></p><p>Release:<a href="https://npmjs.org/package/cqrs-saga"><img src="https://img.shields.io/npm/v/cqrs-saga.svg"></a></p><div style="margin-top: 25px;" class="alert alert-info feature-description"><a href="https://github.com/adrai/node-cqrs-saga"><i class="icon-github"></i> fork me on github</a><br><a href="https://github.com/adrai/node-cqrs-saga/issues"><i class="icon-github"></i> issues</a><br><a href="https://github.com/adrai/node-cqrs-saga/blob/master/releasenotes.md"><i class="icon-github"></i> release notes</a></div></div></div><div class="row-fluid"><div class="span12"><h2>Usage</h2><div class="row-fluid"><div class="span4"><h4 class="feature-title">Configure</h4></div><div class="span8"><div class="feature"><pre><code><span class="kwd">var</span><span class="pln"> pm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">require</span><span class="pun">(</span><span class="str">'cqrs-saga'</span><span class="pun">)({</span><span class="pln"><br /> </span><span class="com">// the path to the "working directory"</span><span class="pln"><br /> </span><span class="com">// can be structured like</span><span class="pln"><br /> </span><span class="com">// [set 1](https://github.com/adrai/node-cqrs-saga/tree/master/test/integration/fixture)</span><span class="pln"><br /> sagaPath</span><span class="pun">:</span><span class="pln"> </span><span class="str">'/path/to/my/files'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default is 800</span><span class="pln"><br /> </span><span class="com">// if using in scaled systems and not guaranteeing that each event for a saga "instance"</span><span class="pln"><br /> </span><span class="com">// dispatches to the same worker process, this module tries to catch the concurrency issues and</span><span class="pln"><br /> </span><span class="com">// retries to handle the event after a timeout between 0 and the defined value</span><span class="pln"><br /> retryOnConcurrencyTimeout</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default is in-memory</span><span class="pln"><br /> </span><span class="com">// currently supports: mongodb, redis, azuretable and inmemory</span><span class="pln"><br /> </span><span class="com">// hint settings like: [eventstore](https://github.com/adrai/node-eventstore#provide-implementation-for-storage)</span><span class="pln"><br /> </span><span class="com">// mongodb:</span><span class="pln"><br /> sagaStore</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> type</span><span class="pun">:</span><span class="pln"> </span><span class="str">'mongodb'</span><span class="pun">,</span><span class="pln"><br /> host</span><span class="pun">:</span><span class="pln"> </span><span class="str">'localhost'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">27017</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> dbName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'domain'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> collectionName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sagas'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> timeout</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10000</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> </span><span class="com">// authSource: 'authedicationDatabase', // optional</span><span class="pln"><br /> </span><span class="com">// username: 'technicalDbUser', // optional</span><span class="pln"><br /> </span><span class="com">// password: 'secret' // optional</span><span class="pln"><br /> </span><span class="com">// url: 'mongodb://user:pass@host:port/db?opts // optional</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> </span><span class="com">// or redis:</span><span class="pln"><br /> sagaStore</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> type</span><span class="pun">:</span><span class="pln"> </span><span class="str">'redis'</span><span class="pun">,</span><span class="pln"><br /> host</span><span class="pun">:</span><span class="pln"> </span><span class="str">'localhost'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6379</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> db</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> prefix</span><span class="pun">:</span><span class="pln"> </span><span class="str">'domain_saga'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> timeout</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10000</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> </span><span class="com">// password: 'secret' // optional</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default is in-memory</span><span class="pln"><br /> </span><span class="com">// the revisionguard only works if aggregateId and revision are defined in event definition</span><span class="pln"><br /> </span><span class="com">// currently supports: mongodb, redis, tingodb, azuretable and inmemory</span><span class="pln"><br /> </span><span class="com">// hint settings like: [eventstore](https://github.com/adrai/node-eventstore#provide-implementation-for-storage)</span><span class="pln"><br /> revisionGuard</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> queueTimeout</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional, | timeout for non-handled events in the internal in-memory queue</span><span class="pln"><br /> queueTimeoutMaxLoops</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional, | maximal loop count for non-handled event in the internal in-| memory queue</span><span class="pln"><br /> startRevisionNumber</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional, if defined the denormaizer waits for an event with that revision to be used as first</span><span class="pln"><br /> <br /> type</span><span class="pun">:</span><span class="pln"> </span><span class="str">'redis'</span><span class="pun">,</span><span class="pln"><br /> host</span><span class="pun">:</span><span class="pln"> </span><span class="str">'localhost'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6379</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> db</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> prefix</span><span class="pun">:</span><span class="pln"> </span><span class="str">'readmodel_revision'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> timeout</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10000</span><span class="pln"> </span><span class="com">// optional</span><span class="pln"><br /> </span><span class="com">// password: 'secret' // optional</span><span class="pln"><br /> </span><span class="pun">}</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Catch connect ad disconnect events</h4></div><div class="span8"><div class="feature"><pre><code><span class="com">// sagaStore</span><span class="pln"><br />pm</span><span class="pun">.</span><span class="pln">sagaStore</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'connect'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'sagaStore connected'</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /> <br />pm</span><span class="pun">.</span><span class="pln">sagaStore</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'disconnect'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'sagaStore disconnected'</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /> <br /></span><span class="com">// revisionGuardStore</span><span class="pln"><br />pm</span><span class="pun">.</span><span class="pln">revisionGuardStore</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'connect'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'revisionGuardStore connected'</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /> <br />pm</span><span class="pun">.</span><span class="pln">revisionGuardStore</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'disconnect'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'revisionGuardStore disconnected'</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /> <br /> <br /></span><span class="com">// anything (sagaStore or revisionGuardStore)</span><span class="pln"><br />pm</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'connect'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'something connected'</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /> <br />pm</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'disconnect'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'something disconnected'</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span></code></pre><div class="alert alert-info feature-description"><h6>Important hint:</h6><p>For example in a cloud environment the disconnect event could be used to kill the process.</p></div></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Define the event structure</h4><p>The values describes the path to that property in the event message.</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">defineEvent</span><span class="pun">({</span><span class="pln"><br /> </span><span class="com">// optional, default is 'name'</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'name'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, only makes sense if contexts are defined in the 'domainPath' structure</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="str">'context.name'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, only makes sense if aggregates with names are defined in the 'domainPath' structure</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="str">'aggregate.name'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default is 'aggregate.id'</span><span class="pln"><br /> aggregateId</span><span class="pun">:</span><span class="pln"> </span><span class="str">'aggregate.id'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default is 'revision'</span><span class="pln"><br /> </span><span class="com">// will represent the aggregate revision, can be used in next command</span><span class="pln"><br /> revision</span><span class="pun">:</span><span class="pln"> </span><span class="str">'revision'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional</span><span class="pln"><br /> version</span><span class="pun">:</span><span class="pln"> </span><span class="str">'version'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, if defined theses values will be copied to the command (can be used to transport information like userId, etc..)</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> </span><span class="str">'meta'</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Define the command structure</h4><p>The values describes the path to that property in the command message.</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">defineCommand</span><span class="pun">({</span><span class="pln"><br /> </span><span class="com">// optional, default is 'id'</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'id'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, if defined the values of the event will be copied to the command (can be used to transport information like userId, etc..)</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> </span><span class="str">'meta'</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Define the id generator function [optional]</h4><p>you can define a synchronous function</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">idGenerator</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">var</span><span class="pln"> id </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">require</span><span class="pun">(</span><span class="str">'node-uuid'</span><span class="pun">).</span><span class="pln">v4</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln"><br /> </span><span class="kwd">return</span><span class="pln"> id</span><span class="pun">;</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><p>or you can define an asynchronous function</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">idGenerator</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">callback</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> setTimeout</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">var</span><span class="pln"> id </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">require</span><span class="pun">(</span><span class="str">'node-uuid'</span><span class="pun">).</span><span class="pln">v4</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln"><br /> callback</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">,</span><span class="pln"> id</span><span class="pun">);</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"> </span><span class="lit">50</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Wire up commands [optional]</h4><p>you can define a synchronous function</p></div><div class="span8"><div class="feature"><pre><code><span class="com">// pass commands to bus</span><span class="pln"><br />pm</span><span class="pun">.</span><span class="pln">onCommand</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> bus</span><span class="pun">.</span><span class="pln">emit</span><span class="pun">(</span><span class="str">'command'</span><span class="pun">,</span><span class="pln"> cmd</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><p>or you can define an asynchronous function</p></div><div class="span8"><div class="feature"><pre><code><span class="com">// pass commands to bus</span><span class="pln"><br />pm</span><span class="pun">.</span><span class="pln">onCommand</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">,</span><span class="pln"> callback</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> bus</span><span class="pun">.</span><span class="pln">emit</span><span class="pun">(</span><span class="str">'command'</span><span class="pun">,</span><span class="pln"> cmd</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> ack </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> callback</span><span class="pun">();</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Wire up missing events [optional]</h4></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">onEventMissing</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">info</span><span class="pun">,</span><span class="pln"> evt</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> <br /> </span><span class="com">// grab the missing events, depending from info values...</span><span class="pln"><br /> </span><span class="com">// info.aggregateId</span><span class="pln"><br /> </span><span class="com">// info.aggregateRevision</span><span class="pln"><br /> </span><span class="com">// info.aggregate</span><span class="pln"><br /> </span><span class="com">// info.context</span><span class="pln"><br /> </span><span class="com">// info.guardRevision</span><span class="pln"><br /> </span><span class="com">// and call handle...</span><span class="pln"><br /> pm</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">(</span><span class="pln">missingEvent</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">err</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /> <br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><p>you can get the last guarded event:</p></div><div class="span8"><div class="feature"><pre><code>pm.getLastEvent(function (err, evt) {
if (event.occurredAt < Date.now()) {
// ...
}
});</code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Initialization</h4></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">init</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> warnings</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// this callback is called when all is ready...</span><span class="pln"><br /> </span><span class="com">// warnings: if no warnings warnings is null, else it's an array containing errors during require of files</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /> <br /></span><span class="com">// or</span><span class="pln"><br /> <br />pm</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln"> </span><span class="com">// callback is optional</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">Handling an event</h4></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">({</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'b80ade36-dd05-4340-8a8b-846eea6e286f'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'orderCreated'</span><span class="pun">,</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'3b4d44b0-34fb-4ceb-b212-68fe7a7c2f70'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'order'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sale'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> payload</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> totalCosts</span><span class="pun">:</span><span class="pln"> </span><span class="lit">520</span><span class="pun">,</span><span class="pln"><br /> seats</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'4f'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'8a'</span><span class="pun">]</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> revision</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"><br /> version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> userId</span><span class="pun">:</span><span class="pln"> </span><span class="str">'ccd65819-4da4-4df9-9f24-5b10bf89ef89'</span><span class="pln"><br /> </span><span class="pun">}</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"> </span><span class="com">// callback is optional</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><p>or</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">({</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'b80ade36-dd05-4340-8a8b-846eea6e286f'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'orderCreated'</span><span class="pun">,</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'3b4d44b0-34fb-4ceb-b212-68fe7a7c2f70'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'order'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sale'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> payload</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> totalCosts</span><span class="pun">:</span><span class="pln"> </span><span class="lit">520</span><span class="pun">,</span><span class="pln"><br /> seats</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'4f'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'8a'</span><span class="pun">]</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> revision</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"><br /> version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> userId</span><span class="pun">:</span><span class="pln"> </span><span class="str">'ccd65819-4da4-4df9-9f24-5b10bf89ef89'</span><span class="pln"><br /> </span><span class="pun">}</span><span class="pln"><br /></span><span class="pun">},</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">errs</span><span class="pun">,</span><span class="pln"> cmds</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// this callback is called when event is handled successfully or unsuccessfully</span><span class="pln"><br /> </span><span class="com">// errs can be of type:</span><span class="pln"><br /> </span><span class="com">// - null</span><span class="pln"><br /> </span><span class="com">// - Array of Errors</span><span class="pln"><br /> </span><span class="com">//</span><span class="pln"><br /> </span><span class="com">// cmds: same as passed in 'onCommand' function</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><p>more infos, can be useful if testing</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">({</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'b80ade36-dd05-4340-8a8b-846eea6e286f'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'orderCreated'</span><span class="pun">,</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'3b4d44b0-34fb-4ceb-b212-68fe7a7c2f70'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'order'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sale'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> payload</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> totalCosts</span><span class="pun">:</span><span class="pln"> </span><span class="lit">520</span><span class="pun">,</span><span class="pln"><br /> seats</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'4f'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'8a'</span><span class="pun">]</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> userId</span><span class="pun">:</span><span class="pln"> </span><span class="str">'ccd65819-4da4-4df9-9f24-5b10bf89ef89'</span><span class="pln"><br /> </span><span class="pun">}</span><span class="pln"><br /></span><span class="pun">},</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">errs</span><span class="pun">,</span><span class="pln"> cmds</span><span class="pun">,</span><span class="pln"> sagaModels</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// this callback is called when event is handled successfully or unsuccessfully</span><span class="pln"><br /> </span><span class="com">// errs: is the same as described before</span><span class="pln"><br /></span><span class="pun">|</span><span class="pln"><br /> </span><span class="com">// cmds: same as passed in 'onCommand' function</span><span class="pln"><br /> </span><span class="com">// cmds: in case of no error or in case of error here is the array of all commands that should be published</span><span class="pln"><br /></span><span class="pun">|</span><span class="pln"><br /> </span><span class="com">// sagaModels: represents the saga data after have handled the event</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div></div></div><div class="row-fluid"><div class="span12"><h2>Request saga information</h2><div class="row-fluid"><div class="span4"><h4 class="feature-title">After the initialization you can request the saga information:</h4></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">init</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> pm</span><span class="pun">.</span><span class="pln">getInfo</span><span class="pun">();</span><span class="pln"><br /> </span><span class="com">// ==></span><span class="pln"><br /> </span><span class="com">// {</span><span class="pln"><br /> </span><span class="com">// "sagas": [</span><span class="pln"><br /> </span><span class="com">// {</span><span class="pln"><br /> </span><span class="com">// "name": "orderConfirmed",</span><span class="pln"><br /> </span><span class="com">// "aggregate": "order",</span><span class="pln"><br /> </span><span class="com">// "context": "sale",</span><span class="pln"><br /> </span><span class="com">// "version": 0</span><span class="pln"><br /> </span><span class="com">// },</span><span class="pln"><br /> </span><span class="com">// {</span><span class="pln"><br /> </span><span class="com">// "name": "orderCreated",</span><span class="pln"><br /> </span><span class="com">// "aggregate": "order",</span><span class="pln"><br /> </span><span class="com">// "context": "sale",</span><span class="pln"><br /> </span><span class="com">// "version": 0</span><span class="pln"><br /> </span><span class="com">// },</span><span class="pln"><br /> </span><span class="com">// {</span><span class="pln"><br /> </span><span class="com">// "name": "paymentAccepted",</span><span class="pln"><br /> </span><span class="com">// "aggregate": "payment",</span><span class="pln"><br /> </span><span class="com">// "context": "sale",</span><span class="pln"><br /> </span><span class="com">// "version": 2</span><span class="pln"><br /> </span><span class="com">// },</span><span class="pln"><br /> </span><span class="com">// {</span><span class="pln"><br /> </span><span class="com">// "name": "seatsReserved",</span><span class="pln"><br /> </span><span class="com">// "aggregate": "reservation",</span><span class="pln"><br /> </span><span class="com">// "context": "sale",</span><span class="pln"><br /> </span><span class="com">// "version": 0</span><span class="pln"><br /> </span><span class="com">// }</span><span class="pln"><br /> </span><span class="com">// ]</span><span class="pln"><br /> </span><span class="com">// }</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div></div></div><div class="row-fluid"><div class="span12"><h2>Components definition</h2><div class="row-fluid"><div class="span4"><h4 class="feature-title">Saga</h4></div><div class="span8"><div class="feature"><pre><code><span class="kwd">module</span><span class="pun">.</span><span class="pln">exports </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">require</span><span class="pun">(</span><span class="str">'cqrs-saga'</span><span class="pun">).</span><span class="pln">defineSaga</span><span class="pun">({</span><span class="pln"><br /> </span><span class="com">// optional, default is file name without extension</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'orderCreated'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="str">'order'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sale'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default 0</span><span class="pln"><br /> version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default false</span><span class="pln"><br /> </span><span class="com">// if true it will check if there is already a saga in the db and only if there is something it will continue...</span><span class="pln"><br /> existing</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, will catch the event only if it contains the defined properties</span><span class="pln"><br /> containingProperties</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'aggregate.id'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'payload.totalCosts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'payload.seats'</span><span class="pun">],</span><span class="pln"><br /> <br /> </span><span class="com">// optional, if not defined it will pass the whole event...</span><span class="pln"><br /> payload</span><span class="pun">:</span><span class="pln"> </span><span class="str">'payload'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, if not defined it will generate a new id</span><span class="pln"><br /> </span><span class="com">// it will try to load the saga from the db by this id</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'aggregate.id'</span><span class="pun">,</span><span class="pln"><br /> <br /> </span><span class="com">// optional, default Infinity, all sagas will be sorted by this value</span><span class="pln"><br /> priority</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"><br /></span><span class="pun">},</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">evt</span><span class="pun">,</span><span class="pln"> saga</span><span class="pun">,</span><span class="pln"> callback</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> <br /> saga</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="str">'orderId'</span><span class="pun">,</span><span class="pln"> evt</span><span class="pun">.</span><span class="pln">aggregate</span><span class="pun">.</span><span class="pln">id</span><span class="pun">);</span><span class="pln"><br /> saga</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="str">'totalCosts'</span><span class="pun">,</span><span class="pln"> evt</span><span class="pun">.</span><span class="pln">payload</span><span class="pun">.</span><span class="pln">totalCosts</span><span class="pun">);</span><span class="pln"><br /> </span><span class="com">// or</span><span class="pln"><br /> </span><span class="com">// saga.set({ orderId: evt.aggregate.id, totalCosts: evt.payload.totalCosts });</span><span class="pln"><br /> <br /> </span><span class="kwd">var</span><span class="pln"> cmd </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> <br /> </span><span class="com">// if you don't pass an id it will generate a new one</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'my own command id'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'makeReservation'</span><span class="pun">,</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'reservation'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sale'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> payload</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> transactionId</span><span class="pun">:</span><span class="pln"> saga</span><span class="pun">.</span><span class="pln">id</span><span class="pun">,</span><span class="pln"><br /> seats</span><span class="pun">:</span><span class="pln"> saga</span><span class="pun">.</span><span class="pln">has</span><span class="pun">(</span><span class="str">'seats'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> saga</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'seats'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> evt</span><span class="pun">.</span><span class="pln">payload</span><span class="pun">.</span><span class="pln">seats<br /> </span><span class="pun">},</span><span class="pln"><br /> <br /> </span><span class="com">// to transport meta infos (like userId)...</span><span class="pln"><br /> </span><span class="com">// if not defined, it will use the meta value of the event</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> evt</span><span class="pun">.</span><span class="pln">meta<br /> </span><span class="pun">};</span><span class="pln"><br /></span><span class="pun">|</span><span class="pln"><br /> saga</span><span class="pun">.</span><span class="pln">addCommandToSend</span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">|</span><span class="pln"><br /> </span><span class="com">// optionally define a timeout</span><span class="pln"><br /> </span><span class="com">// this can be useful if you have an other process that will fetch timeouted sagas</span><span class="pln"><br /> </span><span class="kwd">var</span><span class="pln"> tomorrow </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">();</span><span class="pln"><br /> tomorrow</span><span class="pun">.</span><span class="pln">setDate</span><span class="pun">((</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">()).</span><span class="pln">getDate</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"><br /> </span><span class="kwd">var</span><span class="pln"> timeoutCmd </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> <br /> </span><span class="com">// if you don't pass an id it will generate a new one</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> </span><span class="str">'my own command id'</span><span class="pun">,</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'cancelOrder'</span><span class="pun">,</span><span class="pln"><br /> aggregate</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'order'</span><span class="pun">,</span><span class="pln"><br /> id</span><span class="pun">:</span><span class="pln"> evt</span><span class="pun">.</span><span class="pln">aggregate</span><span class="pun">.</span><span class="pln">id<br /> </span><span class="pun">},</span><span class="pln"><br /> context</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'sale'</span><span class="pln"><br /> </span><span class="pun">},</span><span class="pln"><br /> payload</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> transactionId</span><span class="pun">:</span><span class="pln"> saga</span><span class="pun">.</span><span class="pln">id<br /> </span><span class="pun">},</span><span class="pln"><br /> <br /> </span><span class="com">// to transport meta infos (like userId)...</span><span class="pln"><br /> </span><span class="com">// if not defined, it will use the meta value of the event</span><span class="pln"><br /> meta</span><span class="pun">:</span><span class="pln"> evt</span><span class="pun">.</span><span class="pln">meta<br /> </span><span class="pun">};</span><span class="pln"><br /> saga</span><span class="pun">.</span><span class="pln">defineTimeout</span><span class="pun">(</span><span class="pln">tomorrow</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">timeoutCmd</span><span class="pun">]);</span><span class="pln"><br /> </span><span class="com">// or</span><span class="pln"><br /> </span><span class="com">// saga.defineTimeout(tomorrow, timeoutCmd);</span><span class="pln"><br /> </span><span class="com">// or</span><span class="pln"><br /> </span><span class="com">// saga.defineTimeout(tomorrow);</span><span class="pln"><br /> <br /> saga</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">(</span><span class="pln">callback</span><span class="pun">);</span><span class="pln"><br /></span><span class="pun">});</span><span class="pln"><br /></span><span class="com">// optional define a function to that returns an id that will be used as saga id</span><span class="pln"><br /></span><span class="com">//.useAsId(function (evt) {</span><span class="pln"><br /></span><span class="com">// return 'newId';</span><span class="pln"><br /></span><span class="com">//});</span><span class="pln"><br /></span><span class="com">// or</span><span class="pln"><br /></span><span class="com">//.useAsId(function (evt, callback) {</span><span class="pln"><br /></span><span class="com">// callback(null, 'newId');</span><span class="pln"><br /></span><span class="com">//});</span><span class="pln"><br /></span><span class="com">// </span><span class="pln"><br /></span><span class="com">// optional define a function that checks if an event should be handled</span><span class="pln"><br /></span><span class="com">//.defineShouldHandle(function (evt, saga) {</span><span class="pln"><br /></span><span class="com">// return true;</span><span class="pln"><br /></span><span class="com">//});</span><span class="pln"><br /></span><span class="com">// or</span><span class="pln"><br /></span><span class="com">//.defineShouldHandle(function (evt, saga, callback) {</span><span class="pln"><br /></span><span class="com">// callback(null, true');</span><span class="pln"><br /></span><span class="com">//});</span></code></pre></div></div></div></div></div><div class="row-fluid"><div class="span12"><h2>Persistence functions</h2><div class="row-fluid"><div class="span4"><h4 class="feature-title">getTimoutedSagas</h4><p>Use this function to get all timeouted sagas.</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">getTimeoutedSagas</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> sagas</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'ohh!'</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br /> <br /> sagas</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">saga</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// saga.id...</span><span class="pln"><br /> </span><span class="com">// saga.getTimeoutAt();</span><span class="pln"><br /> </span><span class="kwd">var</span><span class="pln"> cmds </span><span class="pun">=</span><span class="pln"> saga</span><span class="pun">.</span><span class="pln">getTimeoutCommands</span><span class="pun">();</span><span class="pln"><br /> <br /> cmds</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> saga</span><span class="pun">.</span><span class="pln">addCommandToSend</span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">);</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /> <br /> saga</span><span class="pun">.</span><span class="pln">commit</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// if you have registered the pm.onCommand handler it will be automatically executed,</span><span class="pln"><br /> </span><span class="com">// if you have not registered the pm.onCommand handler you need to publish and set the command to dispatched on your own!</span><span class="pln"><br /> cmds</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// publish cmd...</span><span class="pln"><br /> </span><span class="com">// msgBus.send(cmd);</span><span class="pln"><br /> </span><span class="com">// ... and set to dispatched...</span><span class="pln"><br /> pm</span><span class="pun">.</span><span class="pln">setCommandToDispatched</span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">.</span><span class="pln">id</span><span class="pun">,</span><span class="pln"> saga</span><span class="pun">.</span><span class="pln">id</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{});</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /> <br /> </span><span class="com">// or if saga does not clean itself after timouted and/or no commands are defined, then:</span><span class="pln"><br /> </span><span class="com">// pm.removeSaga(saga || saga.id, function (err) {});</span><span class="pln"><br /> </span><span class="com">// or</span><span class="pln"><br /> </span><span class="com">// saga.destroy();</span><span class="pln"><br /> </span><span class="com">// saga.commit(function (err) {});</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">getOlderSagas</h4><p>Use this function to get all sagas that are older then the passed date.</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">getOlderSagas</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">(</span><span class="lit">2010</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> sagas</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'ohh!'</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br /> <br /> sagas</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">saga</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// saga.id...</span><span class="pln"><br /> </span><span class="com">// saga.getTimeoutAt();</span><span class="pln"><br /> </span><span class="com">// saga.getTimeoutCommands();</span><span class="pln"><br /> <br /> </span><span class="com">// if saga does not clean itself after timouted and/or no commands are defined, then:</span><span class="pln"><br /> pm</span><span class="pun">.</span><span class="pln">removeSaga</span><span class="pun">(</span><span class="pln">saga </span><span class="pun">||</span><span class="pln"> saga</span><span class="pun">.</span><span class="pln">id</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{});</span><span class="pln"><br /> </span><span class="com">// or</span><span class="pln"><br /> </span><span class="com">// saga.destroy();</span><span class="pln"><br /> </span><span class="com">// saga.commit(function (err) {});</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div><div class="row-fluid"><div class="span4"><h4 class="feature-title">getUndispatchedCommands | setCommandToDispatched</h4><p>Use getUndispatchedCommands to get all undispatched commands.</p><p>Use setCommandToDispatched to mark a command as dispatched. (will remove it from the db)</p></div><div class="span8"><div class="feature"><pre><code><span class="pln">pm</span><span class="pun">.</span><span class="pln">getUndispatchedCommands</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> cmds</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'ohh!'</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br /> <br /> cmds</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br /> </span><span class="com">// cmd is: { sagaId: 'the id of the saga', commandId: 'the id of the command', commitStamp: 'a date', command: { /* the command */ } }</span><span class="pln"><br /> <br /> pm</span><span class="pun">.</span><span class="pln">setCommandToDispatched</span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">.</span><span class="pln">commandId</span><span class="pun">,</span><span class="pln"> cmd</span><span class="pun">.</span><span class="pln">sagaId</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{});</span><span class="pln"><br /> </span><span class="pun">});</span><span class="pln"><br /></span><span class="pun">});</span></code></pre></div></div></div></div></div></div></div></div></div></div><div class="extra"><div class="extra-inner"><div class="container"><div class="row"><div class="span4"><h4>about me</h4><ul><li><a href="https://github.com/adrai"><i class="icon-github"></i> github</a></li><li><a href="https://twitter.com/adrirai"><i class="icon-twitter"></i> twitter</a></li></ul></div><div class="span4"><h4>help</h4><ul><li><a href="https://github.com/adrai/cqrs/issues">
issues (<i class="icon-github"></i>)</a></li></ul></div><div class="span4"><h4>legal</h4><ul><li><a href="https://github.com/adrai/node-cqrs-domain/blob/master/licence">license</a></li></ul></div></div></div></div></div><footer class="footer"><div class="footer-inner"><div class="container"><div class="row"><div class="span12">the cqrs modules and libraries are freely distributable under the terms of the MIT license.</div></div></div></div></footer></body></html>