publishes([ __DIR__.'/../config/websockets.php' => base_path('config/websockets.php'), ], 'config'); if (! class_exists('CreateWebSocketsStatisticsEntries')) { $this->publishes([ __DIR__.'/../database/migrations/create_websockets_statistics_entries_table.php.stub' => database_path('migrations/'.date('Y_m_d_His', time()).'_create_websockets_statistics_entries_table.php'), ], 'migrations'); } $this ->registerRoutes() ->registerDashboardGate(); $this->loadViewsFrom(__DIR__.'/../resources/views/', 'websockets'); $this->commands([ Console\StartWebSocketServer::class, Console\CleanStatistics::class, ]); $this->configurePubSub(); } protected function configurePubSub() { if (config('websockets.replication.enabled') !== true || config('websockets.replication.driver') !== 'redis') { $this->app->singleton(ReplicationInterface::class, function () { return new LocalClient(); }); return; } $this->app->singleton(ReplicationInterface::class, function () { return (new RedisClient())->boot($this->loop); }); $this->app->get(BroadcastManager::class)->extend('redis-pusher', function ($app, array $config) { $pusher = new Pusher( $config['key'], $config['secret'], $config['app_id'], $config['options'] ?? [] ); if ($config['log'] ?? false) { $pusher->setLogger($this->app->make(LoggerInterface::class)); } return new RedisPusherBroadcaster( $pusher, $config['app_id'], $this->app->make('redis'), $config['connection'] ?? null ); }); } public function register() { $this->mergeConfigFrom(__DIR__.'/../config/websockets.php', 'websockets'); $this->app->singleton('websockets.router', function () { return new Router(); }); $this->app->singleton(ChannelManager::class, function () { return config('websockets.channel_manager') !== null && class_exists(config('websockets.channel_manager')) ? $this->app->make(config('websockets.channel_manager')) : new ArrayChannelManager(); }); $this->app->singleton(AppProvider::class, function () { return $this->app->make(config('websockets.app_provider')); }); } protected function registerRoutes() { Route::prefix(config('websockets.path'))->group(function () { Route::middleware(config('websockets.middleware', [AuthorizeDashboard::class]))->group(function () { Route::get('/', ShowDashboard::class); Route::get('/api/{appId}/statistics', [DashboardApiController::class, 'getStatistics']); Route::post('auth', AuthenticateDashboard::class); Route::post('event', SendMessage::class); }); Route::middleware(AuthorizeStatistics::class)->group(function () { Route::post('statistics', [WebSocketStatisticsEntriesController::class, 'store']); }); }); return $this; } protected function registerDashboardGate() { Gate::define('viewWebSocketsDashboard', function ($user = null) { return $this->app->environment('local'); }); return $this; } }