사이트 설정 직렬화기에 LiveKit 상태 노출

@Falco 사이트 설정/시리얼라이저에서 LiveKit가 설정되어 있는지 여부를 voice_enabled와 함께 공개적으로 확인할 수 있는 체크를 노출하는 것이 가능한가요?

현재 voice_enabled는 클라이언트에 노출되어 있지만, 사이트가 LiveKit을 제공할 수 있는지에 대한 공개 시그널은 없습니다. LiveKit 관련 사이트 속성인 voice_livekit_per_room_available는 룸 폼의 체크박스에 스코프가 설정되어 있어 all_rooms 정책 하에서는 false를 반환하며, "이 사이트가 LiveKit을 지원하는가"라는 질문에 답하는 데 사용할 수 없습니다.

RoomSerializer#expected_transport는 룸별 케이스를 잘 다루지만, 이는 먼저 룸을 가져와야 하며, voice_public_access가 꺼져 있으면 LiveKit이 완전히 설정된 사이트에서도 빈 값으로 반환됩니다.

다음과 같은 방식이 허용될까요? 기존 상태에서 파생되며, 자격 증명이나 정책 세부 정보를 노출하지 않고, 새로운 엔드포인트도 필요하지 않습니다.

이 코드는 plugins/voice/plugin.rb에, voice_livekit_per_room_available 블록 이후와 Voice::DefaultRoomSeeder.ensure! 라인 직전에 추가됩니다:

# 사이트가 LiveKit을 제공할 수 있음을 나타내는 공개적이고 자격 증명 없는 시그널.
add_to_serializer(:site, :voice_livekit_available) do
Voice::Livekit.configured? && SiteSetting.voice_livekit_room_policy != "disabled"
end

voice_enabled은 JSON API에서 아예 접근할 수 없습니다: /site.json에는 site_settings 키가 없습니다. 따라서 사이트에서 음성 기능이 실행 중임을 나타내는 유일한 공개 신호는 voice_assets_path의 존재 여부입니다.

제가 요청하는 것은 클라이언트가 방을 가져오기 전에 음성 기능을 표시할지 여부를 결정할 수 있도록 하는 공개적이고 자격 증명 없이 사용할 수 있는 두 개의 불리언 값입니다. 둘 다 기존 상태에서 파생되며 새로운 엔드포인트가 필요하지 않으며, plugins/voice/plugin.rb 파일에 추가됩니다:

141번째 줄, voice_public_access 위:

#Public, credential-free signals for API clients that voice is enabled.

add_to_serializer(:site, :voice_available) { SiteSetting.voice_enabled }

152번째 줄, voice_livekit_per_room_available 위:

# Whether joins can use LiveKit at all. A bare yes/no: no URL, key or
# policy value. The per-room attribute below only gates the room form's
# SFU checkbox, and reads false under the all_rooms policy.

  add_to_serializer(:site, :voice_livekit_available) do

    Voice::Livekit.configured? && SiteSetting.voice_livekit_room_policy != "disabled"

  end

이것은 새로운 것을 노출하지 않습니다: expected_transport는 RoomSerializer의 게이트가 없는 속성입니다(30번째 줄, 150번째 줄에서 정의됨) 그리고 rooms#index는 로그인을 건너뜁니다(rooms_controller.rb:18), 따라서 “livekit” / "mesh"는 이미 방별로 익명 읽기가 가능합니다. 이것은 비어 있을 수 있는 방 가져오기 없이 이를 답변하는 것입니다.

팀원들을 그렇게 일괄적으로 언급하지 마세요. (관련 언급은 제가 편집해 두었습니다.)

이 추가 정보가 최종적으로 어떤 목적으로 사용되는지 설명해 주시면 도움이 될 수 있습니다. 정보를 사용할 근거가 전혀 없는 기능 요청에는 답변하기가 어렵습니다.

공지사항에 질문을 남긴 점에 대해 사과드립니다. 이후 지원팀으로 이관되었는데, 이 건이 문제 해결이 아닌 기능 요청 사항이라 누구에게 문의해야 할지 몰랐습니다. 지난 5시간 동안 과거 사례를 검토한 끝에, 음성 기능의 핵심 커밋/병합에 참여한 멤버들을 태그했습니다.

다만 배경 설명을 조금 덧붙이자면, 저는 여러 Discourse 커뮤니티를 지원하는 멀티 클라이언트 앱을 개발하고 있습니다. 각 커뮤니티는 설정이 다르기 때문에, 앱이 시작될 때 사용자가 현재 접속한 사이트에 맞는 내비게이션을 생성합니다. 채팅이 활성화되어 있으면 채팅 메뉴가 표시되며, 음성 기능이 활성화되어 있고 앱에서 실제로 참여할 수 있는 경우에만 음성 메뉴가 표시되기를 원합니다.

해당 앱은 LiveKit을 통해 접속하며 메시(mesh) 방식을 지원하지 않습니다. 따라서 메시 방식의 사이트에서는 연결이 실패하는 방을 표시해 앱이 고장 난 것처럼 보이게 하는 것보다는, 아예 내비게이션에서 음성 메뉴를 제외하고 싶습니다.

즉, 흐름은 다음과 같습니다: 부팅 시 사이트 정보를 한 번만 읽어 해당 사이트에서 앱에 음성 기능이 포함되어야 하는지 판단한 뒤, 사용자가 방을 열 때 방별로 expected_transport를 사용합니다. 두 개의 불리언 값은 첫 번째 단계일 뿐이며, 이 값이 없으면 작동할 수 없는 기능을 표시하거나 작동할 수 있는 기능을 숨기는 상황이 발생합니다.

대안으로, 활성화 여부와 관계없이 앱 전역 알림에 "이 포럼에서는 사용할 수 없음"이라는 문구를 표시할 수도 있지만, 이 접근 방식이 더 적합하다고 판단하여 진입점을 특정하고 관련 코드와 주석을 함께 제공했습니다.

설명해 주셔서 감사합니다! 요청 내용이 이해됩니다.

음성 플러그인은 새로 도입된 것으로, 현재 실험 단계에 있습니다. 향후 몇 주 및 몇 달 동안, 특히 내부적인 부분에서 변경이 있을 가능성이 큽니다. 이러한 정보를 어떤 형태로든 공개하는 데에는 열려 있지만, 아직 어떤 형태가 될지 확신할 수 없습니다. LiveKit 통합이 어떻게 발전하는지에 따라 달라질 것입니다.

5시간이 너무 길다고 생각하신다면, 포럼의 비동기 통신 개념에 익숙하지 않으신 것 같습니다. 환영합니다!

이 문제를 조사하여 사용할 수 있는 대안을 찾아보겠습니다.

오해하신 것 같습니다. 저는 1시간 동안 답장을 기다린 것이 아니라, 새벽 1시부터 5시까지 작업 내용과 병합(merge)을 검토하고 있었고, 그 과정에서 원래 태그했던 팀원들을 찾았을 뿐입니다. 앱은 이미 리뷰를 위해 제출된 상태이며, 이미 보유하고 있는 기본 시스템을 활용하고 있습니다.

저에게는 괜찮습니다. 필요한 만큼 시간을 가져도 됩니다. 저는 6개월에 걸쳐 테스트를 수행했으며, 확장성을 위해 세밀한 조정이 필요했습니다.

사실 말씀하신 내용이 정확했습니다. 공식 API는 정확히 이렇게 호출하고 파싱합니다.

curl https://meta.discourse.org/voice/rooms.json -s | jq '.rooms[] | {name: .name, transport: .expected_transport}'

이렇게 하면 피어 방 전송 수단을 얻을 수 있습니다.

voice_public_access는 존재하지 않는 설정입니다. 무슨 말씀이신가요?

물론, 현재 사용자가 접근할 수 있는 방만 가져오려면 rooms.json API 호출 시 인증을 사용해야 합니다.

plugin.rb 파일의 144번째 줄을 보고 있었는데, 여기서 사이트 직렬화기에 추가되며, lib/voice/guardian_extension.rb의 16번째 줄에 있는 Guardian#voice_public_access?에 의해 뒷받침되고 있습니다. 설정이 아닌 것을 설정으로 오해한 것이 제 실수였습니다.

rooms.json에 대한 안내 감사합니다. expected_transport를 사용한 인증 호출이 제가 놓치고 있던 부분이었습니다.

제가 원하는 것은 사이트 페이로드 내에서 사이트가 LiveKit을 제공할 수 있는지에 대한 정보뿐입니다. 룸 트랜스포트로 이를 알 수 있을까요? available_for?는 per_room에서 room.livekit_enabled를 반환하며(lib/voice/livekit.rb 26번째 줄), expected_transport는 메쉬 폴백 이후에도 room_serializer.rb 150번째 줄에서 먼저 핀을 반환합니다(rooms_controller.rb 169번째 줄).

@Falco 로컬 인스턴스에서 추가로 테스트해 보겠습니다.

별개의 질문인데, voice_allowed_groups가 클라이언트에게 어딘가에 노출되고 있나요? 그리고 expected_transport가 목록에서 룸별로 LiveKit과 mesh를 구분하는 의도된 방식인가요? mesh 룸은 숨기고, 사용 가능한 경우 LiveKit 룸만 표시하고 싶은데, 두 가지를 구분하는 방법을 찾지 못하겠습니다.

아니요. 이를 노출하는 것은 사실상 정보 유출에 가까울 것입니다. 현재 사용자는 자신의 권한만 알면 됩니다.

네, 100% 그렇습니다.

expected_transport를 사용하세요.

네, 도움 주셔서 정말 감사합니다.

제가 이렇게 했습니다: A Social Mobile & Desktop Client for Communities (2) - #30 by nicolsdennis