UNPKG

compose-middleware

Version:

Compose an array of middleware into a single function for use in Express, Connect, router, etc.

79 lines 2.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var debug = require("debug"); var flatten = require("array-flatten"); var log = debug('compose-middleware'); /** * Compose an array of middleware handlers into a single handler. */ function compose() { var handlers = []; for (var _i = 0; _i < arguments.length; _i++) { handlers[_i] = arguments[_i]; } var middleware = generate(handlers); return function (req, res, done) { return middleware(null, req, res, done); }; } exports.compose = compose; /** * Wrap middleware handlers. */ function errors() { var handlers = []; for (var _i = 0; _i < arguments.length; _i++) { handlers[_i] = arguments[_i]; } return generate(handlers); } exports.errors = errors; /** * Generate a composed middleware function. */ function generate(handlers) { var stack = flatten(handlers); for (var _i = 0, stack_1 = stack; _i < stack_1.length; _i++) { var handler = stack_1[_i]; if (typeof handler !== 'function') { throw new TypeError('Handlers must be a function'); } } return function middleware(err, req, res, done) { var index = -1; function dispatch(pos, err) { var handler = stack[pos]; index = pos; if (index === stack.length) return done(err); function next(err) { if (pos < index) { throw new TypeError('`next()` called multiple times'); } return dispatch(pos + 1, err); } try { if (handler.length === 4) { if (err) { log('handle(err)', handler.name || '<anonymous>'); return handler(err, req, res, next); } } else { if (!err) { log('handle()', handler.name || '<anonymous>'); return handler(req, res, next); } } } catch (e) { // Avoid future errors that could diverge stack execution. if (index > pos) throw e; log('try..catch', e); return next(e); } return next(err); } return dispatch(0, err); }; } //# sourceMappingURL=index.js.map