2020-09-02 11:38:47 +08:00
|
|
|
<?php
|
2020-10-29 18:17:25 +08:00
|
|
|
declare(strict_types=1);
|
2020-09-02 11:38:47 +08:00
|
|
|
|
|
|
|
|
namespace HttpServer\Events;
|
|
|
|
|
|
|
|
|
|
|
2020-12-15 14:04:02 +08:00
|
|
|
use Annotation\Route\Socket;
|
2020-11-20 14:38:20 +08:00
|
|
|
use Exception;
|
2020-09-04 01:05:33 +08:00
|
|
|
use HttpServer\Abstracts\Callback;
|
2020-12-15 14:04:02 +08:00
|
|
|
use HttpServer\Http\Request;
|
2020-09-02 11:38:47 +08:00
|
|
|
use HttpServer\Route\Annotation\Websocket as AWebsocket;
|
|
|
|
|
use Snowflake\Event;
|
|
|
|
|
use Snowflake\Snowflake;
|
2020-11-20 14:15:37 +08:00
|
|
|
use Swoole\Coroutine;
|
2020-09-02 11:38:47 +08:00
|
|
|
use Swoole\WebSocket\Frame;
|
|
|
|
|
use Swoole\WebSocket\Server;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Class OnMessage
|
|
|
|
|
* @package HttpServer\Events
|
|
|
|
|
*/
|
|
|
|
|
class OnMessage extends Callback
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param Server $server
|
|
|
|
|
* @param Frame $frame
|
|
|
|
|
* @throws
|
|
|
|
|
*/
|
|
|
|
|
public function onHandler(Server $server, Frame $frame)
|
|
|
|
|
{
|
|
|
|
|
try {
|
2020-12-15 14:04:02 +08:00
|
|
|
if ($frame->opcode != 0x08) {
|
|
|
|
|
$event = Snowflake::app()->getEvent();
|
|
|
|
|
Coroutine::defer(function () use ($event) {
|
|
|
|
|
$event->trigger(Event::EVENT_AFTER_REQUEST);
|
|
|
|
|
});
|
|
|
|
|
$content = $this->resolve($event, $frame, $server);
|
|
|
|
|
$server->send($frame->fd, $content);
|
2020-09-02 11:38:47 +08:00
|
|
|
}
|
2020-11-06 16:47:17 +08:00
|
|
|
} catch (\Throwable $exception) {
|
2020-09-02 11:38:47 +08:00
|
|
|
$this->addError($exception->getMessage(), 'websocket');
|
|
|
|
|
$server->send($frame->fd, $exception->getMessage());
|
2020-11-20 15:04:00 +08:00
|
|
|
} finally {
|
|
|
|
|
logger()->insert();
|
2020-09-02 11:38:47 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-20 14:38:20 +08:00
|
|
|
/**
|
|
|
|
|
* @param $event
|
|
|
|
|
* @param $frame
|
|
|
|
|
* @param $server
|
2020-12-15 14:04:02 +08:00
|
|
|
* @return mixed
|
2020-11-20 14:38:20 +08:00
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
2020-12-15 14:04:02 +08:00
|
|
|
private function resolve($event, $frame, $server): mixed
|
2020-11-20 14:38:20 +08:00
|
|
|
{
|
|
|
|
|
if ($event->exists(Event::SERVER_MESSAGE)) {
|
|
|
|
|
$event->trigger(Event::SERVER_MESSAGE, [$server, $frame]);
|
|
|
|
|
} else {
|
|
|
|
|
$frame->data = json_decode($frame->data, true);
|
|
|
|
|
}
|
2020-12-15 14:04:02 +08:00
|
|
|
if (empty($route = $frame->data['route'] ?? null)) {
|
2020-11-20 14:38:20 +08:00
|
|
|
throw new Exception('Format error.');
|
|
|
|
|
}
|
2020-12-15 14:04:02 +08:00
|
|
|
$router = Snowflake::app()->getRouter();
|
2020-12-15 17:03:20 +08:00
|
|
|
$node = $router->search(Socket::MESSAGE . '::' . $route, 'sw::socket');
|
2020-12-15 14:04:02 +08:00
|
|
|
if ($node === null) {
|
|
|
|
|
throw new Exception('Page not found.');
|
|
|
|
|
}
|
|
|
|
|
return $node->dispatch();
|
2020-11-20 14:38:20 +08:00
|
|
|
}
|
|
|
|
|
|
2020-09-02 11:38:47 +08:00
|
|
|
}
|