laravel-websockets/src/LaravelEcho/Pusher/Channels/Channel.php

62 lines
1.6 KiB
PHP
Raw Normal View History

2018-11-21 11:13:40 +00:00
<?php
namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels;
2018-11-21 14:42:04 +00:00
use Illuminate\Support\Collection;
2018-11-21 11:13:40 +00:00
use Ratchet\ConnectionInterface;
class Channel
{
2018-11-21 21:11:44 +00:00
/** @var string */
2018-11-21 11:13:40 +00:00
protected $channelId;
2018-11-21 23:14:22 +00:00
/** @var \Ratchet\ConnectionInterface[] */
2018-11-21 14:42:04 +00:00
protected $connections = [];
2018-11-21 11:13:40 +00:00
2018-11-21 21:11:44 +00:00
public function __construct(string $channelId)
2018-11-21 11:13:40 +00:00
{
$this->channelId = $channelId;
}
2018-11-21 21:36:50 +00:00
public function hasConnections(): bool
{
return count($this->connections) > 0;
}
2018-11-21 23:14:22 +00:00
/*
2018-11-21 14:42:04 +00:00
* @link https://pusher.com/docs/pusher_protocol#presence-channel-events
*/
2018-11-22 08:30:11 +00:00
public function subscribe(ConnectionInterface $connection, $payload)
2018-11-21 11:13:40 +00:00
{
2018-11-21 23:03:13 +00:00
$this->saveConnection($connection);
2018-11-21 11:13:40 +00:00
2018-11-21 23:03:13 +00:00
$connection->send(json_encode([
2018-11-21 14:42:04 +00:00
'event' => 'pusher_internal:subscription_succeeded',
'channel' => $this->channelId
]));
}
2018-11-21 21:36:50 +00:00
public function unsubscribe(ConnectionInterface $connection)
{
unset($this->connections[$connection->socketId]);
}
2018-11-21 23:14:22 +00:00
protected function saveConnection(ConnectionInterface $connection)
2018-11-21 14:42:04 +00:00
{
2018-11-21 23:14:22 +00:00
$this->connections[$connection->socketId] = $connection;
2018-11-21 14:42:04 +00:00
}
public function broadcast($payload)
{
foreach ($this->connections as $connection) {
$connection->send(json_encode($payload));
}
}
2018-11-21 23:14:22 +00:00
public function broadcastToOthers(ConnectionInterface $connection, $payload)
2018-11-21 14:42:04 +00:00
{
2018-11-22 07:37:47 +00:00
Collection::make($this->connections)->reject(function ($existingConnection) use ($connection) {
return $existingConnection->socketId === $connection->socketId;
2018-11-21 14:42:04 +00:00
})->each->send(json_encode($payload));
2018-11-21 11:13:40 +00:00
}
}