Completed
Pull Request — master (#11)
by Barney
03:39
created

StopTimer::onSuccess()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
/**
3
 * @codingStandardsIgnoreStart
4
 *
5
 * @author       Barney Hanlon <[email protected]>
6
 * @copyright    Barney Hanlon 2017
7
 * @license      https://opensource.org/licenses/MIT
8
 *
9
 * @codingStandardsIgnoreEnd
10
 */
11
12
namespace Shrikeh\GuzzleMiddleware\TimerLogger\Handler;
13
14
use Exception;
15
use GuzzleHttp\Promise\PromiseInterface;
16
use Psr\Http\Message\RequestInterface;
17
use Psr\Http\Message\ResponseInterface;
18
use Shrikeh\GuzzleMiddleware\TimerLogger\Handler\ExceptionHandler\ExceptionHandlerInterface;
19
use Shrikeh\GuzzleMiddleware\TimerLogger\Handler\ExceptionHandler\TriggerErrorHandler;
20
use Shrikeh\GuzzleMiddleware\TimerLogger\ResponseTimeLogger\ResponseTimeLoggerInterface;
21
22
/**
23
 * Class StartHandler.
24
 */
25
class StopTimer
26
{
27
    /**
28
     * @var ResponseTimeLoggerInterface
29
     */
30
    private $responseTimeLogger;
31
32
    /**
33
     * @var ExceptionHandlerInterface
34
     */
35
    private $exceptionHandler;
36
37
    /**
38
     * @param ResponseTimeLoggerInterface    $responseTimeLogger A logger for logging the response start
39
     * @param ExceptionHandlerInterface|null $exceptionHandler   An optional handler for exceptions
40
     *
41
     * @return StopTimer
42
     */
43
    public static function createFrom(
44
        ResponseTimeLoggerInterface $responseTimeLogger,
45
        ExceptionHandlerInterface $exceptionHandler = null
46
    ) {
47
        if (!$exceptionHandler) {
48
            $exceptionHandler = new TriggerErrorHandler();
49
        }
50
51
        return new self($responseTimeLogger, $exceptionHandler);
52
    }
53
54
    /**
55
     * StopTimer constructor.
56
     *
57
     * @param ResponseTimeLoggerInterface $responseTimeLogger The logger for the Response
58
     * @param ExceptionHandlerInterface   $exceptionHandler   An exception handler
59
     */
60
    public function __construct(
61
        ResponseTimeLoggerInterface $responseTimeLogger,
62
        ExceptionHandlerInterface $exceptionHandler
63
    ) {
64
        $this->responseTimeLogger = $responseTimeLogger;
65
        $this->exceptionHandler = $exceptionHandler;
66
    }
67
68
    /**
69
     * @param RequestInterface $request The Request to stop timing
70
     * @param array            $options An ignorable list of options
71
     * @param PromiseInterface $promise A Promise to fulfill
72
     */
73
    public function __invoke(
74
        RequestInterface $request,
75
        array $options,
76
        PromiseInterface $promise
77
    ) {
78
        $closure = $this->closure($request);
79
        $promise->then(
80
            $closure,
81
            $closure
82
        );
83
    }
84
85
    /**
86
     * @param RequestInterface $request The Request being timed
87
     *
88
     * @return callable|\Closure
89
     */
90
    private function closure(RequestInterface $request)
91
    {
92
        $exceptionHandler = $this->exceptionHandler;
93
94
        return function (ResponseInterface $response) use ($request, $exceptionHandler) {
0 ignored issues
show
Bug Best Practice introduced by
The expression return function(...) { /* ... */ } returns the type callable which is incompatible with the documented return type Closure|callable.
Loading history...
95
            try {
96
                $this->responseTimeLogger->stop($request, $response);
97
            } catch (Exception $e) {
98
                $exceptionHandler->handle($e);
99
            }
100
        };
101
    }
102
}
103