En JavaScript (en Chrome) intento realizar alguna tarea cada vez que un usuario cambia de una red WiFi a otra (suponiendo que ambas redes son exactamente iguales en términos de rendimiento).
Empecé observando los eventos en online / offline de línea de la interfaz de Windows y navigator.onLine , pero parece que no se activan cuando cambiamos de red (desconectarnos de una red y conectarnos a la otra) porque
En Chrome y Safari, si el navegador no puede conectarse a una red de área local (LAN) o un enrutador, está fuera de línea; todas las demás condiciones devuelven verdadero.
no puede asumir que un valor verdadero significa necesariamente que el navegador puede acceder a Internet. Es posible que obtenga falsos positivos, como en los casos en que la computadora ejecuta un software de virtualización que tiene adaptadores Ethernet virtuales que siempre están "conectados".
Ref1: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine
Ref2: ¿por qué navigator.onLine() devuelve verdadero incluso si mi conexión a Internet no funciona?
Además, el objeto navigator.connection no necesariamente se actualiza para activar el evento navigator.connection.onchange en caso de cambiar de red.
Intenté usar WebRTC con STUN para capturar la dirección IP pública para diferenciar entre las dos conexiones, pero no hay un detector de eventos que indique de manera confiable que se ha producido un cambio en la red.
Entiendo que JavaScript no puede acceder directamente a la información de la red a través del navegador por razones de seguridad, pero ¿existe alguna alternativa que pueda usarse de manera confiable para desencadenar un evento cada vez que se cambia la red o no hay conectividad real a Internet aunque la computadora esté conectada a la LAN/Wi-Fi?
Lo que está buscando no tiene una amplia compatibilidad con navegadores, pero existe en navegadores basados en Chromium: https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/change_event
Esto se conoce como problema de "salir por la puerta". Estas diapositivas de una reunión del IETF de 2015 lo explican bien: https://www.ietf.org/proceedings/94/slides/slides-94-ice-6.pdf
En pocas palabras, lo que debe hacer en el navegador es esperar a que la conexión anterior se desconecte e iniciar un reinicio de ICE para restablecer la conexión.