Fix connection counting (#74)
* Fix connection counting * Remove unused method from FakeStatisticsLogger * Add tests for testing the connection counting * StyleCI fixes * Do not use Laravel 5.7.10 testing helper * CS
This commit is contained in:
parent
d2146f7977
commit
5e84ef1ddc
|
|
@ -3,7 +3,6 @@
|
||||||
namespace BeyondCode\LaravelWebSockets\Facades;
|
namespace BeyondCode\LaravelWebSockets\Facades;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Facade;
|
use Illuminate\Support\Facades\Facade;
|
||||||
use BeyondCode\LaravelWebSockets\Statistics\Logger\FakeStatisticsLogger;
|
|
||||||
use BeyondCode\LaravelWebSockets\Statistics\Logger\StatisticsLogger as StatisticsLoggerInterface;
|
use BeyondCode\LaravelWebSockets\Statistics\Logger\StatisticsLogger as StatisticsLoggerInterface;
|
||||||
|
|
||||||
/** @see \BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger */
|
/** @see \BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger */
|
||||||
|
|
@ -13,9 +12,4 @@ class StatisticsLogger extends Facade
|
||||||
{
|
{
|
||||||
return StatisticsLoggerInterface::class;
|
return StatisticsLoggerInterface::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function fake()
|
|
||||||
{
|
|
||||||
static::swap(new FakeStatisticsLogger());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace BeyondCode\LaravelWebSockets\Statistics\Logger;
|
|
||||||
|
|
||||||
use Ratchet\ConnectionInterface;
|
|
||||||
|
|
||||||
class FakeStatisticsLogger implements StatisticsLogger
|
|
||||||
{
|
|
||||||
public function webSocketMessage(ConnectionInterface $connection)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function apiMessage($appId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function connection(ConnectionInterface $connection)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function disconnection(ConnectionInterface $connection)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function initializeStatistics($id)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function save()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -55,9 +55,11 @@ class ArrayChannelManager implements ChannelManager
|
||||||
public function getConnectionCount(string $appId): int
|
public function getConnectionCount(string $appId): int
|
||||||
{
|
{
|
||||||
return collect($this->getChannels($appId))
|
return collect($this->getChannels($appId))
|
||||||
->sum(function ($channel) {
|
->flatMap(function (Channel $channel) {
|
||||||
return count($channel->getSubscribedConnections());
|
return collect($channel->getSubscribedConnections())->pluck('socketId');
|
||||||
});
|
})
|
||||||
|
->unique()
|
||||||
|
->count();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function removeFromAllChannels(ConnectionInterface $connection)
|
public function removeFromAllChannels(ConnectionInterface $connection)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeyondCode\LaravelWebSockets\Tests\Statistics\Logger;
|
||||||
|
|
||||||
|
use BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger;
|
||||||
|
|
||||||
|
class FakeStatisticsLogger extends HttpStatisticsLogger
|
||||||
|
{
|
||||||
|
public function save()
|
||||||
|
{
|
||||||
|
foreach ($this->statistics as $appId => $statistic) {
|
||||||
|
$currentConnectionCount = $this->channelManager->getConnectionCount($appId);
|
||||||
|
$statistic->reset($currentConnectionCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getForAppId($appId): array
|
||||||
|
{
|
||||||
|
$statistic = $this->findOrMakeStatisticForAppId($appId);
|
||||||
|
|
||||||
|
return $statistic->toArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeyondCode\LaravelWebSockets\Tests\Statistics\Controllers;
|
||||||
|
|
||||||
|
use BeyondCode\LaravelWebSockets\Tests\TestCase;
|
||||||
|
use BeyondCode\LaravelWebSockets\Facades\StatisticsLogger;
|
||||||
|
|
||||||
|
class StatisticsLoggerTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @test */
|
||||||
|
public function it_counts_connections()
|
||||||
|
{
|
||||||
|
$connections = [];
|
||||||
|
|
||||||
|
$connections[] = $this->getConnectedWebSocketConnection(['channel-1']);
|
||||||
|
$connections[] = $this->getConnectedWebSocketConnection(['channel-1']);
|
||||||
|
$connections[] = $this->getConnectedWebSocketConnection(['channel-1']);
|
||||||
|
|
||||||
|
$this->assertEquals(3, StatisticsLogger::getForAppId(1234)['peak_connection_count']);
|
||||||
|
|
||||||
|
$this->pusherServer->onClose(array_pop($connections));
|
||||||
|
|
||||||
|
StatisticsLogger::save();
|
||||||
|
|
||||||
|
$this->assertEquals(2, StatisticsLogger::getForAppId(1234)['peak_connection_count']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function it_counts_unique_connections_no_channel_subscriptions()
|
||||||
|
{
|
||||||
|
$connections = [];
|
||||||
|
|
||||||
|
$connections[] = $this->getConnectedWebSocketConnection(['channel-1', 'channel-2']);
|
||||||
|
$connections[] = $this->getConnectedWebSocketConnection(['channel-1', 'channel-2']);
|
||||||
|
$connections[] = $this->getConnectedWebSocketConnection(['channel-1']);
|
||||||
|
|
||||||
|
$this->assertEquals(3, StatisticsLogger::getForAppId(1234)['peak_connection_count']);
|
||||||
|
|
||||||
|
$this->pusherServer->onClose(array_pop($connections));
|
||||||
|
$this->pusherServer->onClose(array_pop($connections));
|
||||||
|
|
||||||
|
StatisticsLogger::save();
|
||||||
|
|
||||||
|
$this->assertEquals(1, StatisticsLogger::getForAppId(1234)['peak_connection_count']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace BeyondCode\LaravelWebSockets\Tests;
|
namespace BeyondCode\LaravelWebSockets\Tests;
|
||||||
|
|
||||||
|
use Mockery;
|
||||||
|
use Clue\React\Buzz\Browser;
|
||||||
use GuzzleHttp\Psr7\Request;
|
use GuzzleHttp\Psr7\Request;
|
||||||
use Ratchet\ConnectionInterface;
|
use Ratchet\ConnectionInterface;
|
||||||
use BeyondCode\LaravelWebSockets\Tests\Mocks\Message;
|
use BeyondCode\LaravelWebSockets\Tests\Mocks\Message;
|
||||||
|
|
@ -10,6 +12,7 @@ use BeyondCode\LaravelWebSockets\Facades\StatisticsLogger;
|
||||||
use BeyondCode\LaravelWebSockets\WebSocketsServiceProvider;
|
use BeyondCode\LaravelWebSockets\WebSocketsServiceProvider;
|
||||||
use BeyondCode\LaravelWebSockets\WebSockets\WebSocketHandler;
|
use BeyondCode\LaravelWebSockets\WebSockets\WebSocketHandler;
|
||||||
use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager;
|
use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager;
|
||||||
|
use BeyondCode\LaravelWebSockets\Tests\Statistics\Logger\FakeStatisticsLogger;
|
||||||
|
|
||||||
abstract class TestCase extends \Orchestra\Testbench\TestCase
|
abstract class TestCase extends \Orchestra\Testbench\TestCase
|
||||||
{
|
{
|
||||||
|
|
@ -27,7 +30,10 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase
|
||||||
|
|
||||||
$this->channelManager = app(ChannelManager::class);
|
$this->channelManager = app(ChannelManager::class);
|
||||||
|
|
||||||
StatisticsLogger::fake();
|
StatisticsLogger::swap(new FakeStatisticsLogger(
|
||||||
|
$this->channelManager,
|
||||||
|
Mockery::mock(Browser::class)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getPackageProviders($app)
|
protected function getPackageProviders($app)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue