1 | <?php declare(strict_types = 1); |
||
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) |
|
30 | |||
31 | 2 | public function onStart(Endpoint $endpoint) |
|
32 | { |
||
33 | 2 | $this->endpoint = $endpoint; |
|
34 | |||
35 | 2 | $this->counter->set(0); |
|
36 | } |
||
37 | |||
38 | 2 | public function onHandshake(Request $request, Response $response) |
|
39 | { |
||
40 | 2 | if ($request->getHeader('origin') !== $this->origin) { |
|
41 | 1 | $response->setStatus(403); |
|
42 | 1 | $response->end('<h1>origin not allowed</h1>'); |
|
43 | |||
44 | 1 | return null; |
|
45 | } |
||
46 | |||
47 | 1 | return $request->getConnectionInfo()['client_addr']; |
|
48 | } |
||
49 | |||
50 | 1 | public function onOpen(int $clientId, $handshakeData) |
|
51 | { |
||
52 | 1 | $this->emit(yield $this->gitamp->listen()); |
|
53 | |||
54 | 1 | Loop::repeat(25000, function() { |
|
55 | 1 | $this->emit(yield $this->gitamp->listen()); |
|
56 | 1 | }); |
|
57 | |||
58 | 1 | $this->counter->increment(); |
|
59 | |||
60 | 1 | $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->broadcast($events->jsonEncode()); |
||
70 | } |
||
71 | |||
72 | 2 | private function sendConnectedUsersCount(int $count) |
|
73 | { |
||
74 | 2 | $this->endpoint->broadcast(\json_encode(['connectedUsers' => $count])); |
|
75 | } |
||
76 | |||
77 | public function onData(int $clientId, Websocket\Message $msg) |
||
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() |
||
93 | } |
||
94 |