@Falco Hey, beim Testen des aktualisierten Resenha bin ich auf ein paar reproduzierbare Probleme gestoßen. Ich teile meine Erkenntnisse und die Patches, die ich lokal einsetze, falls sie für den Upstream nützlich sind.
1. Admin-UI verwirft room_type stillschweigend; Räume bleiben nie im Stage-Modus
app/controllers/resenha/admin_rooms_controller.rb:65 (room_params) lässt :room_type aus der Erlaubnisliste weg, und admin_room_serializer.rb serialisiert es nie.
Jede Stage-Zuweisung, die über die Admin-UI vorgenommen wird, wird verworfen. Räume werden als „offen“ erstellt und „kehren“ bei jeder späteren Admin-Bearbeitung in den offenen Zustand zurück. Bestätigt über Produktionslogs; der nutzerseitige Controller erlaubt es, nur der Admin-Pfad hat es verloren.
# admin_rooms_controller.rb — füge :room_type zur Erlaubnisliste hinzu, dann:
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 — serialisiere room_type, damit das Formular korrekt initialisiert wird
2. Ungültiges room_type fällt stillschweigend auf „offen“ zurück
app/controllers/resenha/rooms_controller.rb:575 — ROOM_TYPES[...] || ROOM_TYPE_OPEN.
Jeglicher fehlerhafter/veralteter room_type in ansonsten gültigen Raum-Änderungen setzt einen Stage-Raum stillschweigend auf „offen“. Ein 400er-Fehler macht den fehlerhaften Aufrufer sichtbar, statt den Raum zu korruptieren.
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 belebt einen Nutzer wieder, der gerade verlassen hat (Geist-Präsenz)
rooms_controller.rb:234 (heartbeat) fügt die Präsenz bedingungslos wieder hinzu, sodass ein Heartbeat, das unterwegs ist, wenn leave (:220) verarbeitet wird, als Zweites ankommt und den abgereisten Nutzer wiederherstellt.
Der Geist bleibt bis zur TTL-Bereinigung bestehen, die nicht ausgestrahlt wird — Clients zeigen ihn bis zu einer Minute lang als „im Raum“ an.
Auf dem Gerät reproduziert; Kick hat die gleiche Exposition.
# ParticipantTracker: 15s Grabstein
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. Veralteter participant_left Webhook phantom-kickt eine frische Sitzung
livekit_webhooks_controller.rb:37/57 — Abgänge werden nur nach Nutzeridentität abgeglichen.
Bei einem schnellen Disconnect/Rejoin trifft der participant_left der abgelösten Sitzung zu spät ein und löscht die Präsenz der neuen Sitzung (Nutzer wird „gekickt“ ~3s nach dem Rejoin, zurück ~15s später).
Auf dem Gerät reproduziert; die gone_at-Heuristik kann die Sitzungen nicht unterscheiden, wenn der Rejoin vor dem Disconnect der alten Sitzung liegt.
# participant_joined → zeichne die aktive SID auf
Resenha::ParticipantTracker.set_livekit_sid(room.id, user_id, event.dig("participant", "sid"))
# expire_participant → überspringe den Abgang einer abgelösten Sitzung
known = Resenha::ParticipantTracker.livekit_sid(room.id, user_id)
return if sid.present? && known.present? && sid != known
5. DeleteRoom 404 nach dem letzten Verlassen flutet die Logs
lib/resenha/livekit/room_service_client.rb:84 warnt bei jedem Nicht-200.
Das SFU schließt einen Raum automatisch, sobald er leer ist, sodass das DeleteRoom des letzten Verlassens routinemäßig damit konkurriert — „angeforderter Raum existiert nicht“ ist der gewünschte Endzustand, kein Fehler.
Es landet bei jedem letzten Verlassen in Logster.
elsif method == "DeleteRoom" && response.status == 404
Rails.logger.debug("[resenha-livekit] DeleteRoom no-op for room #{room.id}: already gone")
true
Ich kann einen Pull-Request senden, wenn du möchtest.
Wie ich bereits in früheren Beiträgen sagte, kenne ich eure Richtung nicht vollständig, aber du kannst dir meine ansehen, da ich hier einen Beitrag geschrieben habe → Discourse Desktop Mac App - #10 by nicolsdennis