@Falco Привет! Я столкнулся с несколькими воспроизводимыми проблемами во время тестирования обновленной версии Resenha. Делюсь своими находками и патчами, которые я использую локально, на случай, если они пригодятся в основном репозитории.
1. Административный интерфейс тихо отбрасывает room_type, и комнаты не могут сохранять тип этапа
app/controllers/resenha/admin_rooms_controller.rb:65 (room_params) исключает :room_type из списка разрешенных параметров, а admin_room_serializer.rb никогда не сериализует его.
Любое назначение этапа, выполненное через административный интерфейс, отбрасывается: комнаты создаются как открытые и «возвращаются» к открытому статусу при любом последующем редактировании в админке. Подтверждено через логи продакшена; пользовательский контроллер разрешает этот параметр, но административный путь его теряет.
# admin_rooms_controller.rb — добавьте :room_type в список разрешенных параметров, затем:
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 — сериализуйте room_type, чтобы форма инициализировалась корректно
2. Недействительный room_type тихо заменяется на открытый
app/controllers/resenha/rooms_controller.rb:575 — ROOM_TYPES[...] || ROOM_TYPE_OPEN.
Любой некорректный или устаревший room_type в иначе валидном редактировании комнаты тихо превращает комнату этапа в открытую. Возврат кода 400 сделает проблемного вызывающего код видимым, вместо того чтобы портить состояние комнаты.
value = Resenha::Room::ROOM_TYPES[permitted[:room_type].to_s]
raise Discourse::InvalidParameters.new(:room_type) if value.nil?
permitted[:room_type] = value
3. Heartbeat (сердцебиение) оживляет пользователя, который только что ушел (привидение присутствия)
rooms_controller.rb:234 (heartbeat) безоговорочно добавляет присутствие, поэтому heartbeat, находящийся в процессе передачи, когда обрабатывается leave (:220), приходит позже и заново создает ушедшего пользователя.
«Привидение» остается до момента очистки по TTL, что не транслируется — клиенты показывают пользователя «в комнате» до минуты.
Воспроизведено на устройстве; kick имеет идентичную уязвимость.
# ParticipantTracker: 15-секундная метка удаления
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. Устаревший webhook participant_left фантомно выкидывает новую сессию
livekit_webhooks_controller.rb:37/57 — уходы сопоставляются только по идентификатору пользователя.
При быстром отключении и повторном подключении participant_left от предыдущей сессии приходит с опозданием и удаляет присутствие новой сессии (пользователь «выкидывается» ~3 секунды после повторного входа, возвращаясь ~15 секунд спустя).
Воспроизведено на устройстве; эвристика gone_at не может различить сессии, когда повторное подключение происходит раньше отключения старой сессии.
# participant_joined → записать текущий SID
Resenha::ParticipantTracker.set_livekit_sid(room.id, user_id, event.dig("participant", "sid"))
# expire_participant → пропустить уход от предыдущей сессии
known = Resenha::ParticipantTracker.livekit_sid(room.id, user_id)
return if sid.present? && known.present? && sid != known
5. DeleteRoom 404 после ухода последнего участника затапливает логи
lib/resenha/livekit/room_service_client.rb:84 выдает предупреждение при любом ответе, отличном от 200.
SFU автоматически закрывает комнату в момент, когда она пустеет, поэтому последний уход часто опережает вызов DeleteRoom — «запрошенная комната не существует» является ожидаемым конечным состоянием, а не ошибкой.
Это попадает в Logster при каждом уходе последнего участника.
elsif method == "DeleteRoom" && response.status == 404
Rails.logger.debug("[resenha-livekit] DeleteRoom no-op for room #{room.id}: already gone")
true
Я могу отправить pull request, если желаешь.
Как я говорил ранее, я не знаю твоего полного плана развития, но ты можешь посмотреть на мои идеи, так как я создал пост здесь → Discourse Desktop Mac App - #10 by nicolsdennis