/
zen.js
73 lines (71 loc) · 1.98 KB
/
zen.js
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
/**
* Default error handler
*/
errorHandler = function error(/*args,*/ /*err*/) {
var err=(arguments.length >0)?arguments[arguments.length-1]:null;
if (typeof err == "undefined" || !err)
return console.error("Error:","This is the end, with no result given");
var error=err;
if (err.stack)
error=err.stack;
console.error("Error:",error);
return;
};
/**
* Default result handler
*/
resultHandler = function result(/*args,*/ /*res*/) {
var res=(arguments.length >0)?arguments[arguments.length-1]:null;
return;
};
/**
* Zen uses a 'setup' pattern, returning a callable engine function
*/
module.exports= function (/*layers*/) {
var error = function(/*args*/) {
return engine.errorHandler.apply(this,arguments);
},
layers=Array.prototype.concat([error],Array.prototype.slice.call(arguments).reverse());
var L=layers.length-1;
var first=layers[L]; //first access optimization
var nextHandler= function(/* args, err, res */) {
var args=Array.prototype.slice.call(arguments);
var res=args.pop();
var err=args.pop();
try {
if (err) {
args.push(err);
return engine.errorHandler.apply(this,args);
} else if (res) {
args.push(res);
return engine.resultHandler.apply(this,args);
}
} catch (ex) {
args.push(ex);
return engine.errorHandler.apply(this,args);
}
}
// The real Zen Engine
var engine= function (/*handleArgs*/) {
var handleArgs=Array.prototype.slice.call(arguments);
var self=this;
var i=L;
var next= function(err,res) {
if(err||res) {
handleArgs[handleArgs.length-1]=err; //overriding last arg
return nextHandler.apply(self,Array.prototype.concat(handleArgs,[res]));
} else
return layers[--i].apply(self,handleArgs);
}
handleArgs.push(next);
try {
return first.apply(self,handleArgs);
} catch (err) {
handleArgs[handleArgs.length-1]=err; //overriding last arg
return handle.errorHandler.apply(self,handleArgs);
}
}
engine.errorHandler = errorHandler;
engine.resultHandler = resultHandler;
return engine;
};