From 8aeeb81e20f0a25d768d93393dd8ee95377796ab Mon Sep 17 00:00:00 2001 From: Francisco Madeira Date: Fri, 17 Sep 2021 06:53:54 +0100 Subject: [PATCH] Normalize all errors to BroadcastException and add capability to ignore exceptions --- .../Broadcasting/BroadcastEvent.php | 17 +++++++++++++---- .../Broadcasters/AblyBroadcaster.php | 13 +++++++++++-- .../Broadcasters/RedisBroadcaster.php | 19 +++++++++++++++---- .../Contracts/Broadcasting/Broadcaster.php | 2 ++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/Illuminate/Broadcasting/BroadcastEvent.php b/src/Illuminate/Broadcasting/BroadcastEvent.php index 24a1c3367613..a09edc8ac978 100644 --- a/src/Illuminate/Broadcasting/BroadcastEvent.php +++ b/src/Illuminate/Broadcasting/BroadcastEvent.php @@ -4,6 +4,7 @@ use Illuminate\Bus\Queueable; use Illuminate\Contracts\Broadcasting\Factory as BroadcastingFactory; +use Illuminate\Broadcasting\BroadcastException; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Arr; @@ -72,10 +73,18 @@ public function handle(BroadcastingFactory $manager) $payload = $this->getPayloadFromEvent($this->event); - foreach ($connections as $connection) { - $manager->connection($connection)->broadcast( - $channels, $name, $payload - ); + try { + foreach ($connections as $connection) { + $manager->connection($connection)->broadcast( + $channels, $name, $payload + ); + } + } catch (BroadcastException $e) { + if ($manager->getApplication()['config']['broadcasting.ignore_exceptions'] ?? false) { + return; + } + + throw $e; } } diff --git a/src/Illuminate/Broadcasting/Broadcasters/AblyBroadcaster.php b/src/Illuminate/Broadcasting/Broadcasters/AblyBroadcaster.php index 426aa747b9b3..a9a2573cff5a 100644 --- a/src/Illuminate/Broadcasting/Broadcasters/AblyBroadcaster.php +++ b/src/Illuminate/Broadcasting/Broadcasters/AblyBroadcaster.php @@ -3,6 +3,7 @@ namespace Illuminate\Broadcasting\Broadcasters; use Ably\AblyRest; +use Ably\Exceptions\AblyException; use Illuminate\Support\Str; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -117,11 +118,19 @@ public function generateAblySignature($channelName, $socketId, $userData = null) * @param string $event * @param array $payload * @return void + * + * @throws \Illuminate\Broadcasting\BroadcastException */ public function broadcast(array $channels, $event, array $payload = []) { - foreach ($this->formatChannels($channels) as $channel) { - $this->ably->channels->get($channel)->publish($event, $payload); + try { + foreach ($this->formatChannels($channels) as $channel) { + $this->ably->channels->get($channel)->publish($event, $payload); + } + } catch (AblyException $e) { + throw new BrodcastException( + sprintf('Ably error: %s', $e->getMessage()) + ) } } diff --git a/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php b/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php index 2c2dc88c3f76..5ae2e03c8f44 100644 --- a/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php +++ b/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php @@ -2,8 +2,11 @@ namespace Illuminate\Broadcasting\Broadcasters; +use Illuminate\Broadcasting\BroadcastException; use Illuminate\Contracts\Redis\Factory as Redis; use Illuminate\Support\Arr; +use Predis\Connection\ConnectionException; +use RedisException; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; class RedisBroadcaster extends Broadcaster @@ -105,6 +108,8 @@ public function validAuthenticationResponse($request, $result) * @param string $event * @param array $payload * @return void + * + * @throws \Illuminate\Broadcasting\BroadcastException */ public function broadcast(array $channels, $event, array $payload = []) { @@ -120,10 +125,16 @@ public function broadcast(array $channels, $event, array $payload = []) 'socket' => Arr::pull($payload, 'socket'), ]); - $connection->eval( - $this->broadcastMultipleChannelsScript(), - 0, $payload, ...$this->formatChannels($channels) - ); + try { + $connection->eval( + $this->broadcastMultipleChannelsScript(), + 0, $payload, ...$this->formatChannels($channels) + ); + } catch (ConnectionException|RedisException $e) { + throw new BroadcastException( + sprintf('Redis error: %s.', $e->getMessage()) + ); + } } /** diff --git a/src/Illuminate/Contracts/Broadcasting/Broadcaster.php b/src/Illuminate/Contracts/Broadcasting/Broadcaster.php index 1034e4406823..2d317d0a69c3 100644 --- a/src/Illuminate/Contracts/Broadcasting/Broadcaster.php +++ b/src/Illuminate/Contracts/Broadcasting/Broadcaster.php @@ -28,6 +28,8 @@ public function validAuthenticationResponse($request, $result); * @param string $event * @param array $payload * @return void + * + * @throws \Illuminate\Broadcasting\BroadcastException */ public function broadcast(array $channels, $event, array $payload = []); }