Ich habe eine Elixir/Phoenix Server App und die Clients verbinden sich über das eingebaute Kanalsystem über Websockets. Jetzt möchte ich erkennen, wenn ein Benutzer einen Kanal verlässt.Wie erkennt man, ob ein Benutzer aufgrund einer Netzwerkunterbrechung einen Phoenix-Kanal verlassen hat?
Hinweis: Ich verwende die Javascript-Client-Bibliothek in einer Google Chrome-Erweiterung. Dazu habe ich den ES6-Code von Phoenix extrahiert, in Javascript umgewandelt und ein wenig optimiert, damit er eigenständig läuft.
Jetzt, wenn ich nur das Popup schließen, löst der Server sofort die terminate/2
Funktion mit reason = {:shutdown, :closed}
. Es gibt keine Art von Close-Callback auf der Erweiterungsseite, also ist das großartig!
Aber wenn der Client einfach Netzwerkverbindung verliert (ich habe einen zweiten Computer angeschlossen und nur den Netzwerkstecker gezogen), wird terminate/2
nicht ausgelöst.
Warum und wie behebe ich das?
Ich spielte mit der timeout
Möglichkeit transport :websocket, Phoenix.Transports.WebSocket
aber heraus funktionierte nicht.
Update: Mit den neuen ehrfürchtigen Phoenix 1.2 Presence
Sachen, soll dies nicht mehr benötigt werden.
Ich habe gerade festgestellt, dass der Server nicht immer erkennt, wenn das Popup geschlossen wurde. Ich hoffe also, dass eine Lösung für meine Frage das auch löst. –