Passed
Push — master ( 2a2245...4f3a31 )
by Evgeniy
02:13
created

RoadRunnerWorker   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Test Coverage

Coverage 83.33%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 24
c 1
b 0
f 1
dl 0
loc 48
ccs 20
cts 24
cp 0.8333
rs 10
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A respondWithError() 0 11 2
A waitRequest() 0 6 2
A respond() 0 3 1
A __construct() 0 14 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Yii\Runner\RoadRunner;
6
7
use Psr\Container\ContainerInterface;
8
use Psr\Http\Message\ResponseFactoryInterface;
9
use Psr\Http\Message\ResponseInterface;
10
use Psr\Http\Message\ServerRequestFactoryInterface;
11
use Psr\Http\Message\ServerRequestInterface;
12
use Psr\Http\Message\StreamFactoryInterface;
13
use Psr\Http\Message\UploadedFileFactoryInterface;
14
use Spiral\RoadRunner\Http\PSR7Worker;
15
use Spiral\RoadRunner\Http\PSR7WorkerInterface;
16
use Spiral\RoadRunner\Worker;
17
use Throwable;
18
use Yiisoft\ErrorHandler\ErrorHandler;
19
use Yiisoft\ErrorHandler\Middleware\ErrorCatcher;
20
use Yiisoft\Http\Status;
21
use Yiisoft\Yii\Http\Handler\ThrowableHandler;
22
23
use function microtime;
24
25
/**
26
 * @internal
27
 */
28
final class RoadRunnerWorker
29
{
30
    private ResponseFactoryInterface $responseFactory;
31
    private PSR7WorkerInterface $worker;
32
    private ErrorCatcher $errorCatcher;
33
    private ErrorHandler $errorHandler;
34
35 13
    public function __construct(ContainerInterface $container, PSR7WorkerInterface $worker = null)
36
    {
37
        /** @psalm-var ResponseFactoryInterface $this->responseFactory */
38 13
        $this->responseFactory = $container->get(ResponseFactoryInterface::class);
39
        /** @psalm-var ErrorCatcher $this->errorCatcher */
40 13
        $this->errorCatcher = $container->get(ErrorCatcher::class);
41
        /** @psalm-var ErrorHandler $this->errorHandler */
42 13
        $this->errorHandler = $container->get(ErrorHandler::class);
43
        /** @psalm-suppress MixedArgument */
44 13
        $this->worker = $worker ?? new PSR7Worker(
45
            Worker::create(),
46
            $container->get(ServerRequestFactoryInterface::class),
47
            $container->get(StreamFactoryInterface::class),
48
            $container->get(UploadedFileFactoryInterface::class),
49
        );
50 13
    }
51
52 9
    public function respond(ResponseInterface $response): void
53
    {
54 9
        $this->worker->respond($response);
55 9
    }
56
57 4
    public function respondWithError(Throwable $throwable, ServerRequestInterface $request = null): ResponseInterface
58
    {
59 4
        if ($request === null) {
60 2
            $errorData = $this->errorHandler->handle($throwable);
61 2
            $response = $errorData->addToResponse($this->responseFactory->createResponse(Status::BAD_REQUEST));
62
        } else {
63 2
            $response = $this->errorCatcher->process($request, new ThrowableHandler($throwable));
64
        }
65
66 4
        $this->respond($response);
67 4
        return $response;
68
    }
69
70 10
    public function waitRequest(): ServerRequestInterface|Throwable|null
71
    {
72
        try {
73 10
            return $this->worker->waitRequest()?->withAttribute('applicationStartTime', microtime(true));
74 2
        } catch (Throwable $t) {
75 2
            return $t;
76
        }
77
    }
78
}
79