|
@@ -2,6 +2,7 @@
|
|
|
* Substitute for xeventx
|
|
|
* */
|
|
|
|
|
|
+const Channel = require('./context/channel');
|
|
|
const EventualContext = require('./context');
|
|
|
const EventParam = require('./event-param');
|
|
|
|
|
@@ -43,32 +44,29 @@ class Eventual {
|
|
|
this.set(name,undefined);
|
|
|
}
|
|
|
|
|
|
+ // Private?
|
|
|
emit(name,...args) {
|
|
|
// Special send to all eventual contexts
|
|
|
var tocall = this.callbacks(name);
|
|
|
-
|
|
|
return this.process(tocall,args)
|
|
|
}
|
|
|
propagate(name,nameto,...args) {
|
|
|
- var nparts = name.split("/");
|
|
|
+ var nparts = name.split(Channel.SEP);
|
|
|
var tocall = [];
|
|
|
|
|
|
var sname = name;
|
|
|
while(nparts.length && sname != nameto) {
|
|
|
var localCall = this.callbacks(sname);
|
|
|
- console.log("Found: " + localCall.length + " in : " + sname);
|
|
|
// Limitation on argument size
|
|
|
tocall.push(...localCall);
|
|
|
nparts.pop();
|
|
|
- sname = nparts.join("/");
|
|
|
+ sname = nparts.join(Channel.SEP);
|
|
|
}
|
|
|
var localCall = this.callbacks(sname);
|
|
|
- console.log("Found: " + tocall.length + " in : " + sname);
|
|
|
tocall.push(...localCall);
|
|
|
return this.process(tocall,args);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
callbacks(name) {
|
|
|
var tocall = [];
|
|
|
this._events.ctx.forEach((c) => {
|
|
@@ -83,11 +81,47 @@ class Eventual {
|
|
|
l.callback(...nargs);
|
|
|
});
|
|
|
}
|
|
|
- // process should be handled here
|
|
|
process(tocall,nargs) {
|
|
|
+ var args = nargs || [];
|
|
|
+
|
|
|
+ tocall = tocall.sort((a,b) => {
|
|
|
+ return (a.order - b.order);
|
|
|
+ });
|
|
|
+ var iter = tocall[Symbol.iterator]();
|
|
|
+ var ret = new Promise((resolve,reject) => {
|
|
|
+ var evt = new EventParam(next,args);
|
|
|
+ function next() {
|
|
|
+ process.nextTick(()=> chain(iter));
|
|
|
+ }
|
|
|
+ function chain(iter) {
|
|
|
+ var v = iter.next();
|
|
|
+ if(v.done) { resolve(evt); return; }
|
|
|
+ try {
|
|
|
+ var entry = v.value;
|
|
|
+ evt.args = args;
|
|
|
+ evt.name = entry.name;
|
|
|
+ entry.callback(...args,evt);
|
|
|
+ evt.consume();
|
|
|
+ if(evt._dostop == 1) {
|
|
|
+ resolve(evt);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } catch(e) {
|
|
|
+ console.log(e);
|
|
|
+ evt.errors.push(e);
|
|
|
+ }
|
|
|
+ if(!evt._dowait) next();
|
|
|
+ evt._dowait = 0;
|
|
|
+ }
|
|
|
+ next(); // Start chain
|
|
|
+ });
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ // process should be handled here
|
|
|
+ processRetDone(tocall,nargs) {
|
|
|
var args = nargs || []; // or empty
|
|
|
var evt = new EventParam(next,args); // Travel between events
|
|
|
-
|
|
|
+
|
|
|
var callback,dotrigger = 0;
|
|
|
function triggerDone() {
|
|
|
if(callback) callback(evt);
|
|
@@ -131,7 +165,7 @@ class Eventual {
|
|
|
triggerDone();
|
|
|
return;
|
|
|
}
|
|
|
- evt.count++;
|
|
|
+ evt.consume();
|
|
|
}catch(e) {
|
|
|
console.log(e);
|
|
|
evt.errors.push(e);
|