diff --git a/index.js b/index.js index 16537e4..a8ea24b 100644 --- a/index.js +++ b/index.js @@ -37,7 +37,7 @@ function compose (middleware) { function dispatch (i) { if (i <= index) return Promise.reject(new Error('next() called multiple times')) index = i - const fn = middleware[i] || next + const fn = wrap(middleware[i]) || next if (!fn) return Promise.resolve() try { return Promise.resolve(fn(context, function next () { @@ -49,3 +49,21 @@ function compose (middleware) { } } } + +/** + * composes a wrapped middleware using middleware._wrappers + * + * @param {Function} middleware + * @return {Function} composed + * @api public + */ + +function wrap (middleware) { + if (!middleware) return false + if (!middleware._wrappers) return middleware + if (!Array.isArray(middleware._wrappers)) throw new TypeError('._wrappers must be an array') + if (!middleware._wrappers.length) return middleware + const wrappers = middleware._wrappers + delete middleware._wrappers + return compose([...wrappers, middleware]) +}