Cuento las conexiones concurrentes de la siguiente manera:
onValue(ref(db, '.info/connected'), snapshot => { if (snapshot.val()) { let con = push(ref(db, 'concurrent'), { connected: moment().format('DD/MM/YYYY HH:mm') }) onDisconnect(con).remove() } })Sin embargo, cuando reviso la base de datos, veo conexiones de hace varios días:
¿Significa eso que los usuarios han tenido pestañas inactivas en el navegador desde hace varios días? ¿Estoy haciendo algo mal? ¿Es la función onDisconnect() 100% confiable?
base de fuego aquí
¿Tiene reglas de seguridad en la ruta concurrent que requieran que el usuario sea autenticado por casualidad? Porque hay un problema abierto en torno a eso, que ha estado causando problemas a más personas recientemente.
Aparte de eso, no hemos visto problemas de confiabilidad en el manejo de onDisconnect recientemente, por lo que necesitaríamos ver más información sobre las conexiones persistentes (una reproducción independiente sería buena).
Al leer el problema , parece que si la pestaña está inactiva durante más de una hora, el token caduca. Si la pestaña vuelve a estar activa, el cliente de Firebase se vuelve a conectar y obtiene un token nuevo.
Para eliminar la ruta en caso de vencimiento del token (pestaña inactiva):
const onIdleTabGoOffline = (ms) => { let timer document.addEventListener('visibilitychange', () => { if(document.hidden){ timer = setTimeout(() => goOffline(db), ms) } else{ clearTimeout(timer) goOnline(db) } }) }Finalmente:
onValue(ref(db, '.info/connected'), snapshot => { if (snapshot.val()) { let con = push(ref(db, 'concurrent'), { connected: moment().format('DD/MM/YYYY HH:mm') }) onDisconnect(con).remove() onIdleTabGoOffline(59 * 60 * 1000) } })