У меня есть приложение сервера Elixir/Phoenix, и клиенты подключаются через систему сборки в каналах через websockets. Теперь я хочу определить, когда пользователь покидает канал.
Sidenote: я использую клиентскую библиотеку javascript внутри расширения Google Chrome. Для этого я извлек код ES6 из Phoenix, перевел его на javascript и немного изменил его, чтобы он работал автономно.
Теперь, когда я просто закрываю всплывающее окно, сервер немедленно запускает функцию terminate/2 с помощью reason = {:shutdown, :closed}. На стороне расширения нет какого-либо близкого обратного вызова, так что это здорово!
Но когда клиент просто теряет сетевое соединение (я подключил второй компьютер и просто вытащил сетевой штепсель), тогда terminate/2 не будет запускаться.
Почему и как это исправить?
Я играл с опцией timeout transport :websocket, Phoenix.Transports.WebSocket, но это не сработало.
Update:
С новым потрясающим материалом Phoenix 1.2 Presence это больше не нужно.