From 59aad530912f1f91d9a5252844c68b9c5bc11d6e Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Tue, 20 Nov 2018 11:51:00 +0100 Subject: [PATCH] wip --- composer.json | 1 + src/Console/StartWebSocketServer.php | 45 ++++++++++++ src/LaravelWebSocketsServiceProvider.php | 4 ++ src/Router.php | 24 ++++++- src/Server/WebSocketServer.php | 89 ++++++++++++++++++++++++ 5 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 src/Console/StartWebSocketServer.php create mode 100644 src/Server/WebSocketServer.php diff --git a/composer.json b/composer.json index 655ce7e..7ac9810 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "php": "^7.1", "cboden/ratchet": "^0.4.1", "illuminate/support": "5.6.*|5.7.*", + "illuminate/console": "5.6.*|5.7.*", "illuminate/http": "5.6.*|5.7.*", "illuminate/routing": "5.6.*|5.7.*" }, diff --git a/src/Console/StartWebSocketServer.php b/src/Console/StartWebSocketServer.php new file mode 100644 index 0000000..e90caad --- /dev/null +++ b/src/Console/StartWebSocketServer.php @@ -0,0 +1,45 @@ +futureTick(function () use ($url) { + $this->info('Started the WebSocket server on port '.$this->option('port')); + }); + + $server = new WebsocketServer($url['host'], $this->option('port'), '0.0.0.0', $loop); + $server->run(); + } +} \ No newline at end of file diff --git a/src/LaravelWebSocketsServiceProvider.php b/src/LaravelWebSocketsServiceProvider.php index 59949a6..ddfc4c9 100644 --- a/src/LaravelWebSocketsServiceProvider.php +++ b/src/LaravelWebSocketsServiceProvider.php @@ -16,6 +16,10 @@ class LaravelWebSocketsServiceProvider extends ServiceProvider LaravelRouter::macro('websocket', function($uri, $action) { WebSocketRouter::addRoute($uri, $action); }); + + $this->commands([ + Console\StartWebSocketServer::class, + ]); } /** diff --git a/src/Router.php b/src/Router.php index cd693c5..a09be89 100644 --- a/src/Router.php +++ b/src/Router.php @@ -2,6 +2,7 @@ namespace BeyondCode\LaravelWebSockets; +use Ratchet\WebSocket\WsServer; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; use BeyondCode\LaravelWebSockets\Exceptions\InvalidWebSocketController; @@ -18,15 +19,32 @@ class Router public function addRoute($uri, $action) { - if (! is_subclass_of($action, WebSocketController::class)) { + if (!is_subclass_of($action, WebSocketController::class)) { throw InvalidWebSocketController::withController($action); } $this->routes->add($uri, $this->getRoute($uri, $action)); } - protected function getRoute($uri, $action) : Route + protected function getRoute($uri, $action): Route { - return new Route($uri, ['_controller' => app($action)], [], [], null, [], ['GET']); + return new Route($uri, ['_controller' => $this->wrapController($action)], [], [], null, [], ['GET']); + } + + /** + * Wrap WebSocket controllers with Ratchets WsServer. + */ + protected function wrapController($controller) + { + if (is_subclass_of($controller, WebSocketController::class)) { + return new WsServer(app($controller)); + } + + return app($controller); + } + + public function getRoutes(): RouteCollection + { + return $this->routes; } } \ No newline at end of file diff --git a/src/Server/WebSocketServer.php b/src/Server/WebSocketServer.php new file mode 100644 index 0000000..53158be --- /dev/null +++ b/src/Server/WebSocketServer.php @@ -0,0 +1,89 @@ +httpHost = $httpHost; + $this->port = $port; + + $socket = new Reactor($address . ':' . $port, $loop); + + $this->_server = new IoServer(new HttpServer(new Router(new UrlMatcher(WebSocketRouter::getRoutes(), new RequestContext))), $socket, $loop); + + $policy = new FlashPolicy; + $policy->addAllowedAccess($httpHost, 80); + $policy->addAllowedAccess($httpHost, $port); + + if (80 == $port) { + $flashUri = '0.0.0.0:843'; + } else { + $flashUri = 8843; + } + $flashSock = new Reactor($flashUri, $loop); + $this->flashServer = new IoServer($policy, $flashSock); + } + + /** + * Run the server by entering the event loop + */ + public function run() { + $this->_server->run(); + } +}