UNPKG

2.47 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var debug = require("debug");
4var flatten = require("array-flatten");
5var log = debug('compose-middleware');
6/**
7 * Compose an array of middleware handlers into a single handler.
8 */
9function compose() {
10 var handlers = [];
11 for (var _i = 0; _i < arguments.length; _i++) {
12 handlers[_i] = arguments[_i];
13 }
14 var middleware = generate(handlers);
15 return function (req, res, done) { return middleware(null, req, res, done); };
16}
17exports.compose = compose;
18/**
19 * Wrap middleware handlers.
20 */
21function errors() {
22 var handlers = [];
23 for (var _i = 0; _i < arguments.length; _i++) {
24 handlers[_i] = arguments[_i];
25 }
26 return generate(handlers);
27}
28exports.errors = errors;
29/**
30 * Generate a composed middleware function.
31 */
32function generate(handlers) {
33 var stack = flatten(handlers);
34 for (var _i = 0, stack_1 = stack; _i < stack_1.length; _i++) {
35 var handler = stack_1[_i];
36 if (typeof handler !== 'function') {
37 throw new TypeError('Handlers must be a function');
38 }
39 }
40 return function middleware(err, req, res, done) {
41 var index = -1;
42 function dispatch(pos, err) {
43 var handler = stack[pos];
44 index = pos;
45 if (index === stack.length)
46 return done(err);
47 function next(err) {
48 if (pos < index) {
49 throw new TypeError('`next()` called multiple times');
50 }
51 return dispatch(pos + 1, err);
52 }
53 try {
54 if (handler.length === 4) {
55 if (err) {
56 log('handle(err)', handler.name || '<anonymous>');
57 return handler(err, req, res, next);
58 }
59 }
60 else {
61 if (!err) {
62 log('handle()', handler.name || '<anonymous>');
63 return handler(req, res, next);
64 }
65 }
66 }
67 catch (e) {
68 // Avoid future errors that could diverge stack execution.
69 if (index > pos)
70 throw e;
71 log('try..catch', e);
72 return next(e);
73 }
74 return next(err);
75 }
76 return dispatch(0, err);
77 };
78}
79//# sourceMappingURL=index.js.map
\No newline at end of file