Completed
Push — master ( c6bc00...58eb61 )
by Pieter
05:28 queued 02:20
created

Handler::onHandshake()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 2
crap 2
1
<?php declare(strict_types = 1);
2
3
namespace ekinhbayar\GitAmp\Websocket;
4
5
use Aerys\Request;
6
use Aerys\Response;
7
use Aerys\Websocket;
8
use Aerys\Websocket\Endpoint;
9
use ekinhbayar\GitAmp\Client\GitAmp;
10
use ekinhbayar\GitAmp\Response\Results;
11
use ekinhbayar\GitAmp\Storage\Counter;
12
use function Amp\repeat;
13
14
class Handler implements Websocket
15
{
16
    private $endpoint;
17
18
    private $counter;
19
20
    private $origin;
21
22
    private $gitamp;
23
24 6
    public function __construct(Counter $counter, string $origin, GitAmp $gitamp)
25
    {
26 6
        $this->origin  = $origin;
27 6
        $this->counter = $counter;
28 6
        $this->gitamp  = $gitamp;
29
    }
30
31 2
    public function onStart(Endpoint $endpoint)
32
    {
33 2
        $this->endpoint = $endpoint;
34
35 2
        $this->counter->set(0);
36
37 2
        repeat(function() {
38 2
            $this->emit(yield $this->gitamp->listen());
39 2
        }, 25000);
40
    }
41
42 2
    public function onHandshake(Request $request, Response $response)
43
    {
44 2
        if ($request->getHeader('origin') !== $this->origin) {
45 1
            $response->setStatus(403);
46 1
            $response->end('<h1>origin not allowed</h1>');
47
48 1
            return null;
49
        }
50
51 1
        return $request->getConnectionInfo()['client_addr'];
52
    }
53
54
    public function onOpen(int $clientId, $handshakeData)
55
    {
56
        $this->emit(yield $this->gitamp->listen());
57
58
        $this->counter->increment();
59
60
        $this->sendConnectedUsersCount($this->counter->get());
61
    }
62
63 1
    private function emit(Results $events)
64
    {
65 1
        if (!$events->hasEvents()) {
66 1
            return;
67
        }
68
69
        $this->endpoint->send(null, $events->jsonEncode());
70
    }
71
72 1
    private function sendConnectedUsersCount(int $count)
73
    {
74 1
        $this->endpoint->send(null, \json_encode(['connectedUsers' => $count]));
75
    }
76
77
    public function onData(int $clientId, Websocket\Message $msg)
78
    {
79
        // yielding $msg buffers the complete payload into a single string.
80
    }
81
82 1
    public function onClose(int $clientId, int $code, string $reason)
83
    {
84 1
        $this->counter->decrement();
85
86 1
        $this->sendConnectedUsersCount($this->counter->get());
87
    }
88
89
    public function onStop()
90
    {
91
        // intentionally left blank
92
    }
93
}
94