voice_enabled não é acessível pela API JSON de forma alguma: /site.json não contém a chave site_settings. Portanto, o único sinal público de que a voz está ativa em um site é a presença de voice_assets_path.
O que estou pedindo são dois booleanos públicos, sem necessidade de credenciais, para que um cliente possa decidir se deve exibir a voz antes de buscar qualquer sala. Ambos são derivados de um estado existente e não exigem nenhum novo endpoint, em plugins/voice/plugin.rb:
Na linha 141, acima de voice_public_access:
#Sinais públicos, sem credenciais, para clientes da API de que a voz está habilitada.
add_to_serializer(:site, :voice_available) { SiteSetting.voice_enabled }
Na linha 152, acima de voice_livekit_per_room_available:
# Se as conexões podem usar o LiveKit. Uma resposta simples de sim/não: sem URL, chave ou
# valor de política. O atributo por sala abaixo apenas controla a caixa de seleção do SFU
# no formulário da sala e lê false sob a política all_rooms.
add_to_serializer(:site, :voice_livekit_available) do
Voice::Livekit.configured? && SiteSetting.voice_livekit_room_policy != "disabled"
end
Isso não expõe nada de novo: expected_transport é um atributo não controlado no RoomSerializer (linha 30, definido na 150) e rooms#index ignora o login (rooms_controller.rb:18), então “livekit” / “mesh” já é legível anonimamente por sala. Isso apenas responde a isso sem uma busca de sala que pode retornar vazia.