From 84ef4ce14e9ff7e2dab738e8b8e9c9c31e549d88 Mon Sep 17 00:00:00 2001 From: Chaitali Sakhale Date: Thu, 13 Aug 2020 21:02:31 +0530 Subject: [PATCH 1/9] Breaking fix for composer update --- src/WebSocketsServiceProvider.php | 54 +++++++++++++++++++------------ 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index cf32f34..561f55c 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -13,6 +13,7 @@ use BeyondCode\LaravelWebSockets\Statistics\Http\Controllers\WebSocketStatistics use BeyondCode\LaravelWebSockets\Statistics\Http\Middleware\Authorize as AuthorizeStatistics; use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager; use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager; +use Illuminate\Database\QueryException; use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Schema; @@ -23,31 +24,38 @@ class WebSocketsServiceProvider extends ServiceProvider public function boot() { $this->publishes([ - __DIR__.'/../config/websockets.php' => base_path('config/websockets.php'), + __DIR__ . '/../config/websockets.php' => base_path('config/websockets.php'), ], 'config'); - if (! Schema::hasTable('websockets_statistics_entries')) { - $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'); + try { + if (!Schema::hasTable('websockets_statistics_entries')) { + $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, + Console\RestartWebSocketServer::class, + ]); + } catch (QueryException $e) { + // Exception raised by composer update + // Usually happens when doing on CI where no DB exists at start + // Either way if DB connection not obtained + // Catching and doing nothing is ignore for composer update } - - $this - ->registerRoutes() - ->registerDashboardGate(); - - $this->loadViewsFrom(__DIR__.'/../resources/views/', 'websockets'); - - $this->commands([ - Console\StartWebSocketServer::class, - Console\CleanStatistics::class, - Console\RestartWebSocketServer::class, - ]); } public function register() { - $this->mergeConfigFrom(__DIR__.'/../config/websockets.php', 'websockets'); + $this->mergeConfigFrom(__DIR__ . '/../config/websockets.php', 'websockets'); $this->app->singleton('websockets.router', function () { return new Router(); @@ -55,7 +63,7 @@ class WebSocketsServiceProvider extends ServiceProvider $this->app->singleton(ChannelManager::class, function () { return config('websockets.channel_manager') !== null && class_exists(config('websockets.channel_manager')) - ? app(config('websockets.channel_manager')) : new ArrayChannelManager(); + ? app(config('websockets.channel_manager')) : new ArrayChannelManager(); }); $this->app->singleton(AppProvider::class, function () { @@ -63,12 +71,15 @@ class WebSocketsServiceProvider extends ServiceProvider }); } + /** + * @return mixed + */ 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::get('/api/{appId}/statistics', [DashboardApiController::class, 'getStatistics']); Route::post('auth', AuthenticateDashboard::class); Route::post('event', SendMessage::class); }); @@ -81,6 +92,9 @@ class WebSocketsServiceProvider extends ServiceProvider return $this; } + /** + * @return mixed + */ protected function registerDashboardGate() { Gate::define('viewWebSocketsDashboard', function ($user = null) { From 94f24be3689ca6684630958bc0e25c4110ff79c6 Mon Sep 17 00:00:00 2001 From: Chaitali Sakhale Date: Thu, 13 Aug 2020 21:07:38 +0530 Subject: [PATCH 2/9] StyleCI fixed --- src/WebSocketsServiceProvider.php | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index 561f55c..6beb551 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -24,21 +24,21 @@ class WebSocketsServiceProvider extends ServiceProvider public function boot() { $this->publishes([ - __DIR__ . '/../config/websockets.php' => base_path('config/websockets.php'), + __DIR__.'/../config/websockets.php' => base_path('config/websockets.php'), ], 'config'); try { - if (!Schema::hasTable('websockets_statistics_entries')) { + if (! Schema::hasTable('websockets_statistics_entries')) { $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'); + __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(); + ->registerRoutes() + ->registerDashboardGate(); - $this->loadViewsFrom(__DIR__ . '/../resources/views/', 'websockets'); + $this->loadViewsFrom(__DIR__.'/../resources/views/', 'websockets'); $this->commands([ Console\StartWebSocketServer::class, @@ -55,7 +55,7 @@ class WebSocketsServiceProvider extends ServiceProvider public function register() { - $this->mergeConfigFrom(__DIR__ . '/../config/websockets.php', 'websockets'); + $this->mergeConfigFrom(__DIR__.'/../config/websockets.php', 'websockets'); $this->app->singleton('websockets.router', function () { return new Router(); @@ -63,7 +63,7 @@ class WebSocketsServiceProvider extends ServiceProvider $this->app->singleton(ChannelManager::class, function () { return config('websockets.channel_manager') !== null && class_exists(config('websockets.channel_manager')) - ? app(config('websockets.channel_manager')) : new ArrayChannelManager(); + ? app(config('websockets.channel_manager')) : new ArrayChannelManager(); }); $this->app->singleton(AppProvider::class, function () { @@ -71,15 +71,12 @@ class WebSocketsServiceProvider extends ServiceProvider }); } - /** - * @return mixed - */ 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::get('/api/{appId}/statistics', [DashboardApiController::class, 'getStatistics']); Route::post('auth', AuthenticateDashboard::class); Route::post('event', SendMessage::class); }); @@ -92,9 +89,6 @@ class WebSocketsServiceProvider extends ServiceProvider return $this; } - /** - * @return mixed - */ protected function registerDashboardGate() { Gate::define('viewWebSocketsDashboard', function ($user = null) { From d2feddd7a69179f16ebb93e6c9c29a6c77f11bf5 Mon Sep 17 00:00:00 2001 From: Chaitali Sakhale Date: Thu, 13 Aug 2020 21:09:14 +0530 Subject: [PATCH 3/9] StyleCI fixed again --- src/WebSocketsServiceProvider.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index 6beb551..3f5e9e8 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -30,8 +30,8 @@ class WebSocketsServiceProvider extends ServiceProvider try { if (! Schema::hasTable('websockets_statistics_entries')) { $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'); + __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 From 8b15897f63a763afb36030b0d5d7e8bdd77771eb Mon Sep 17 00:00:00 2001 From: Alex Renoki Date: Thu, 13 Aug 2020 19:17:06 +0300 Subject: [PATCH 4/9] Allow missing user_info on presence channels --- src/WebSockets/Channels/PresenceChannel.php | 7 ++++- tests/Channels/PresenceChannelTest.php | 29 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/WebSockets/Channels/PresenceChannel.php b/src/WebSockets/Channels/PresenceChannel.php index 9bbe1ec..479d365 100644 --- a/src/WebSockets/Channels/PresenceChannel.php +++ b/src/WebSockets/Channels/PresenceChannel.php @@ -86,12 +86,17 @@ class PresenceChannel extends Channel return array_values($userIds); } + /** + * Compute the hash for the presence channel integrity. + * + * @return array + */ protected function getHash(): array { $hash = []; foreach ($this->users as $socketId => $channelData) { - $hash[$channelData->user_id] = $channelData->user_info; + $hash[$channelData->user_id] = $channelData->user_info ?? []; } return $hash; diff --git a/tests/Channels/PresenceChannelTest.php b/tests/Channels/PresenceChannelTest.php index c2ae4a4..1749c13 100644 --- a/tests/Channels/PresenceChannelTest.php +++ b/tests/Channels/PresenceChannelTest.php @@ -59,4 +59,33 @@ class PresenceChannelTest extends TestCase 'channel' => 'presence-channel', ]); } + + /** @test */ + public function clients_with_no_user_info_can_join_presence_channels() + { + $connection = $this->getWebSocketConnection(); + + $this->pusherServer->onOpen($connection); + + $channelData = [ + 'user_id' => 1, + ]; + + $signature = "{$connection->socketId}:presence-channel:".json_encode($channelData); + + $message = new Message(json_encode([ + 'event' => 'pusher:subscribe', + 'data' => [ + 'auth' => $connection->app->key.':'.hash_hmac('sha256', $signature, $connection->app->secret), + 'channel' => 'presence-channel', + 'channel_data' => json_encode($channelData), + ], + ])); + + $this->pusherServer->onMessage($connection, $message); + + $connection->assertSentEvent('pusher_internal:subscription_succeeded', [ + 'channel' => 'presence-channel', + ]); + } } From aced9114ccb236ea4aa4886c59139be6a6ed996c Mon Sep 17 00:00:00 2001 From: Chaitali Sakhale Date: Thu, 13 Aug 2020 21:58:57 +0530 Subject: [PATCH 5/9] Force migration to a fixed path --- src/WebSocketsServiceProvider.php | 35 +++++++++++-------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index 3f5e9e8..a27739f 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -13,10 +13,8 @@ use BeyondCode\LaravelWebSockets\Statistics\Http\Controllers\WebSocketStatistics use BeyondCode\LaravelWebSockets\Statistics\Http\Middleware\Authorize as AuthorizeStatistics; use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager; use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager; -use Illuminate\Database\QueryException; use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Route; -use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; class WebSocketsServiceProvider extends ServiceProvider @@ -27,30 +25,21 @@ class WebSocketsServiceProvider extends ServiceProvider __DIR__.'/../config/websockets.php' => base_path('config/websockets.php'), ], 'config'); - try { - if (! Schema::hasTable('websockets_statistics_entries')) { - $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->publishes([ + __DIR__.'/../database/migrations/create_websockets_statistics_entries_table.php.stub' => database_path('migrations/'.'000000_create_websockets_statistics_entries_table.php'), + ], 'migrations'); - $this - ->registerRoutes() - ->registerDashboardGate(); + $this + ->registerRoutes() + ->registerDashboardGate(); - $this->loadViewsFrom(__DIR__.'/../resources/views/', 'websockets'); + $this->loadViewsFrom(__DIR__.'/../resources/views/', 'websockets'); - $this->commands([ - Console\StartWebSocketServer::class, - Console\CleanStatistics::class, - Console\RestartWebSocketServer::class, - ]); - } catch (QueryException $e) { - // Exception raised by composer update - // Usually happens when doing on CI where no DB exists at start - // Either way if DB connection not obtained - // Catching and doing nothing is ignore for composer update - } + $this->commands([ + Console\StartWebSocketServer::class, + Console\CleanStatistics::class, + Console\RestartWebSocketServer::class, + ]); } public function register() From a18ef0c6c6f5856f019e7a9f18d36a1e9fa1942e Mon Sep 17 00:00:00 2001 From: rennokki Date: Thu, 13 Aug 2020 19:35:37 +0300 Subject: [PATCH 6/9] wip naming --- src/WebSocketsServiceProvider.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index a27739f..4deacef 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -26,12 +26,12 @@ class WebSocketsServiceProvider extends ServiceProvider ], 'config'); $this->publishes([ - __DIR__.'/../database/migrations/create_websockets_statistics_entries_table.php.stub' => database_path('migrations/'.'000000_create_websockets_statistics_entries_table.php'), + __DIR__.'/../database/migrations/create_websockets_statistics_entries_table.php.stub' => database_path('migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php'), ], 'migrations'); $this - ->registerRoutes() - ->registerDashboardGate(); + ->registerRoutes() + ->registerDashboardGate(); $this->loadViewsFrom(__DIR__.'/../resources/views/', 'websockets'); From 65ae998aed4496b9b3658915636b23a65724b67a Mon Sep 17 00:00:00 2001 From: Alex Renoki Date: Thu, 13 Aug 2020 19:51:09 +0300 Subject: [PATCH 7/9] Renamed the migration file on publish & loadMigrationsFrom() --- ...0_000000_create_websockets_statistics_entries_table.php} | 0 src/WebSocketsServiceProvider.php | 2 +- tests/TestCase.php | 6 ++---- 3 files changed, 3 insertions(+), 5 deletions(-) rename database/migrations/{create_websockets_statistics_entries_table.php.stub => 0000_00_00_000000_create_websockets_statistics_entries_table.php} (100%) diff --git a/database/migrations/create_websockets_statistics_entries_table.php.stub b/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php similarity index 100% rename from database/migrations/create_websockets_statistics_entries_table.php.stub rename to database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php diff --git a/src/WebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php index 4deacef..1e30ed3 100644 --- a/src/WebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -26,7 +26,7 @@ class WebSocketsServiceProvider extends ServiceProvider ], 'config'); $this->publishes([ - __DIR__.'/../database/migrations/create_websockets_statistics_entries_table.php.stub' => database_path('migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php'), + __DIR__.'/../database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php' => database_path('migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php'), ], 'migrations'); $this diff --git a/tests/TestCase.php b/tests/TestCase.php index e4b4023..c52e83b 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -34,6 +34,8 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase $this->channelManager, Mockery::mock(Browser::class) )); + + $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); } protected function getPackageProviders($app) @@ -54,10 +56,6 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase 'enable_statistics' => true, ], ]); - - include_once __DIR__.'/../database/migrations/create_websockets_statistics_entries_table.php.stub'; - - (new \CreateWebSocketsStatisticsEntriesTable())->up(); } protected function getWebSocketConnection(string $url = '/?appKey=TestKey'): Connection From f5a11acf6de432c58df629d8e4d3b386e4965aaa Mon Sep 17 00:00:00 2001 From: rennokki Date: Thu, 13 Aug 2020 19:51:31 +0300 Subject: [PATCH 8/9] Apply fixes from StyleCI (#458) --- ..._00_000000_create_websockets_statistics_entries_table.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php b/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php index b56e525..879ed9a 100644 --- a/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php +++ b/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php @@ -1,8 +1,8 @@ nullableTimestamps(); }); } + /** * Reverse the migrations. */ From 1f7cbebbe65cce7e01b25acbce6445ead0f675ec Mon Sep 17 00:00:00 2001 From: Alex Renoki Date: Thu, 13 Aug 2020 19:54:39 +0300 Subject: [PATCH 9/9] csfixing --- ...000000_create_websockets_statistics_entries_table.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php b/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php index b56e525..1b89b4a 100644 --- a/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php +++ b/database/migrations/0000_00_00_000000_create_websockets_statistics_entries_table.php @@ -1,13 +1,15 @@ nullableTimestamps(); }); } + /** * Reverse the migrations. + * + * @return void */ public function down() {