1 | export default compose;
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | function 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 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | return function(context, next) {
|
28 |
|
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 | }
|