Tengo un sistema de presencia de base de datos en tiempo real que funciona casi por completo, como se describe aquí , pero tengo algunos problemas. Parece que las personas permanecen en línea incluso después de haberse desconectado hace un tiempo. No estoy seguro de por qué, pero he abierto mis reglas de seguridad a solicitudes no autenticadas temporalmente sin éxito. Podría deberse al error descrito aquí .
Si el problema es la escalera, ¿cuál sería la implementación adecuada de JavaScript para evitar este problema? ¿Es una buena solución recrear el oyente onDisconnect cada 60 minutos? Como referencia, el código que estoy usando se muestra a continuación:
export function selfPresence(byUpdate) { onValue(ref(rtdb, '.info/connected'), (snap) => { isDBConnected = snap.val(); if (snap.val() === true) { presencecon = push(ref(rtdb, `users/${user.uid}/connections`)); // Create new presence thing. onDisconnect(presencecon).remove(); set(presencecon, true); onDisconnect(ref(rtdb, `users/${user.uid}/lastOnline`)).set(serverTimestamp()); onDisconnect(ref(rtdb, `users/${user.uid}/currentlyListening`)).remove(); } }); }
MI SOLUCIÓN
onValue(ref(rtdb, '.info/connected'), (snap) => { isDBConnected = snap.val(); if (snap.val()) { onDisconnect(presencecon).set(false); presencecon = ref(rtdb, `users/${user.uid}/online`); isDBConnected = snap.val(); } else { remove(presencecon); } }
El siguiente código actualiza un valor booleano en una ruta específica para que, si/cuando el problema SÍ ocurra, la próxima vez que el usuario esté en línea, sobrescribirá la falla con un nuevo oyente en línea.
onValue(ref(rtdb, '.info/connected'), (snap) => { isDBConnected = snap.val(); if (snap.val()) { onDisconnect(presencecon).set(false); presencecon = ref(rtdb, `users/${user.uid}/online`); isDBConnected = snap.val(); } else { remove(presencecon); } }