friendship ended with social-app. php is my new best friend
1<?php
2
3namespace React\Http\Io;
4
5use Psr\Http\Message\ResponseInterface;
6use Psr\Http\Message\ServerRequestInterface;
7use React\Promise\PromiseInterface;
8
9/**
10 * [Internal] Middleware runner to expose an array of middleware request handlers as a single request handler callable
11 *
12 * @internal
13 */
14final class MiddlewareRunner
15{
16 /**
17 * @var callable[]
18 */
19 private $middleware;
20
21 /**
22 * @param callable[] $middleware
23 */
24 public function __construct(array $middleware)
25 {
26 $this->middleware = \array_values($middleware);
27 }
28
29 /**
30 * @param ServerRequestInterface $request
31 * @return ResponseInterface|PromiseInterface<ResponseInterface>
32 * @throws \Exception
33 */
34 public function __invoke(ServerRequestInterface $request)
35 {
36 if (empty($this->middleware)) {
37 throw new \RuntimeException('No middleware to run');
38 }
39
40 return $this->call($request, 0);
41 }
42
43 /** @internal */
44 public function call(ServerRequestInterface $request, $position)
45 {
46 // final request handler will be invoked without a next handler
47 if (!isset($this->middleware[$position + 1])) {
48 $handler = $this->middleware[$position];
49 return $handler($request);
50 }
51
52 $that = $this;
53 $next = function (ServerRequestInterface $request) use ($that, $position) {
54 return $that->call($request, $position + 1);
55 };
56
57 // invoke middleware request handler with next handler
58 $handler = $this->middleware[$position];
59 return $handler($request, $next);
60 }
61}