Estoy tratando de construir un pequeño sistema de lobby con socket.io, pero recientemente encontré un problema cuando un usuario cierra una pestaña para salir del lobby. Quiero tener comentarios instantáneos (o casi instantáneos) en el lado del cliente cuando el usuario se desconecte del lobby.
Desafortunadamente, siempre toma alrededor de 35 segundos entre el cierre de una pestaña del navegador y el disparo del evento socket.on('disconnect') en el servidor, que es demasiado tiempo para lo que necesito.
Ya investigué un poco y descubrí que la conexión se cierra instantáneamente cuando el motivo del cierre es un cierre de transporte o un error de transporte .
En mi caso, parece ser un tiempo de espera de ping , lo que significa que socket.io espera un tiempo hasta que se envía el siguiente paquete. Si eso no sucede, la conexión se cerrará.
Entonces, mi pregunta ahora es, ¿por qué el motivo del tiempo de espera de ping tiene lugar aquí al cerrar una pestaña y cómo puedo cambiarlo a un motivo de cierre de transporte ?
Mi código actual se ve así:
const path = require('path'); const http = require('http'); const express = require('express'); const socketio = require('socket.io'); const formatMessage = require('./utils/messages'); const { userJoin, getCurrentUser, userLeave, getRoomUsers } = require('./utils/users'); const app = express(); const server = http.createServer(app); const io = socketio(server); // Run when client connects io.on('connection', socket => { socket.on('joinRoom', ({ username, room }) => { const user = userJoin(socket.id, username, room); socket.join(user.room); console.log("ROOMS AFTER JOIN: ", io.sockets.adapter.rooms); // Send users and room info io.to(user.room).emit('roomUsers', { room: user.room, users: getRoomUsers(user.room) }); }); // Runs when client disconnects socket.on('disconnect', (reason) => { const user = userLeave(socket.id); console.log("Reason: ", reason) if (user) { // Send users and room info io.to(user.room).emit('roomUsers', { room: user.room, users: getRoomUsers(user.room) }); } }); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => console.log(`Server running on port ${PORT}`));