@@ -11,15 +11,16 @@ final class MiddlewareRunner
1111{
1212 /**
1313 * @var callable[]
14+ * @internal
1415 */
15- private $ middleware = array ();
16+ public $ middleware = array ();
1617
1718 /**
1819 * @param callable[] $middleware
1920 */
2021 public function __construct (array $ middleware )
2122 {
22- $ this ->middleware = $ middleware ;
23+ $ this ->middleware = array_values ( $ middleware) ;
2324 }
2425
2526 /**
@@ -32,22 +33,34 @@ public function __invoke(ServerRequestInterface $request)
3233 return Promise \reject (new \RuntimeException ('No middleware to run ' ));
3334 }
3435
35- $ middlewareCollection = $ this ->middleware ;
36- $ middleware = array_shift ($ middlewareCollection );
37-
38- $ cancel = null ;
39- return new Promise \Promise (function ($ resolve , $ reject ) use ($ middleware , $ request , $ middlewareCollection , &$ cancel ) {
40- $ cancel = $ middleware (
41- $ request ,
42- new MiddlewareRunner (
43- $ middlewareCollection
44- )
45- );
46- $ resolve ($ cancel );
47- }, function () use (&$ cancel ) {
48- if ($ cancel instanceof Promise \CancellablePromiseInterface) {
49- $ cancel ->cancel ();
50- }
51- });
36+ $ position = 0 ;
37+
38+ $ that = $ this ;
39+ $ func = function (ServerRequestInterface $ request ) use (&$ func , &$ position , &$ that ) {
40+ $ middleware = $ that ->middleware [$ position ];
41+ $ response = null ;
42+ $ promise = new Promise \Promise (function ($ resolve ) use ($ middleware , $ request , $ func , &$ response , &$ position ) {
43+ $ position ++;
44+
45+ $ response = $ middleware (
46+ $ request ,
47+ $ func
48+ );
49+
50+ $ resolve ($ response );
51+ }, function () use (&$ response ) {
52+ if ($ response instanceof Promise \CancellablePromiseInterface) {
53+ $ response ->cancel ();
54+ }
55+ });
56+
57+ return $ promise ->then (null , function ($ error ) use (&$ position ) {
58+ $ position --;
59+
60+ return Promise \reject ($ error );
61+ });
62+ };
63+
64+ return $ func ($ request );
5265 }
5366}
0 commit comments