Реклама

Закрыл вкладку — ушёл, обновил страницу — остался: присутствие в комнате на WebSocket

#Закрыл #WebSocket #Когда #SessionDisconnectEvent #Рассказываю
Закрыл вкладку — ушёл, обновил страницу — остался: присутствие в комнате на WebSocket

Когда человек закрыл вкладку, обновил страницу или потерял сеть, сервер получает один и тот же SessionDisconnectEvent , а реагировать должен по-разному. Рассказываю, как в своём Planning Poker научил комнату различать эти случаи и не терять текущие данные при обновлении: маркер закрытия на pagehide, атомарные обновления MongoDB, порядок кадров в Spring, обходы для Firefox и zone.js и живые тесты в Chrome, Firefox и Safari. Восемь граблей и что с ними делать. Читать далее

В приложении с комнатой, где люди видят друг друга в реальном времени, сервер получает одно и то же событие «соединение закрылось», когда человек закрыл вкладку, обновил страницу, свернул браузер на телефоне или на секунду потерял Wi-Fi. А вести себя в этих случаях надо по-разному. Рассказываю, как в своём Planning Poker я добился того, чтобы закрывший вкладку исчезал из-за стола за доли секунды, а обновивший страницу оставался вместе со своим голосом, через какие грабли прошёл в Spring, RabbitMQ, MongoDB, Firefox и zone.js и как это измерял.

Предыстория

Я решил сделать свой Planning Poker: сервис без регистрации, где ведущий создаёт комнату, присылает ссылку, участники входят по именам, каждый втайне выбирает карту, карты открываются, оценка принимается. Казалось, что самое сложное здесь закрытые карты и синхронное открытие. На деле самой упрямой оказалась другая задача: кто сейчас сидит за столом.

За столом сидят люди, и всем видно, кто за ним сидит. Если кто-то закрыл вкладку, а его место осталось занятым, карты не откроются, пока остальные не разберутся, чей это «призрак». А если обновил страницу и пропал вместе со своим голосом, это тоже раздражает. По дороге к ответу я собрал заметную коллекцию граблей в Spring, RabbitMQ, MongoDB, Firefox и zone.js, и именно ими хочу поделиться.