Skip to content

Commit a5c32a8

Browse files
committed
Rewrote MiddlewareRunner to iterate over the array of middleware instead of creating a new instance of itself for each middleware ran
1 parent 001f0a9 commit a5c32a8

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

src/MiddlewareRunner.php

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,33 @@ public function __invoke(ServerRequestInterface $request)
3232
return Promise\reject(new \RuntimeException('No middleware to run'));
3333
}
3434

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-
});
35+
$position = 0;
36+
37+
$func = function (ServerRequestInterface $request) use (&$func, &$position) {
38+
$middleware = $this->middleware[$position];
39+
$cancel = null;
40+
return new Promise\Promise(function ($resolve, $reject) use ($middleware, $request, $func, &$cancel, &$position) {
41+
$position++;
42+
try {
43+
$cancel = $middleware(
44+
$request,
45+
$func
46+
);
47+
$resolve($cancel);
48+
} catch (\Exception $error) {
49+
$position--;
50+
$reject($error);
51+
} catch (\Throwable $error) {
52+
$position--;
53+
$reject($error);
54+
}
55+
}, function () use (&$cancel) {
56+
if ($cancel instanceof Promise\CancellablePromiseInterface) {
57+
$cancel->cancel();
58+
}
59+
});
60+
};
61+
62+
return $func($request);
5263
}
53-
}
64+
}

0 commit comments

Comments
 (0)