Аутентификация соединения через веб-сокет в 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 для трансляции?