UNPKG

1.15 kBJavaScriptView Raw
1export default compose;
2
3/**
4 * Compose `middleware` returning
5 * a fully valid middleware comprised
6 * of all those which are passed.
7 *
8 * @param {Array} middleware
9 * @return {Function}
10 * @api public
11 */
12
13function compose(middleware) {
14 if (!Array.isArray(middleware))
15 throw new TypeError("Middleware stack must be an array!");
16 for (const fn of middleware) {
17 if (typeof fn !== "function")
18 throw new TypeError("Middleware must be composed of functions!");
19 }
20
21 /**
22 * @param {Object} context
23 * @return {Promise}
24 * @api public
25 */
26
27 return function(context, next) {
28 // last called middleware #
29 let index = -1;
30 return dispatch(0);
31 function dispatch(i) {
32 if (i <= index)
33 return Promise.reject(new Error("next() called multiple times"));
34 index = i;
35 let fn = middleware[i];
36 if (i === middleware.length) fn = next;
37 if (!fn) return Promise.resolve();
38 try {
39 return Promise.resolve(
40 fn(context, function next() {
41 return dispatch(i + 1);
42 })
43 );
44 } catch (err) {
45 return Promise.reject(err);
46 }
47 }
48 };
49}