This commit is contained in:
2022-10-11 18:55:06 +08:00
parent 268f8665d0
commit 5bfe8401f5
6 changed files with 57 additions and 61 deletions
@@ -3,20 +3,15 @@
namespace Kiri\Websocket\Contract; namespace Kiri\Websocket\Contract;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use Swoole\Coroutine\Http\Server as CoroutineServer;
interface OnCloseInterface interface OnCloseInterface
{ {
/** /**
* @param Server|CoroutineServer $server
* @param int $fd * @param int $fd
* @return void * @return void
*/ */
public function onClose(Server|CoroutineServer $server, int $fd): void; public function OnClose(int $fd): void;
} }
@@ -0,0 +1,15 @@
<?php
namespace Kiri\Websocket\Contract;
interface OnDisconnectInterface
{
/**
* @param int $fd
*/
public function OnDisconnect(int $fd): void;
}
@@ -13,9 +13,9 @@ interface OnHandshakeInterface
/** /**
* @param Request $request * @param Request $request
* @param Response $response * @param Response $response
* @return int * @return void
*/ */
public function onHandshake(Request $request, Response $response): int; public function OnHandshake(Request $request, Response $response): void;
} }
@@ -4,19 +4,16 @@ namespace Kiri\Websocket\Contract;
use Swoole\WebSocket\Frame; use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use Swoole\Coroutine\Http\Server as CoroutineServer;
interface OnMessageInterface interface OnMessageInterface
{ {
/** /**
* @param Server|CoroutineServer $server
* @param Frame $frame * @param Frame $frame
* @return void * @return void
*/ */
public function onMessage(Server|CoroutineServer $server, Frame $frame): void; public function OnMessage(Frame $frame): void;
} }
@@ -4,20 +4,16 @@ namespace Kiri\Websocket\Contract;
use Swoole\Http\Request; use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use Swoole\Coroutine\Http\Server as CoroutineServer;
interface OnOpenInterface interface OnOpenInterface
{ {
/** /**
* @param Server|CoroutineServer $server
* @param Request $request * @param Request $request
* @return void * @return void
*/ */
public function onOpen(Server|CoroutineServer $server, Request $request): void; public function onOpen(Request $request): void;
} }
+37 -44
View File
@@ -3,7 +3,6 @@
namespace Kiri\Websocket; namespace Kiri\Websocket;
use Closure; use Closure;
use Co\WaitGroup;
use Exception; use Exception;
use Kiri\Abstracts\Component; use Kiri\Abstracts\Component;
use Kiri\Abstracts\Config; use Kiri\Abstracts\Config;
@@ -23,14 +22,13 @@ use Kiri\Message\Handler\RouterCollector;
use Kiri\Message\ResponseEmitter; use Kiri\Message\ResponseEmitter;
use Kiri\Message\ServerRequest; use Kiri\Message\ServerRequest;
use Kiri\Message\Constrict\Response as CResponse; use Kiri\Message\Constrict\Response as CResponse;
use Kiri\Server\Events\OnShutdown;
use Kiri\Websocket\Contract\OnCloseInterface; use Kiri\Websocket\Contract\OnCloseInterface;
use Kiri\Websocket\Contract\OnDisconnectInterface;
use Kiri\Websocket\Contract\OnHandshakeInterface; use Kiri\Websocket\Contract\OnHandshakeInterface;
use Kiri\Websocket\Contract\OnMessageInterface; use Kiri\Websocket\Contract\OnMessageInterface;
use Kiri\Websocket\Contract\OnOpenInterface; use Kiri\Websocket\Contract\OnOpenInterface;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface; use Psr\Container\NotFoundExceptionInterface;
use ReflectionException;
use Swoole\Coroutine; use Swoole\Coroutine;
use Swoole\Http\Request; use Swoole\Http\Request;
use Swoole\Http\Response; use Swoole\Http\Response;
@@ -39,7 +37,7 @@ use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server as WsServer; use Swoole\WebSocket\Server as WsServer;
use Swoole\Coroutine\Http\Server as WhServer; use Swoole\Coroutine\Http\Server as WhServer;
class Server extends Component class Server extends Component implements OnHandshakeInterface, OnMessageInterface, OnCloseInterface, OnDisconnectInterface
{ {
@@ -115,7 +113,7 @@ class Server extends Component
*/ */
public function init(): void public function init(): void
{ {
$exception = Config::get('exception.http', ExceptionHandlerDispatcher::class); $exception = Config::get('exception.websocket', ExceptionHandlerDispatcher::class);
if (!in_array(ExceptionHandlerInterface::class, class_implements($exception))) { if (!in_array(ExceptionHandlerInterface::class, class_implements($exception))) {
$exception = ExceptionHandlerDispatcher::class; $exception = ExceptionHandlerDispatcher::class;
} }
@@ -130,7 +128,7 @@ class Server extends Component
* @return void * @return void
* @throws Exception * @throws Exception
*/ */
public function onHandshake(Request $request, Response $response): void public function OnHandshake(Request $request, Response $response): void
{ {
try { try {
/** @var \Kiri\Message\Response $psrResponse */ /** @var \Kiri\Message\Response $psrResponse */
@@ -145,26 +143,26 @@ class Server extends Component
} else if (is_null($handler)) { } else if (is_null($handler)) {
$psrResponse->withContent('Page not found.')->withStatus(404); $psrResponse->withContent('Page not found.')->withStatus(404);
} else { } else {
$psrResponse = $this->dispatcher->with($handler)->handle($psrRequest); // $psrResponse = $this->dispatcher->with($handler)->handle($psrRequest);
//
$executor = $handler->callback; // $executor = $handler->callback;
$response->upgrade(); // $response->upgrade();
if ($handler instanceof OnHandshakeInterface) { // if ($handler instanceof OnHandshakeInterface) {
$statusCode = $handler->onHandshake($request, $response); // $statusCode = $handler->OnHandshake($request, $response);
$response->setStatusCode($statusCode); // $response->setStatusCode($statusCode);
$response->write("connect ok."); // $response->write("connect ok.");
} // }
if ($executor instanceof OnOpenInterface) { // if ($executor instanceof OnOpenInterface) {
$executor->onOpen($this->server, $request); // $executor->onOpen($this->server, $request);
} // }
while (true) { // while (true) {
$frame = $response->recv(); // $frame = $response->recv();
if ($frame === false || $frame instanceof CloseFrame || $frame === '') { // if ($frame === false || $frame instanceof CloseFrame || $frame === '') {
$handler->onClose($this->server, $response->fd); // $handler->onClose($this->server, $response->fd);
break; // break;
} // }
$handler->onMessage($this->server, $frame); // $handler->onMessage($this->server, $frame);
} // }
} }
} catch (\Throwable $throwable) { } catch (\Throwable $throwable) {
$psrResponse = $this->exception->emit($throwable, di(CResponse::class)); $psrResponse = $this->exception->emit($throwable, di(CResponse::class));
@@ -175,44 +173,39 @@ class Server extends Component
/** /**
* @param WsServer|Coroutine\Http\Server $server
* @param Frame $frame * @param Frame $frame
* @return void * @return void
*/ */
public function onMessage(WsServer|WhServer $server, Frame $frame): void public function OnMessage(Frame $frame): void
{ {
$handler = $this->handler->callback;
if ($handler instanceof OnMessageInterface) {
$handler->onMessage($server, $frame);
}
} }
/** /**
* @param WsServer|Coroutine\Http\Server $server
* @param int $fd * @param int $fd
* @return void * @return void
*/ */
public function onClose(WsServer|WhServer $server, int $fd): void public function OnClose(int $fd): void
{ {
$handler = $this->handler->callback;
if ($handler instanceof OnCloseInterface) {
$handler->onClose($server, $fd);
}
} }
/** /**
* @param WsServer|WhServer $server * @param int $fd
* @return void
*/
public function OnDisconnect(int $fd): void
{
// TODO: Implement OnDisconnect() method.
}
/**
* @param Request $request * @param Request $request
* @return void * @return void
*/ */
public function onOpen(WsServer|WhServer $server, Request $request): void public function OnOpen(Request $request): void
{ {
$handler = $this->handler->callback;
if ($handler instanceof OnOpenInterface) {
$handler->onOpen($server, $request);
}
} }