@Falco Ciao, ho riscontrato alcuni problemi riproducibili durante i test della versione aggiornata di resenha. Condivido i risultati e le patch che sto applicando localmente, nel caso possano essere utili upstream.
1. L’interfaccia di amministrazione scarta silenziosamente room_type: le stanze non possono mai mantenere lo stage
app/controllers/resenha/admin_rooms_controller.rb:65 (room_params) omette :room_type dall’elenco dei parametri consentiti (permit list), e admin_room_serializer.rb non lo serializza mai.
Ogni assegnazione di stage effettuata tramite l’interfaccia di amministrazione viene scartata; le stanze vengono create come “aperte” e “tornano” allo stato aperto con qualsiasi modifica successiva da parte dell’amministratore. Confermato tramite i log di produzione; il controller lato utente lo accetta, ma il percorso di amministrazione lo perde.
# admin_rooms_controller.rb — aggiungere :room_type all'elenco dei parametri consentiti, quindi:
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 — serializzare room_type in modo che il modulo venga inizializzato correttamente
2. Un room_type non valido torna silenziosamente a “aperto”
app/controllers/resenha/rooms_controller.rb:575 — ROOM_TYPES[...] || ROOM_TYPE_OPEN.
Qualsiasi room_type malformato o obsoleto in una modifica di stanza altrimenti valida trasforma in modo silenzioso una stanza di stage in una stanza aperta. Un errore 400 renderebbe visibile il chiamante che si comporta in modo errato, invece di corrompere la stanza.
value = Resenha::Room::ROOM_TYPES[permitted[:room_type].to_s]
raise Discourse::InvalidParameters.new(:room_type) if value.nil?
permitted[:room_type] = value
3. Il heartbeat risuscita un utente che è appena uscito (presenza fantasma)
rooms_controller.rb:234 (heartbeat) riaggiunge incondizionatamente la presenza, quindi un heartbeat in volo quando leave (:220) viene elaborato per secondo, ricrea l’utente che se n’è andato.
Il fantasma persiste fino alla scadenza del TTL, che non viene broadcastata: i client mostrano l’utente “nella stanza” per fino a un minuto.
Riprodotto su dispositivo; il kick ha la stessa esposizione.
# ParticipantTracker: tombstone di 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 espelle fantasma una sessione appena creata
livekit_webhooks_controller.rb:37/57 — le partenze vengono abbinate solo in base all’identità dell’utente.
In caso di disconnessione/ricollegamento rapido, il participant_left della sessione soppiantata arriva in ritardo e fa scadere la presenza della nuova sessione (l’utente viene “espulso” ~3 secondi dopo il ricollegamento, tornando ~15 secondi dopo).
Riprodotto su dispositivo; l’euristica gone_at non può distinguere le sessioni quando il ricollegamento precede la disconnessione della vecchia sessione.
# participant_joined → registrare il SID live attivo
Resenha::ParticipantTracker.set_livekit_sid(room.id, user_id, event.dig("participant", "sid"))
# expire_participant → ignorare la partenza di una sessione soppiantata
known = Resenha::ParticipantTracker.livekit_sid(room.id, user_id)
return if sid.present? && known.present? && sid != known
5. DeleteRoom 404 dopo l’ultima uscita inonda i log
lib/resenha/livekit/room_service_client.rb:84 segnala un avviso per qualsiasi risposta non 200.
L’SFU chiude automaticamente una stanza nel momento in cui si svuota, quindi la DeleteRoom dell’ultima uscita entra spesso in competizione con essa — “la stanza richiesta non esiste” è lo stato finale desiderato, non un errore.
Appare su Logster ad ogni ultima uscita.
elsif method == "DeleteRoom" && response.status == 404
Rails.logger.debug("[resenha-livekit] DeleteRoom no-op per la stanza #{room.id}: giĂ eliminata")
true
Posso inviare una pull request se lo desideri.
Come detto in precedenza, non conosco appieno la vostra direzione, ma puoi dare un’occhiata alla mia, dato che ho pubblicato un post qui → Discourse Desktop Mac App - #10 by nicolsdennis