Síntoma
Un jugador bloquea la pantalla del celular o cambia de aplicación, vuelve a los 15 minutos y está desconectado, aunque el cliente nunca cerró el WebSocket.
Causa
Son dos cosas que se combinan.
1. Los pings no cuentan como actividad. En server/src/server.ts, la función que registra actividad del cliente retorna antes de tocar lastActivityAt cuando el paquete es un ping:
// trackClientActivity, alrededor de la linea 365
// si el paquete es ping, retorna sin actualizar lastActivityAt
2. El timeout de inactividad es de 15 minutos (idleCharacterTimeoutMs en server/src/vars.ts).
El cliente manda ping cada 10 segundos, así que la conexión está viva. Pero para el servidor el jugador lleva 15 minutos sin hacer nada y lo expulsa.
En desktop esto se nota poco porque la pestaña suele quedar activa. En mobile es constante: basta con atender una llamada.
Por qué no alcanza con subir el timeout
Subirlo sólo corre el problema más lejos. El punto es que el ping es evidencia de que el cliente sigue ahí; lo que el timeout quiere detectar es un cliente colgado, y para eso el ping es justamente la señal de que no lo está.
Propuesta
- Que el ping actualice
lastActivityAt, o llevar dos relojes separados: uno de "conexión viva" (ping) y otro de "jugador activo" (acciones de juego).
- Si se quiere seguir expulsando jugadores inactivos por razones de juego (liberar lugar, evitar AFK farming), que sea una regla explícita y comunicada, no un efecto secundario del keepalive.
Criterios de aceptación
Relacionado
Sin esto, el trabajo de soporte mobile no sirve de mucho: el jugador se desconecta cada vez que bloquea el teléfono.
Archivos relevantes
server/src/server.ts (trackClientActivity, alrededor de la línea 365; barrido de inactividad alrededor de la 697)
server/src/vars.ts (idleCharacterTimeoutMs)
Síntoma
Un jugador bloquea la pantalla del celular o cambia de aplicación, vuelve a los 15 minutos y está desconectado, aunque el cliente nunca cerró el WebSocket.
Causa
Son dos cosas que se combinan.
1. Los pings no cuentan como actividad. En
server/src/server.ts, la función que registra actividad del cliente retorna antes de tocarlastActivityAtcuando el paquete es un ping:2. El timeout de inactividad es de 15 minutos (
idleCharacterTimeoutMsenserver/src/vars.ts).El cliente manda ping cada 10 segundos, así que la conexión está viva. Pero para el servidor el jugador lleva 15 minutos sin hacer nada y lo expulsa.
En desktop esto se nota poco porque la pestaña suele quedar activa. En mobile es constante: basta con atender una llamada.
Por qué no alcanza con subir el timeout
Subirlo sólo corre el problema más lejos. El punto es que el ping es evidencia de que el cliente sigue ahí; lo que el timeout quiere detectar es un cliente colgado, y para eso el ping es justamente la señal de que no lo está.
Propuesta
lastActivityAt, o llevar dos relojes separados: uno de "conexión viva" (ping) y otro de "jugador activo" (acciones de juego).Criterios de aceptación
Relacionado
Sin esto, el trabajo de soporte mobile no sirve de mucho: el jugador se desconecta cada vez que bloquea el teléfono.
Archivos relevantes
server/src/server.ts(trackClientActivity, alrededor de la línea 365; barrido de inactividad alrededor de la 697)server/src/vars.ts(idleCharacterTimeoutMs)