This commit is contained in:
2026-05-09 22:17:19 +08:00
parent 4ae3001fe3
commit 3ee115df2e
4 changed files with 168 additions and 10 deletions
+92 -7
View File
@@ -2,8 +2,11 @@
namespace Coroutine\Server;
use Kiri\Di\Context;
use Kiri\Di\Inject\Container;
use Kiri\Router\Constrict\ConstrictRequest;
use Psr\Http\Message\RequestInterface;
use Swoole\Coroutine;
use Swoole\Coroutine\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
@@ -15,8 +18,17 @@ abstract class Websocket
#[Container(Transport::class)]
public Transport $transport;
/**
* @var Config
*/
public Config $config;
/**
* @param Config $config
* @return void
*/
public function start(Config $config): void
{
$this->config = $config;
@@ -35,6 +47,12 @@ abstract class Websocket
$server->start();
}
/**
* @param Request $request
* @param Response $ws
* @return void
*/
public function getLists(Request $request, Response $ws): void
{
try {
@@ -59,6 +77,12 @@ abstract class Websocket
}
}
/**
* @param Request $request
* @param Response $ws
* @return void
*/
public function handler(Request $request, Response $ws): void
{
$upgraded = false;
@@ -115,11 +139,21 @@ abstract class Websocket
}
}
/**
* @return void
*/
abstract public function onBeforeMessageLoop(): void;
protected function authorizeConnection(Request $request): ConstrictRequest
/**
* @param Request $request
* @return ConstrictRequest
*/
protected function authorizeConnection(Request $request): RequestInterface
{
$psr7Request = ConstrictRequest::builder($request);
/** @var RequestInterface $psr7Request */
$psr7Request = Context::set(RequestInterface::class, ConstrictRequest::builder($request));
if (!$psr7Request->hasQuery($this->config->authKey)) {
throw new \RuntimeException('Missing auth parameter.', 400);
}
@@ -131,7 +165,12 @@ abstract class Websocket
return $psr7Request;
}
protected function authorizeOnlineListRequest(ConstrictRequest $request): bool
/**
* @param ConstrictRequest $request
* @return bool
*/
protected function authorizeOnlineListRequest(RequestInterface $request): bool
{
if (!$request->hasQuery($this->config->authKey)) {
return false;
@@ -140,20 +179,34 @@ abstract class Websocket
return $this->canViewOnlineLists($request) && $request->getAuthority() !== null;
}
/**
* @param ConstrictRequest $request
* @return bool
*/
protected function canViewOnlineLists(ConstrictRequest $request): bool
{
return $this->onConnected($request);
}
/**
* @return void
*/
private function configureRuntime(): void
{
if ($this->config->maxCoroutine > 0 && class_exists(\Swoole\Coroutine::class)) {
\Swoole\Coroutine::set([
if ($this->config->maxCoroutine > 0 && class_exists(Coroutine::class)) {
Coroutine::set([
'max_coroutine' => $this->config->maxCoroutine,
]);
}
}
/**
* @param Server $server
* @return void
*/
private function configureServer(Server $server): void
{
if (!method_exists($server, 'set')) {
@@ -173,6 +226,11 @@ abstract class Websocket
}
}
/**
* @param string $payload
* @return void
*/
private function assertPayloadSize(string $payload): void
{
$size = strlen($payload);
@@ -186,6 +244,13 @@ abstract class Websocket
}
}
/**
* @param Response $ws
* @param Throwable $throwable
* @param bool $upgraded
* @return void
*/
private function throwable(Response $ws, Throwable $throwable, bool $upgraded): void
{
$status = $throwable->getCode();
@@ -220,11 +285,31 @@ abstract class Websocket
$ws->end($message);
}
abstract public function onConnected(ConstrictRequest $request): bool;
/**
* @param RequestInterface $request
* @return bool
*/
abstract public function onConnected(RequestInterface $request): bool;
/**
* @return void
*/
abstract public function onStart(): void;
abstract public function onMessage(ConstrictRequest $psr7Request, string $frame): void;
/**
* @param RequestInterface $psr7Request
* @param string $frame
* @return void
*/
abstract public function onMessage(RequestInterface $psr7Request, string $frame): void;
/**
* @param int $userId
* @return void
*/
abstract public function onDisconnect(int $userId): void;
}