routes = new RouteCollection; } public function getRoutes(): RouteCollection { return $this->routes; } public function websocket(string $uri, $action) { if (!is_subclass_of($action, MessageComponentInterface::class)) { throw InvalidWebSocketController::withController($action); } $this->get($uri, $action); } public function get(string $uri, $action) { $this->addRoute('GET', $uri, $action); } public function post(string $uri, $action) { $this->addRoute('POST', $uri, $action); } public function put(string $uri, $action) { $this->addRoute('PUT', $uri, $action); } public function patch(string $uri, $action) { $this->addRoute('PATCH', $uri, $action); } public function delete(string $uri, $action) { $this->addRoute('DELETE', $uri, $action); } public function addRoute(string $method, string $uri, $action) { $this->routes->add($uri, $this->getRoute($method, $uri, $action)); } protected function getRoute(string $method, string $uri, $action): Route { return new Route($uri, ['_controller' => $this->wrapAction($action)], [], [], null, [], [$method]); } public function echo() { $this->get('/app/{appKey}', WebSocketHandler::class); $this->get('/apps/{appId}/channels', FetchChannelsController::class); $this->get('/apps/{appId}/channels/{channelName}', FetchChannelController::class); $this->get('/apps/{appId}/channels/{channelName}/users', FetchUsersController::class); $this->post('/apps/{appId}/events', TriggerEventController::class); } /** * @param string $action * * @return \Ratchet\WebSocket\WsServer|\Ratchet\Http\HttpServerInterface */ protected function wrapAction(string $action) { if (is_subclass_of($action, MessageComponentInterface::class)) { return $this->createWebSocketsServer($action); } return app($action); } protected function createWebSocketsServer(MessageComponentInterface $action): WsServer { $app = app($action); if (MessageLogger::isEnabled()) { $app = MessageLogger::decorate($app); } return new WsServer($app); } }