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