Expondo o status do LiveKit no serializador de configurações do site

@Falco É possível expor um check público nas configurações do site/serializer para verificar se o LiveKit está configurado, ao lado de voice_enabled?

Atualmente, voice_enabled é exposto ao cliente, mas não há um sinal público indicando se um site pode fornecer LiveKit. O único atributo do site relacionado ao LiveKit, voice_livekit_per_room_available, é limitado à caixa de seleção do formulário de sala, portanto, retorna false sob a política all_rooms e não pode ser usado para responder à pergunta “este site usa LiveKit de alguma forma?”.

RoomSerializer#expected_transport cobre bem o caso por sala, mas isso requer buscar as salas primeiro, e ele retorna vazio quando voice_public_access está desativado, mesmo em um site onde o LiveKit está totalmente configurado.

Algo assim seria aceitável? Ele é derivado do estado existente, não expõe credenciais nem detalhes de política e não precisa de um novo endpoint.

Ele ficaria em plugins/voice/plugin.rb, após o bloco voice_livekit_per_room_available e logo antes da linha Voice::DefaultRoomSeeder.ensure!:

# Sinal público, sem credenciais, de que o site pode fornecer LiveKit de alguma forma.
add_to_serializer(:site, :voice_livekit_available) do
Voice::Livekit.configured? && SiteSetting.voice_livekit_room_policy != "disabled"
end

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.

Por favor, não mencione membros da equipe em massa desse jeito (eu removi as menções).

Pode ajudar se você descrever qual é o seu objetivo final para essas informações extras. É difícil responder a uma solicitação de funcionalidade sem nenhuma justificativa para o que você pretende fazer com essas informações.

Peço desculpas por ter feito uma pergunta em um anúncio e ter sido redirecionado para o suporte, o que me deixou sem saber com quem falar, já que se trata de uma solicitação de recurso e não de solução de problemas. Após revisar o histórico por cerca de 5 horas, marquei os membros responsáveis pelo commit/merge principal do recurso de voz.

No entanto, para dar mais contexto: tenho um aplicativo que atua como um cliente multiplataforma para comunidades do Discourse, cada uma configurada de forma diferente. Assim, ao iniciar, ele constrói a navegação para o site em que o usuário está. O chat aparece se estiver habilitado, e eu gostaria que a voz aparecesse se estiver habilitada e realmente acessível pelo aplicativo.

O aplicativo se conecta via LiveKit e não suporta mesh, então, em um site que usa mesh, prefiro excluir completamente a voz da navegação, em vez de exibir salas que falharão ao tentar se conectar, dando a impressão de que o aplicativo está com defeito.

Portanto, o fluxo é o seguinte: ler as informações do site uma vez na inicialização, decidir se a voz deve fazer parte do aplicativo para aquele site e, em seguida, usar expected_transport para cada sala quando o usuário a abrir. Os dois valores booleanos são apenas o primeiro passo, e sem eles, ou exibo um recurso que não funciona, ou oculto um que funciona.

Alternativamente, posso exibir a mensagem “Não disponível neste fórum” em um alerta global dentro do aplicativo, independentemente de estar habilitado ou não, mas essa abordagem me pareceu melhor, então identifiquei o ponto de entrada e forneci o código e os comentários.

Obrigado pela explicação! A solicitação faz sentido.

O plugin de voz é novo e está em estado experimental. Provavelmente passará por alterações nas próximas semanas e meses. Especialmente mudanças internas. Estamos abertos a expor essas informações de alguma forma, mas ainda não podemos ter certeza de qual será esse formato. Depende de como a integração com o LiveKit evoluirá.

Se você acha que 5h é tempo demais para esperar, talvez seja novo no conceito de comunicações assíncronas em fóruns. Bem-vindo!

Vou investigar isso e criar algo que possamos usar.

Acho que você se enganou. Eu estava acordado das 1h às 5h da manhã revisando o que foi feito e os merges, e foi assim que encontrei os membros da equipe que marquei originalmente. Não é que eu esteja esperando uma resposta por 5 horas. O aplicativo já foi enviado para revisão e está utilizando o sistema padrão que eu já tenho.

Isso está bem para mim, leve o tempo que precisar. Fiz meus testes ao longo de 6 meses, levou algum ajuste fino para a escalabilidade.

Na verdade, você estava certíssimo. A API oficial faz exatamente uma chamada para isso e faz o parsing da seguinte forma:

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

Isso retornará o transporte da sala de voz.

voice_public_access não é uma configuração existente. Sobre o que você está falando?

Claro, você vai querer usar autenticação na chamada de API para rooms.json para poder buscar apenas as salas às quais o usuário atual tem acesso.

Eu estava olhando para a linha 144 do plugin.rb, onde ele é adicionado ao serializador do site, com base em Guardian#voice_public_access? na linha 16 de lib/voice/guardian_extension.rb. Eu o li como uma configuração, quando na verdade não é, então esse foi o meu erro.

E obrigado pela dica sobre o rooms.json, a chamada autenticada com expected_transport era o que eu estava faltando.

Tudo o que eu quero saber é se o site pode servir LiveKit de alguma forma, no payload do site. O transporte da sala pode me dizer isso: available_for? retorna room.livekit_enabled sob per_room (linha 26 de lib/voice/livekit.rb), e expected_transport retorna o pin primeiro (linha 150 de room_serializer.rb), inclusive após um fallback de malha (linha 169 de rooms_controller.rb).

@Falco Vou testar mais na minha instância local.

Uma pergunta separada: voice_allowed_groups é exposto aos clientes em algum lugar, e expected_transport é a forma prevista para indicar ao LiveKit, em uma lista, se a sala usa mesh? Eu gostaria de ocultar as salas mesh e mostrar apenas as do LiveKit quando disponíveis, mas não vejo como separá-las.

Não. Expor isso seria uma violação de segurança (divulgação de informações). Apenas o usuário atual precisa saber sobre as próprias permissões.

Sim, 100%.

Use expected_transport.

Tudo bem, muito obrigado pela ajuda.

Isso é o que eu fiz A Social Mobile & Desktop Client for Communities (2) - #30 by nicolsdennis