Запилил TODO пример с использованием servant, servant-auth-cookie, wai-websockets. Ниже краткий отчёт о ходе реализации.
- В Yesod MonadHandler добавляет к каждому запросу контекст сессии, к которому в любой момент времени можно получить доступ.
- В куках в каждую сессию можно положить произвольную мапу, и работать с ней, как из хэндлера, так и из вебсокета.
- В Servant такого счастья нет, надо заворачивать маршруты в куки с двух сторон, добавляя ручную обработку заголовков запроса и ответа.
- В пакете servant-auth нет поддержки шифрования кук, не очень безопасно получается.
- В servant-auth-cookie (альтернатива) можно из API пакета собирать своё уютненькое шифрование с ротирующимися ключами. Для себя взял простой пример. Забавно, к пакету приложили руки мои знакомые Stack Builders из Эквадора и @mrkkrp, чьи пакеты я успешно юзал в прошлом. Пользуясь случаем, передаю привет и респект.
- (Хотя zip он когда-то давно патчить отказался, чтобы обеспечить поддержку распаковки архива, созданного 7-Zip, как не RFC-compliant archive. Впрочем, я не в обиде).
- servant-websockets оказался нежизнеспособным в плане анализа прилетающего реквеста, а точнее - его заголовков. Последовал совету @qnikst, взял wai-websockets и не пожалел! Респект!
Пока всё это делал, нашёл способ не завозить в Fay классы типов.
На очереди API для broadcast, для одиночной сессии. Ещё предстоит научиться поддерживать (ярлычок maintainer не просто так даётся ведь) пакеты и пилить инфраструктуру под front в виде сайта и площадки для экспериментов. Впереди ещё много работы.