Skip to content

Commit 260463f

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 260463f

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,8 +11,9 @@ 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
@@ -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+
return new Promise\Promise(function ($resolve, $reject) use ($middleware, $request, $func, &$response, &$position) {
43+
$position++;
44+
try {
45+
$response = $middleware(
46+
$request,
47+
$func
48+
);
49+
$resolve($response);
50+
} catch (\Exception $error) {
51+
$position--;
52+
$reject($error);
53+
} catch (\Throwable $error) {
54+
$position--;
55+
$reject($error);
56+
}
57+
}, function () use (&$response) {
58+
if ($response instanceof Promise\CancellablePromiseInterface) {
59+
$response->cancel();
60+
}
61+
});
62+
};
63+
64+
return $func($request);
5265
}
53-
}
66+
}

0 commit comments

Comments
 (0)