1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | module.exports = Ware;
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | function Ware () {
|
14 | if (!(this instanceof Ware)) return new Ware();
|
15 | this.fns = [];
|
16 | }
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | Ware.prototype.use = function (fn) {
|
27 | this.fns.push(fn);
|
28 | return this;
|
29 | };
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 | Ware.prototype.run = function () {
|
41 | var fns = this.fns;
|
42 | var i = 0;
|
43 | var last = arguments[arguments.length - 1];
|
44 | var callback = 'function' == typeof last ? last : null;
|
45 | var args = callback
|
46 | ? [].slice.call(arguments, 0, arguments.length - 1)
|
47 | : [].slice.call(arguments);
|
48 |
|
49 | function next (err) {
|
50 | var fn = fns[i++];
|
51 | if (!fn) return callback && callback.apply(null, [err].concat(args));
|
52 | if (fn.length < args.length + 2 && err) return next(err);
|
53 |
|
54 | var arr = [].slice.call(args);
|
55 | if (err) arr.unshift(err);
|
56 | arr.push(next);
|
57 | fn.apply(null, arr);
|
58 | }
|
59 |
|
60 | next();
|
61 | return this;
|
62 | }; |
\ | No newline at end of file |