-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RPCService.php
81 lines (67 loc) · 2.41 KB
/
RPCService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
declare(strict_types=1);
namespace App\Endpoint\Centrifugo;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\ServerRequestInterface;
use RoadRunner\Centrifugo\Payload\RPCResponse;
use RoadRunner\Centrifugo\Request;
use Spiral\Filters\Exception\ValidationException;
use Spiral\Http\Http;
use Spiral\RoadRunnerBridge\Centrifugo\ServiceInterface;
final readonly class RPCService implements ServiceInterface
{
public function __construct(
private Http $http,
private ServerRequestFactoryInterface $requestFactory,
) {
}
/**
* @param Request\RPC $request
*/
public function handle(Request\RequestInterface $request): void
{
try {
$response = $this->http->handle(
$this->createHttpRequest($request),
);
$result = \json_decode((string)$response->getBody(), true);
$result['code'] = $response->getStatusCode();
} catch (ValidationException $e) {
$result['code'] = $e->getCode();
$result['errors'] = $e->errors;
$result['message'] = $e->getMessage();
} catch (\Throwable $e) {
$result['code'] = $e->getCode();
$result['message'] = $e->getMessage();
}
try {
$request->respond(
new RPCResponse(
data: $result,
),
);
} catch (\Throwable $e) {
$request->error($e->getCode(), $e->getMessage());
}
}
public function createHttpRequest(Request\RPC $request): ServerRequestInterface
{
[$method, $uri] = \explode(':', $request->method, 2);
$method = \strtoupper($method);
$httpRequest = $this->requestFactory
->createServerRequest(\strtoupper($method), \ltrim($uri, '/'))
->withHeader('Content-Type', 'application/json');
$data = $request->getData();
$token = $data['token'] ?? null;
unset($data['token']);
$httpRequest = match ($method) {
'GET', 'HEAD' => $httpRequest->withQueryParams($data),
'POST', 'PUT', 'DELETE' => $httpRequest->withParsedBody($data),
default => throw new \InvalidArgumentException('Unsupported method'),
};
if (!empty($token)) {
$httpRequest = $httpRequest->withHeader('X-Auth-Token', $token);
}
return $httpRequest;
}
}