This commit is contained in:
freek 2018-11-21 22:11:44 +01:00
parent d6b6182c39
commit 0b8e09e39e
4 changed files with 46 additions and 13 deletions

View File

@ -7,9 +7,8 @@ use Illuminate\Http\Request;
class EventController extends EchoController class EventController extends EchoController
{ {
/** @var ChannelManager */ /** @var ChannelManager */
private $channelManager; protected $channelManager;
public function __construct(ChannelManager $channelManager) public function __construct(ChannelManager $channelManager)
{ {
@ -18,8 +17,19 @@ class EventController extends EchoController
public function __invoke(Request $request) public function __invoke(Request $request)
{ {
//TODO: verify the incoming request
/*
* array:6 [
"appId" => "test"
"auth_key" => ""
"auth_signature" => "51e7ab9c1411aacf9a4c28001ffc3e7f5fe71db130ce08ac071ab49d737bcf52"
"auth_timestamp" => "1542833998"
"auth_version" => "1.0"
"body_md5" => "816e28da10f4aedf0821865eddf55e7f"
]
*/
foreach ($request->json()->get('channels', []) as $channelId) { foreach ($request->json()->get('channels', []) as $channelId) {
$channel = $this->channelManager->find($channelId); $channel = $this->channelManager->find($request->appId, $channelId);
$channel->broadcast([ $channel->broadcast([
'channel' => $channelId, 'channel' => $channelId,

View File

@ -7,12 +7,13 @@ use Ratchet\ConnectionInterface;
class Channel class Channel
{ {
/** @var string */
protected $channelId; protected $channelId;
/** @var ConnectionInterface[] */ /** @var ConnectionInterface[] */
protected $connections = []; protected $connections = [];
public function __construct($channelId) public function __construct(string $channelId)
{ {
$this->channelId = $channelId; $this->channelId = $channelId;
} }

View File

@ -5,28 +5,39 @@ namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels;
class ChannelManager class ChannelManager
{ {
/** @var array */
protected $channels = []; protected $channels = [];
public function findOrCreate(string $channelId): Channel /** @var string */
protected $appId;
public function findOrCreate(string $appId, string $channelId): Channel
{ {
if (! isset($this->channels[$channelId])) {
if (! isset($this->channels[$appId][$channelId])) {
/**TODO: make this variable to go away */
$channelClass = $this->detectChannelClass($channelId); $channelClass = $this->detectChannelClass($channelId);
$this->channels[$channelId] = new $channelClass($channelId);
array_set($this->channels, "{$appId}.{$channelId}", new $channelClass($channelId));
} }
return $this->channels[$channelId]; return $this->channels[$appId][$channelId];
} }
public function find(string $channelId) public function find(string $appId, string $channelId)
{ {
return $this->channels[$channelId] ?? null; return $this->channels[$appId][$channelId] ?? null;
} }
protected function detectChannelClass($channelId) : string protected function detectChannelClass($channelId) : string
{ {
if (starts_with($channelId, 'private-')) { if (starts_with($channelId, 'private-')) {
return PrivateChannel::class; return PrivateChannel::class;
} elseif(starts_with($channelId, 'presence-')) { }
if(starts_with($channelId, 'presence-')) {
return PresenceChannel::class; return PresenceChannel::class;
} }
return Channel::class; return Channel::class;

View File

@ -24,6 +24,7 @@ class EchoServer extends WebSocketController
*/ */
function onOpen(ConnectionInterface $conn) function onOpen(ConnectionInterface $conn)
{ {
dump("Client connected"); dump("Client connected");
/** /**
* There are a couple things we need to do here: * There are a couple things we need to do here:
@ -35,6 +36,14 @@ class EchoServer extends WebSocketController
// Store the socketId along with the connection so we can retrieve it. // Store the socketId along with the connection so we can retrieve it.
$conn->socketId = $socketId; $conn->socketId = $socketId;
/** @var \GuzzleHttp\Psr7\Request $request */
$request = $conn->httpRequest;
$queryParameters = [];
parse_str($request->getUri()->getQuery(), $queryParameters);
$conn->appId = $queryParameters['appId'];
$conn->send($this->buildPayload('pusher:connection_established', [ $conn->send($this->buildPayload('pusher:connection_established', [
'socket_id' => $socketId, 'socket_id' => $socketId,
'activity_timeout' => 60, 'activity_timeout' => 60,
@ -58,7 +67,8 @@ class EchoServer extends WebSocketController
} }
} else { } else {
// Try to find a channel and broadcast the message to the clients. // Try to find a channel and broadcast the message to the clients.
$channel = $this->channelManager->find($payload->channel); $channel = $this->channelManager->find($conn->appId, $payload->channel);
if ($channel) { if ($channel) {
$channel->broadcast($payload); $channel->broadcast($payload);
} }
@ -82,7 +92,8 @@ class EchoServer extends WebSocketController
*/ */
protected function pusherSubscribe(ConnectionInterface $conn, $payload) protected function pusherSubscribe(ConnectionInterface $conn, $payload)
{ {
$channel = $this->channelManager->findOrCreate($payload->channel); $channel = $this->channelManager->findOrCreate($conn->appId, $payload->channel);
$channel->subscribe($conn, $payload); $channel->subscribe($conn, $payload);
} }