<?php namespace Common\Websockets\API; use Exception; use Illuminate\Support\Collection; class WebsocketAPI { protected array $resolvedProviders = []; public function __construct(protected array $options = []) { } /** * @return Collection<int, array> */ public function getActiveUsersInChannel(string $channel): Collection { return $this->resolveProvider() ->getActiveUsersInChannel($channel) ->map(function (array $item) { $maybeEncodedId = (string) $item['id']; [$modelType, $id] = explode('.', $maybeEncodedId, 2); return [ 'id' => (int) $id, 'modelType' => $modelType, ]; }) ->unique('id'); } public function getAllChannels(): Collection { return $this->resolveProvider()->getAllChannels(); } protected function resolveProvider(): WebsocketProviderAPI { $providerName = config('broadcasting.default'); if (isset($this->resolvedProviders[$providerName])) { return $this->resolvedProviders[$providerName]; } return $this->resolvedProviders[$providerName] = match ($providerName) { 'reverb' => new ReverbAPI($this->options), 'pusher' => new PusherAPI($this->options), 'ably' => new AblyAPI($this->options), default => throw new Exception('Unsupported websocket provider'), }; } }