@Falco Hola, he encontrado varios problemas reproducibles mientras probaba la versión actualizada de resenha. Comparto mis hallazgos y los parches que estoy aplicando localmente, por si resultan útiles para el proyecto principal.
1. La interfaz de administración descarta silenciosamente room_type; las salas de etapa nunca pueden mantenerse
app/controllers/resenha/admin_rooms_controller.rb:65 (room_params) omite :room_type de la lista de parámetros permitidos, y admin_room_serializer.rb nunca lo serializa.
Cada asignación de etapa realizada a través de la interfaz de administración se pierde; las salas se crean como abiertas y “vuelven” a ser abiertas en cualquier edición posterior desde la administración. Confirmado mediante los registros de producción; el controlador visible para el usuario lo permite, solo la ruta de administración lo perdió.
# admin_rooms_controller.rb — añade :room_type a la lista de permitidos, luego:
if permitted.key?(:room_type)
value = Resenha::Room::ROOM_TYPES[permitted[:room_type].to_s]
raise Discourse::InvalidParameters.new(:room_type) if value.nil?
permitted[:room_type] = value
end
# admin_room_serializer.rb — serializa room_type para que el formulario se inicialice correctamente
2. Un room_type no válido vuelve silenciosamente a “abierta”
app/controllers/resenha/rooms_controller.rb:575 — ROOM_TYPES[...] || ROOM_TYPE_OPEN.
Cualquier room_type mal formado o obsoleto en una edición de sala válida convierte silenciosamente una sala de etapa en abierta. Un error 400 hace visible al cliente que causa el mal comportamiento, en lugar de corromper la sala.
value = Resenha::Room::ROOM_TYPES[permitted[:room_type].to_s]
raise Discourse::InvalidParameters.new(:room_type) if value.nil?
permitted[:room_type] = value
3. El heartbeat resucita a un usuario que acaba de salir (presencia fantasma)
rooms_controller.rb:234 (heartbeat) vuelve a añadir la presencia incondicionalmente, por lo que un heartbeat en tránsito cuando se procesa leave (:220) llega después y vuelve a crear al usuario que se ha ido.
El fantasma persiste hasta que se elimina por TTL, lo cual no se transmite — los clientes muestran al usuario “en la sala” durante hasta un minuto.
Reproducido en dispositivo; la expulsión tiene la misma vulnerabilidad.
# ParticipantTracker: tumba de 15s
def mark_left(room_id, user_id) = redis.setex(left_key(room_id, user_id), 15, "1")
def recently_left?(room_id, user_id) = redis.exists?(left_key(room_id, user_id))
# leave/kick → mark_left; join/livekit_token → clear_left; heartbeat:
return head :no_content if Resenha::ParticipantTracker.recently_left?(@room.id, current_user.id)
4. Un webhook participant_left obsoleto expulsa fantasmalmente una sesión nueva
livekit_webhooks_controller.rb:37/57 — las salidas se coinciden solo por identidad de usuario.
En una desconexión/reconexión rápida, el participant_left de la sesión reemplazada llega tarde y expira la presencia de la nueva sesión (el usuario es “expulsado” ~3s después de reconectar, vuelve ~15s después).
Reproducido en dispositivo; la heurística gone_at no puede distinguir las sesiones cuando la reconexión antecede a la desconexión de la sesión antigua.
# participant_joined → registra el SID en vivo
Resenha::ParticipantTracker.set_livekit_sid(room.id, user_id, event.dig("participant", "sid"))
# expire_participant → omite la salida de una sesión reemplazada
known = Resenha::ParticipantTracker.livekit_sid(room.id, user_id)
return if sid.present? && known.present? && sid != known
5. DeleteRoom 404 después de la última salida inunda los registros
lib/resenha/livekit/room_service_client.rb:84 advierte sobre cualquier respuesta no 200.
El SFU cierra automáticamente una sala en el momento en que se vacía, por lo que el DeleteRoom de la última salida compite rutinariamente con ello — “la sala solicitada no existe” es el estado final deseado, no un fallo.
Aparece en Logster en cada última salida.
elsif method == "DeleteRoom" && response.status == 404
Rails.logger.debug("[resenha-livekit] DeleteRoom no-op for room #{room.id}: already gone")
true
Puedo enviar una pull request si lo deseas.
Como dije antes, no conozco completamente tu dirección, pero puedes echar un vistazo a la mía ya que he hecho una publicación aquí → Discourse Desktop Mac App - #10 by nicolsdennis