UNPKG

1.13 kBJavaScriptView Raw
1
2/**
3 * Expose `Ware`.
4 */
5
6module.exports = Ware;
7
8
9/**
10 * Initialize a new `Ware` manager.
11 */
12
13function Ware () {
14 if (!(this instanceof Ware)) return new Ware();
15 this.fns = [];
16}
17
18
19/**
20 * Use a middleware `fn`.
21 *
22 * @param {Function} fn
23 * @return {Ware}
24 */
25
26Ware.prototype.use = function (fn) {
27 this.fns.push(fn);
28 return this;
29};
30
31
32/**
33 * Run through the middleware with the given `args` and optional `callback`.
34 *
35 * @param {Mixed} args...
36 * @param {Function} callback (optional)
37 * @return {Ware}
38 */
39
40Ware.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