|
2 | 2 |
|
3 | 3 | namespace Utopia\Http\Adapter\Swoole; |
4 | 4 |
|
5 | | -use Swoole\Coroutine; |
6 | 5 | use Utopia\Http\Adapter; |
7 | 6 | use Utopia\DI\Container; |
8 | | -use Swoole\Coroutine\Http\Server as SwooleServer; |
| 7 | +use Swoole\Http\Server as SwooleServer; |
9 | 8 | use Swoole\Http\Request as SwooleRequest; |
10 | 9 | use Swoole\Http\Response as SwooleResponse; |
11 | 10 |
|
12 | | -use function Swoole\Coroutine\run; |
13 | | - |
14 | 11 | class Server extends Adapter |
15 | 12 | { |
16 | 13 | protected SwooleServer $server; |
17 | | - protected const REQUEST_CONTAINER_CONTEXT_KEY = '__utopia_http_request_container'; |
18 | 14 | protected Container $container; |
19 | 15 | protected ?Container $requestContainer = null; |
20 | 16 |
|
21 | 17 | public function __construct(string $host, ?string $port = null, array $settings = [], ?Container $container = null) |
22 | 18 | { |
23 | | - $this->server = new SwooleServer($host, $port); |
24 | | - $this->server->set(\array_merge([ |
25 | | - 'enable_coroutine' => true, |
26 | | - 'http_parse_cookie' => false, |
27 | | - ], $settings)); |
| 19 | + $this->server = new SwooleServer($host, (int) $port); |
| 20 | + $this->server->set(\array_merge($settings, [ |
| 21 | + 'open_http2_protocol' => true, |
| 22 | + 'dispatch_mode' => 2, |
| 23 | + ])); |
28 | 24 | $this->container = $container ?? new Container(); |
29 | 25 | } |
30 | 26 |
|
31 | 27 | public function onRequest(callable $callback) |
32 | 28 | { |
33 | | - $this->server->handle('/', function (SwooleRequest $request, SwooleResponse $response) use ($callback) { |
34 | | - $requestContainer = new Container($this->container); |
35 | | - $requestContainer->set('swooleRequest', fn () => $request); |
36 | | - $requestContainer->set('swooleResponse', fn () => $response); |
| 29 | + $this->server->on('request', function (SwooleRequest $request, SwooleResponse $response) use ($callback) { |
| 30 | + go(function () use ($request, $response, $callback) { |
| 31 | + $requestContainer = new Container($this->container); |
| 32 | + $requestContainer->set('swooleRequest', fn () => $request); |
| 33 | + $requestContainer->set('swooleResponse', fn () => $response); |
37 | 34 |
|
38 | | - if (Coroutine::getCid() !== -1) { |
39 | | - Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] = $requestContainer; |
40 | | - } else { |
41 | 35 | $this->requestContainer = $requestContainer; |
42 | | - } |
43 | | - |
44 | | - $utopiaRequest = new Request($request); |
45 | | - $utopiaResponse = new Response($response); |
46 | 36 |
|
47 | | - \call_user_func($callback, $utopiaRequest, $utopiaResponse); |
| 37 | + \call_user_func($callback, new Request($request), new Response($response)); |
| 38 | + }); |
48 | 39 | }); |
49 | 40 | } |
50 | 41 |
|
51 | 42 | public function getContainer(): Container |
52 | 43 | { |
53 | | - if (Coroutine::getCid() !== -1) { |
54 | | - return Coroutine::getContext()[self::REQUEST_CONTAINER_CONTEXT_KEY] ?? $this->container; |
55 | | - } |
56 | | - |
57 | 44 | return $this->requestContainer ?? $this->container; |
58 | 45 | } |
59 | 46 |
|
60 | | - public function onStart(callable $callback) |
| 47 | + public function getServer(): SwooleServer |
61 | 48 | { |
| 49 | + return $this->server; |
| 50 | + } |
62 | 51 |
|
63 | | - \call_user_func($callback, $this); |
| 52 | + public function onStart(callable $callback) |
| 53 | + { |
| 54 | + $this->server->on('start', function () use ($callback) { |
| 55 | + go(function () use ($callback) { |
| 56 | + \call_user_func($callback, $this); |
| 57 | + }); |
| 58 | + }); |
64 | 59 | } |
65 | 60 |
|
66 | 61 | public function start() |
67 | 62 | { |
68 | | - if (Coroutine::getCid() === -1) { |
69 | | - run(fn () => $this->server->start()); |
70 | | - } else { |
71 | | - $this->server->start(); |
72 | | - } |
| 63 | + return $this->server->start(); |
73 | 64 | } |
74 | 65 | } |
0 commit comments