-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.html
158 lines (150 loc) · 18.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" charset="utf-8">
<title>Title Not Set</title>
<link rel="stylesheet" href="http://getbootstrap.com/2.3.2/assets/css/bootstrap.css">
<link rel="stylesheet" href="http://getbootstrap.com/2.3.2/assets/css/bootstrap-responsive.css">
<link rel="stylesheet" href="http://getbootstrap.com/2.3.2/assets/css/docs.css">
<style>
body > .navbar .brand {
float:left;
text-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 0px, rgba(255, 255, 255, 0.4) 0px 0px 30px;
color: white;
margin-left:0px;
font-weight:normal;
}
.bs-docs-sidenav.affix {
box-shadow: 0 0 20px 1px rgba(0, 0, 0, 0.5);
z-index: 10;
}
.bs-docs-sidenav i{
width: 8px;
height: 8px;
padding: 0px;
margin: 0px;
display: inline-block;
margin-right:0.5em;
}
.bs-docs-sidenav > li > a {
word-wrap: break-word;
}
.bs-docs-sidenav > li:first-child > a {
border-top-right-radius: 6px;
border-top-left-radius: 6px;
}
code[class*="language-"],pre[class*="language-"]{color:black;text-shadow:0 1px white;font-family:Consolas,Monaco,'Andale Mono',monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#f5f2f0}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:slategray}.token.punctuation{color:#999}.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number{color:#905}.token.selector,.token.attr-name,.token.string{color:#690}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#a67f59;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.regex,.token.important{color:#e90}.token.important{font-weight:bold}.token.entity{cursor:help}
div.description {margin: 14px 0; padding-top: 14px; border-bottom:1px solid #eee; }
.tags {}
.ctx-type {
display:inline-block;
margin-right:0.5em;
//- float:right; margin-top:8px
}
footer iframe{vertical-align:middle;}
</style>
</head>
<body data-spy="scroll" data-target=".scrollspy">
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container"><a class="brand">Doxx</a>
<div class="nav-collapse collapse">
<ul class="nav pull-right sponsored"></ul>
</div>
</div>
</div>
</div>
<header id="overview" class="jumbotron subhead">
<div class="container">
<h1>Title Not Set</h1>
<p class="lead"></p>
</div>
</header>
<div class="container">
<div class="row">
<div class="span3 bs-docs-sidebar">
<ul class="nav nav-list bs-docs-sidenav affix-top">
<li class="active"><a href="index.html">Main</a></li>
<li><a href="context.js.html">context.js</a></li>
<li><a href="dowhile.js.html">dowhile.js</a></li>
<li><a href="empty.js.html">empty.js</a></li>
<li><a href="ifelse.js.html">ifelse.js</a></li>
<li><a href="multywayswitch.js.html">multywayswitch.js</a></li>
<li><a href="parallel.js.html">parallel.js</a></li>
<li><a href="pipeline.js.html">pipeline.js</a></li>
<li><a href="retryonerror.js.html">retryonerror.js</a></li>
<li><a href="sequential.js.html">sequential.js</a></li>
<li><a href="stage.js.html">stage.js</a></li>
<li><a href="stage_domain.js.html">stage_domain.js</a></li>
<li><a href="timeout.js.html">timeout.js</a></li>
<li><a href="util.js.html">util.js</a></li>
<li><a href="wrap.js.html">wrap.js</a></li>
</ul>
<div class="scrollspy">
<ul class="nav nav-list bs-docs-sidenav affix-top">
</ul>
</div>
</div>
<div class="span9">
<section id="Main"><h1>pipeline.js</h1>
<p>pipeline.js is modular pipeline like developer tool for node.js</p><h1>Main concept</h1>
<p>Suppose we have <em>pipeline</em> with different types of <em>stages</em>.<br /><em>Stage</em> is the single working unit that can process some specific component's part. In the pipeline the component's part is passing by specific stages. Every stage can process specific component's part. One specific part can be splited into different parts and? according to its specific requirments, they can be processed as well. After that these different parts is combined back into one component's part with (maybe) different rules.</p><p>Using the different pipeline's stages one can combine new type of pipeline by assembling they together differently to get another result, or just replace old stages with new, and so on.</p><p>The same idea is under the development of pipeline.js.<br />There is basic stages that can be used to define more complex async-processing of specific data with pipline-like processing.</p><p><img src="./stages/hierarchy.png" alt="hierarchy"></p><h2>Note:</h2>
<p>The pipeline concept means to use the same context on the same level of staging.<br />i.e. while we split context in some stages we do not need to cmbine it if we not changing the context. by default it will return the same context but(!) with all childs that appears in current stage. this is for traceability.</p><h1>Stages: quick overview</h1>
<h2>Context</h2>
<p><em>Context</em> - is the thing that is need to be processed by the system.<br />We can <code>fork</code> context, take the parent context using <code>getParent</code>, and all errors during the processing of child context will be stored store in the parent's context error list. it can be traced to determine which stage it is already passed. and so on... see the code and tests.</p><h2>One way Context processing</h2>
<h3>Stage</h3>
<p><em>Stage</em> is the eventEmitter sublcass. We can either subscribe to events or use callback to catch-up end of processing.<br /><em>Stage</em> is by default asyncronous.<br /><img src="./stages/Stage/class.png" alt="hierarchy"><br /><img src="./stages/Stage/execute_activity.png" alt="hierarchy"><br /><img src="./stages/Stage/execute_async.png" alt="hierarchy"><br /><img src="./stages/Stage/execute_sync.png" alt="hierarchy"></p><h3>Pipeline</h3>
<p><em>Pipeline</em> is by subclass of Stage. the main purpose of it is to run sequence of different stages one after another.<br /><img src="./stages/Pipeline/class.png" alt="hierarchy"><br /><img src="./stages/Pipeline/execute.png" alt="hierarchy"><br /><img src="./stages/Pipeline/compile.png" alt="hierarchy"><br /><img src="./stages/Pipeline/addStage.png" alt="hierarchy"><br /><img src="./stages/Pipeline/run.png" alt="hierarchy"></p><h2>Processing with alternatives</h2>
<h3>IfElse</h3>
<p><em>IfElse</em> is the type of stage that use condition to choose which one of two <em>Stage</em> we need to run according to specific condition.<br /><img src="./stages/IfElse/class.png" alt="hierarchy"><br /><img src="./stages/IfElse/run_activity.png" alt="hierarchy"></p><h3>MultiWaySwitch</h3>
<p><em>MultiWaySwitch</em> is more complex <em>Stage</em> than <em>IfElse</em> is.<br />we can provide each stage in the list with condition, by examining which <em>MultiWaySwitch</em> make decision wheather the specific stage can be run or not.<br />notable feature is that on context can be processed from 0 to n times with the <em>MultiWaySwitch</em>.<br /><img src="./stages/MultiWaySwitch/class.png" alt="hierarchy"><br /><img src="./stages/MultiWaySwitch/run_activity.png" alt="hierarchy"></p><h3>Parallel</h3>
<p><em>Parallel</em> is the <em>Stage</em> that make possible process of stage that contain enumeration in it with parallel options. It runs one stage as parallel processing on series of data of the processing context.<br />it reachs end only after all data will be processed. It returns list of error.<br /><img src="./stages/Parallel/class.png" alt="hierarchy"><br /><img src="./stages/Parallel/run_activity.png" alt="hierarchy"></p><h3>Sequential</h3>
<p><em>Sequential</em> is the <em>Stage</em> that work almost like <em>Parallel</em>, but it run stage in sequential manner. So it first error occures we can manage it to stop processing or continue if we decide that the error not significant.<br /><img src="./stages/Sequential/class.png" alt="hierarchy"><br /><img src="./stages/Sequential/run_activity.png" alt="hierarchy"></p><h3>Wrap</h3>
<p><em>Wrap</em>per is a kind of stage that make possible to change context structure for specific type of stage. Using this we one can reuse existing stages more than once for different parts of common context<br /><img src="./stages/Sequential/class.png" alt="hierarchy"><br /><img src="./stages/Sequential/run_activity.png" alt="hierarchy"></p><h3>Timeout</h3>
<p><em>Timeout</em> can be configured to run stage and wait for specified timeout time and throw error or run different stage.<br /><img src="./stages/Timeout/class.png" alt="hierarchy"><br /><img src="./stages/Timeout/run_activity.png" alt="hierarchy"></p><h3>RetryOnError</h3>
<p><em>RetryOnError</em> can be configured to run specified stage for certain lap until it will success. <code>retry</code> can either <code>function</code> or <code>number</code>.<br /><img src="./stages/Timeout/class.png" alt="hierarchy"><br /><img src="./stages/Timeout/run_activity.png" alt="hierarchy"></p><h3>DoWhile</h3>
<p><em>DoWhile</em> loop while <em>Sequential</em> and <em>Parallel</em> works with the series of the data that has predefined length, this type of stage is not limited to the length. So it can be configured to run unlimited loop... </p><p><img src="./stages/DoWhile/class.png" alt="hierarchy"><br /><img src="./stages/DoWhile/run_activity.png" alt="hierarchy"></p><h3>Empty</h3>
<p>Just the Empty Stage. On execute return context to callback.<br /><img src="./stages/Empty/class.png" alt="hierarchy"></p><p>More info see <a href="/docs/index.html">documentation</a></p></section>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p>Documentation generated with <a href="https://github.com/FGRibreau/doxx">Doxx </a> created by <a href="https://twitter.com/FGRibreau" data-show-count="false" class="twitter-follow-button">Francois-Guillaume Ribreau </a></p>
<p>Doxx is sponsored by <a href="http://bringr.net/?btt" title="Outil d'analyse des réseaux sociaux" class="bringr">Bringr </a> and <a href="https://redsmin.com/?btt" title="Full Redis GUI" class="redsmin">Redsmin</a></p>
<p>Theme borrowed from Twitter Bootstrap</p>
</div>
</footer>
<script src="http://platform.twitter.com/widgets.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script src="http://leaverou.github.com/prefixfree/prefixfree.js"></script>
<script src="http://getbootstrap.com/2.3.2/assets/js/bootstrap-transition.js"></script>
<script src="http://getbootstrap.com/2.3.2/assets/js/bootstrap-scrollspy.js"></script>
<script src="http://getbootstrap.com/2.3.2/assets/js/bootstrap-dropdown.js"></script>
<script src="http://getbootstrap.com/2.3.2/assets/js/bootstrap-collapse.js"></script>
<script src="http://getbootstrap.com/2.3.2/assets/js/bootstrap-affix.js"></script>
<script>
/**
* Prism: Lightweight, robust, elegant syntax highlighting
* MIT license http://www.opensource.org/licenses/mit-license.php/
* @author Lea Verou http://lea.verou.me
*/(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e],o={};for(var u in s)if(s.hasOwnProperty(u)){if(u==n)for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);o[u]=s[u]}return i[e]=o},DFS:function(e,n){for(var r in e){n.call(e,r,e[r]);t.util.type(e)==="Object"&&t.languages.DFS(e[r],n)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+o);var f=r.textContent;if(!f)return;f=f.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\u00a0/g," ");var l={element:r,language:o,grammar:u,code:f};t.hooks.run("before-highlight",l);if(i&&self.Worker){var c=new Worker(t.filename);c.onmessage=function(e){l.highlightedCode=n.stringify(JSON.parse(e.data));l.element.innerHTML=l.highlightedCode;s&&s.call(l.element);t.hooks.run("after-highlight",l)};c.postMessage(JSON.stringify({language:l.language,code:l.code}))}else{l.highlightedCode=t.highlight(l.code,l.grammar);l.element.innerHTML=l.highlightedCode;s&&s.call(r);t.hooks.run("after-highlight",l)}},highlight:function(e,r){return n.stringify(t.tokenize(e,r))},tokenize:function(e,n){var r=t.Token,i=[e],s=n.rest;if(s){for(var o in s)n[o]=s[o];delete n.rest}e:for(var o in n){if(!n.hasOwnProperty(o)||!n[o])continue;var u=n[o],a=u.inside,f=!!u.lookbehind||0;u=u.pattern||u;for(var l=0;l<i.length;l++){var c=i[l];if(i.length>e.length)break e;if(c instanceof r)continue;u.lastIndex=0;var h=u.exec(c);if(h){f&&(f=h[1].length);var p=h.index-1+f,h=h[0].slice(f),d=h.length,v=p+d,m=c.slice(0,p+1),g=c.slice(v+1),y=[l,1];m&&y.push(m);var b=new r(o,a?t.tokenize(h,a):h);y.push(b);g&&y.push(g);Array.prototype.splice.apply(i,y)}}}return i},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]"){for(var r=0;r<e.length;r++)e[r]=n.stringify(e[r]);return e.join("")}var i={type:e.type,content:n.stringify(e.content),tag:"span",classes:["token",e.type],attributes:{}};i.type=="comment"&&(i.attributes.spellcheck="true");t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+"</"+i.tag+">"};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.tokenize(i,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();;
Prism.languages.markup={comment:/<!--[\w\W]*?--(>|>)/g,prolog:/<\?.+?\?>/,doctype:/<!DOCTYPE.+?>/,cdata:/<!\[CDATA\[[\w\W]+?]]>/i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/&#?[\da-z]{1,8};/gi};Prism.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))});;
Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:/@[\w-]+?(\s+[^;{]+)?(?=\s*{|\s*;)/gi,url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\}]*(?=\s*\{)/g,property:/(\b|\B)[a-z-]+(?=\s*:)/ig,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,ignore:/&(lt|gt|amp);/gi,punctuation:/[\{\};:]/g};Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<|<)style[\w\W]*?(>|>)[\w\W]*?(<|<)\/style(>|>)/ig,inside:{tag:{pattern:/(<|<)style[\w\W]*?(>|>)|(<|<)\/style(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css}}});;
Prism.languages.clike={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,lookbehind:!0},string:/("|')(\\?.)*?\1/g,keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,number:/\b-?(0x)?\d*\.?[\da-f]+\b/g,operator:/[-+]{1,2}|!|=?<|=?>|={1,2}|(&){1,2}|\|?\||\?|\*|\//g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};;
Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|catch|finally|null|break|continue)\b/g,number:/\b(-?(0x)?\d*\.?[\da-f]+|NaN|-?Infinity)\b/g});Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}});Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<|<)script[\w\W]*?(>|>)[\w\W]*?(<|<)\/script(>|>)/ig,inside:{tag:{pattern:/(<|<)script[\w\W]*?(>|>)|(<|<)\/script(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});;
</script>
<!-- App js-->
<script>
$(function(){
var $window = $(window);
$('.scrollspy .nav').affix({
offset: {
top: function () { return $window.width() <= 980 ? 480 : 400 }
, bottom: 50
}
});
})
</script>
</body>
</html>