Как сделать URL доступным для регистрации в общедоступном канале с помощью laravel-websockets? - PullRequest
0 голосов
/ 17 мая 2019

Как заставить URL любого пользователя слушать канал веб-сокета, например wss://stream.exemplo.com:9443/ws/channel@event?

Я использую пакет beyondcode / laravel-websockets и могу использовать каналы, обычно следующие за документами, но только с библиотекой javascript, такой как echo. Мои сомнения не в протоколе и не в том, как его слушать с помощью Echo, а в том, как сделать часть /channel@event общедоступной для любого, кто начнет слушать ее на веб-сайте, подобном https://websocket.org/echo.html, без какого-либо аутентификации.

Я вижу в их коде и в сгенерированных журналах, что им всегда требуется идентификатор приложения (поскольку пакет является многопользовательским).

FetchChannelController находит канал по appId и channelName

class FetchChannelController extends Controller
{
    public function __invoke(Request $request)
    {
        $channel = $this->channelManager->find($request->appId, $request->channelName);

        if (is_null($channel)) {
            throw new HttpException(404, "Unknown channel `{$request->channelName}`.");
        }

        return $channel->toArray();
    }
}
public function find(string $appId, string $channelName): ?Channel
{
    return $this->channels[$appId][$channelName] ?? null;
}

public function getChannels(string $appId): array
{
    return $this->channels[$appId] ?? [];
}

Но я ожидаю, что любой пользователь, не имеющий ничего, кроме channel @ event, сможет подписаться на канал в виде, подобном https://websocket.org/echo.html

[EDIT]

Я ожидаю способ сделать конечную точку, которую веб-сайт https://websocket.org/echo.html сможет прослушать. У меня сотни событий транслировались на канал "новости" например. Так как (используя конечную точку, а не имя канала в библиотеке JavaScript) https://websocket.org/echo.html начнет слушать этот канал? Без знания какого-либо приложения laravel-websockets, только с именем канала.

1 Ответ

0 голосов
/ 17 мая 2019

Одна вещь - это канал id, а другая - пользователь id. Идентификаторы каналов и приложений будут использоваться Laravel-Websockets для идентификации того, какое приложение и канал сервер будет отправлять / прослушивать. Идентификатор пользователя полезен для проверки того, определен ли пользователь для доступа к защищенному (частному) каналу.

Если вы хотите прослушать каждое событие, создайте общий канал, а затем на своем веб-сайте подпишитесь на этот общедоступный общий канал, чтобы прослушивать желаемые события, запущенные на этом общем канале.


Обновление

Учитывая ваши фактические требования

Как я уже сказал в своем комментарии, вы можете управлять строкой URL, чтобы вставить ее в Laravel Echo (или в вашу интерфейсную библиотеку WS), чтобы она прослушивала ваши события. Учитывая конечную точку как это:

WSS: //stream.exemplo.com: 9443 / WS / канал @ событие

Вы могли бы:

$string = 'wss://stream.exemplo.com:9443/ws/channel@event';
$segments = explode('/', $string);
/** ['wss:', '', 'stream.exemplo.com:9443', 'ws', 'channel@event'] */

$url = explode(':', $segments[2]);
/** ['stream.exemplo.com', '9443'] */

$event_data = explode('@', $segments[4]);
/** ['channel', 'event'] */

Таким образом, у вас есть все для подключения к вашей интерфейсной библиотеке (appId, кроме того, как вы сказали, что вы справитесь с этим на своем конце):

$wsHost = $url[0];  // 'stream.exemplo.com'
$wsPort = $url[1];  // '9443'
$channel = $event_data[0]; // 'channel'
$event = $event_data[1]; // 'event'

PS: здесь я использую explode() помощника php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...