-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathSwoole.php
More file actions
executable file
·80 lines (66 loc) · 2.22 KB
/
Copy pathSwoole.php
File metadata and controls
executable file
·80 lines (66 loc) · 2.22 KB
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
<?php
namespace Utopia\Http\Adapter;
use Swoole\Async;
use Swoole\Constant;
use Swoole\Coroutine;
use Swoole\Http\Request as SwooleRequest;
use Swoole\Http\Response as SwooleResponse;
use Swoole\Http\Server as Server;
use Utopia\DI\Container;
use Utopia\Http\Adapter;
use Utopia\Http\Adapter\Swoole\Mode;
use Utopia\Http\Adapter\Swoole\Request;
use Utopia\Http\Adapter\Swoole\Response;
class Swoole extends Adapter
{
private const string CONTEXT_KEY = '__utopia__';
public function __construct(
private readonly Server $server,
private readonly Container $resources
)
{
}
public function configure(Mode $mode, array $settings = []): void
{
$this->server->set([
...$mode->settings(),
...$settings,
]);
if ($mode === Mode::HYPERLOOP_B) {
Coroutine::set([Constant::OPTION_HOOK_FLAGS => SWOOLE_HOOK_ALL]);
}
}
public function onRequest(callable $callback): void
{
$this->server->on('request', function (SwooleRequest $request, SwooleResponse $response) use ($callback) {
$context = new Container($this->resources);
// TODO (@loks0n): `swooleRequest` and `swooleResponse` should be removed.
// Any consumers using these should be updated to use the abstract request/response objects.
$context->set('swooleRequest', fn() => $request);
$context->set('swooleResponse', fn() => $response);
Coroutine::getContext()[self::CONTEXT_KEY] = $context;
\call_user_func($callback, new Request($request), new Response($response));
});
}
public function getContext(): Container
{
if (Coroutine::getCid() !== -1) {
return Coroutine::getContext()[self::CONTEXT_KEY] ?? $this->resources;
}
return $this->resources;
}
public function onStart(callable $callback): void
{
$this->server->on('start', function () use ($callback) {
if (Coroutine::getCid() === -1) {
go(fn () => $callback($this));
} else {
$callback($this);
}
});
}
public function start(): void
{
$this->server->start();
}
}