Skip to content

Commit 70b7a48

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 4888b99 commit 70b7a48

File tree

1 file changed

+32
-19
lines changed

1 file changed

+32
-19
lines changed

src/MiddlewareRunner.php

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)