From 091513236972c27c91b9675fc86352318690be35 Mon Sep 17 00:00:00 2001 From: zaxxo-dkraemer Date: Wed, 6 Nov 2019 09:25:55 +0100 Subject: [PATCH] Add restart command for WebSocket server --- src/Console/RestartWebSocketServer.php | 23 +++++++++++++++++++ src/Console/StartWebSocketServer.php | 23 +++++++++++++++++++ src/WebSocketsServiceProvider.php | 1 + tests/Commands/RestartWebSocketServerTest.php | 23 +++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 src/Console/RestartWebSocketServer.php create mode 100644 tests/Commands/RestartWebSocketServerTest.php diff --git a/src/Console/RestartWebSocketServer.php b/src/Console/RestartWebSocketServer.php new file mode 100644 index 0000000000..26d240cb76 --- /dev/null +++ b/src/Console/RestartWebSocketServer.php @@ -0,0 +1,23 @@ +currentTime()); + + $this->info('Broadcasting WebSocket server restart signal.'); + } +} diff --git a/src/Console/StartWebSocketServer.php b/src/Console/StartWebSocketServer.php index e68767c986..e08e736b65 100644 --- a/src/Console/StartWebSocketServer.php +++ b/src/Console/StartWebSocketServer.php @@ -14,6 +14,7 @@ use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager; use Clue\React\Buzz\Browser; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Cache; use React\Dns\Config\Config as DnsConfig; use React\Dns\Resolver\Factory as DnsFactory; use React\Dns\Resolver\ResolverInterface; @@ -29,6 +30,9 @@ class StartWebSocketServer extends Command /** @var \React\EventLoop\LoopInterface */ protected $loop; + /** @var int */ + protected $lastRestart; + public function __construct() { parent::__construct(); @@ -43,6 +47,7 @@ public function handle() ->configureHttpLogger() ->configureMessageLogger() ->configureConnectionLogger() + ->configureRestartTimer() ->registerEchoRoutes() ->registerCustomRoutes() ->startWebSocketServer(); @@ -104,6 +109,19 @@ protected function configureConnectionLogger() return $this; } + public function configureRestartTimer() + { + $this->lastRestart = $this->getLastRestart(); + + $this->loop->addPeriodicTimer(10, function () { + if ($this->getLastRestart() !== $this->lastRestart) { + $this->loop->stop(); + } + }); + + return $this; + } + protected function registerEchoRoutes() { WebSocketsRouter::echo(); @@ -150,4 +168,9 @@ protected function getDnsResolver(): ResolverInterface $this->loop ); } + + protected function getLastRestart() + { + return Cache::get('beyondcode:websockets:restart', 0); + } } diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index a9a7ff942e..cf32f3440b 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -41,6 +41,7 @@ public function boot() $this->commands([ Console\StartWebSocketServer::class, Console\CleanStatistics::class, + Console\RestartWebSocketServer::class, ]); } diff --git a/tests/Commands/RestartWebSocketServerTest.php b/tests/Commands/RestartWebSocketServerTest.php new file mode 100644 index 0000000000..e80748aaa8 --- /dev/null +++ b/tests/Commands/RestartWebSocketServerTest.php @@ -0,0 +1,23 @@ +currentTime(); + + Artisan::call('websockets:restart'); + + $this->assertGreaterThanOrEqual($start, Cache::get('beyondcode:websockets:restart', 0)); + } +}