Аутентификация соединения через веб-сокет в Dart с использованием shelf_auth и shelf_web_socket

Используя shelf_auth, я могу извлечь информацию о текущем пользователе из запроса следующим образом:

getAuthenticatedContext(request)
  .map((ac) => ac.principal.name)
  .getOrElse(() => 'guest')

но, очевидно, мне нужен запрос для того, чтобы это работало:) С другой стороны, при использовании shelf_web_socket при установлении соединения websocket выполняется такой обработчик:

handleWS(CompatibleWebSocket ws){
  // Here I should get user from getAuthenticatedContext()
  // but I cannot due to absence of Request here.
  ws.messages.listen(...);
};

rootRouter.get('/ws', webSocketHandler(handleWS), middleWare: authMiddleware);

Но я понятия не имею, как перенаправить оригинальный запрос на подключение к сокету на мой handleWS, чтобы узнать, какой пользователь только что подключился к серверу.


Другой вопрос - что лучше хранить эти открытые сокеты, чтобы иметь возможность отправлять широковещательные сообщения всем подключенным клиентам и удалять соответствующий сокет, когда он закрыт. Первое, что приходит мне в голову - это хранить розетки на карте, например Map<int,CompatibleWebSocket>где int CompatibleWebSocket.hash(),

Тогда я могу перебрать Map.values() сделать трансляцию и удалить по ключу, когда соединение закрыто.

Я не могу понять, если этот метод слишком сложен для такой задачи и, возможно, существует более удобный способ сделать это, например, сохранить их в списке? Или я могу как-то присоединиться к Streams для трансляции?

0 ответов

Другие вопросы по тегам