Canais de presença
Um canal cujo nome começa com presence- usa a autorização de canal privado e adiciona identidade de membro. Seu backend atribui a cada assinante um member_id. Os assinantes recebem a lista atual de membros e eventos quando membros entram ou saem.
Use canais de presença para listas de usuários online, visualizadores de documento, indicadores de digitação ou cursores colaborativos.
Inscrição
const room = bird.subscribe("presence-room-1");
room.bind("bird:subscription_succeeded", () => {
console.log("me:", room.myId);
console.log("here now:", [...room.members.values()]);
});
room.bind("bird:member_added", (member) => console.log("joined", member.member_id));
room.bind("bird:member_removed", (member) => console.log("left", member.member_id));guard let room = bird.subscribe("presence-room-1") as? PresenceChannel else { return }
room.bind(BirdProtocol.Event.subscriptionSucceeded) { _ in
print("me:", room.myId ?? "")
print("here now:", room.members.keys)
}
room.bind(BirdProtocol.Event.memberAdded) { member in
print("joined", (member as? Member)?.memberId ?? "")
}
room.bind(BirdProtocol.Event.memberRemoved) { member in
print("left", (member as? Member)?.memberId ?? "")
}val room = bird.subscribe("presence-room-1")
if (room is PresenceChannel) {
room.bind(BirdProtocol.Event.SUBSCRIPTION_SUCCEEDED) {
println("me: ${room.myId}")
println("here now: ${room.members.keys}")
}
room.bind(BirdProtocol.Event.MEMBER_ADDED) { data ->
println("joined ${data?.jsonObject?.get("member_id")?.jsonPrimitive?.content}")
}
room.bind(BirdProtocol.Event.MEMBER_REMOVED) { data ->
println("left ${data?.jsonObject?.get("member_id")?.jsonPrimitive?.content}")
}
}Em Swift e Kotlin, subscribe retorna um tipo de canal base. Faça o cast para PresenceChannel antes de acessar myId ou members. Swift fornece um mapa de membros para bird:subscription_succeeded e um Member para eventos de entrada e saída. Kotlin fornece cada evento como JsonElement. Em ambos os clientes, leia a lista atual de membros em room.members.
bird:subscription_succeeded dispara quando a inscrição é concluída. Nesse momento, room.members contém a lista atual de membros e room.myId contém seu member_id. Renderize essa lista inicial antes de aplicar eventos posteriores de entrada e saída.
A autorização segue o mesmo fluxo de um canal privado com uma adição: seu endpoint retorna member_data, uma string JSON contendo member_id e member_info opcional, e deve assinar exatamente essa string. Veja Autorizando canais.
Use member_info com segurança
Todo membro do canal recebe member_info. Use-o para dados pequenos de perfil público, como nome de exibição ou URL de avatar. Não inclua endereços de e-mail, papéis de autorização ou outros dados sensíveis.
Seu backend atribui member_id e member_info na resposta de autorização assinada. O cliente pode solicitar uma inscrição, mas não pode escolher a identidade assinada.
Membros e conexões
Um membro pode manter várias conexões. Por exemplo, três abas abertas produzem um membro e três conexões:
| O que acontece | Evento de membro | Contagem de conexões do canal |
|---|---|---|
| Primeira aba se inscreve | bird:member_added | 1 |
| Segunda aba se inscreve | nenhum | 2 |
| Segunda aba fecha | nenhum | 1 |
| Última aba fecha | bird:member_removed | 0 |
room.members representa identidades em vez de sessões. Para receber o número de conexões abertas, ative Contagem de conexões e Eventos de contagem de conexões e então vincule bird:connection_count.
Lendo presença a partir do seu servidor
Existem duas leituras do lado do servidor, e nenhuma exige uma inscrição:
- Listar membros do canal retorna os valores member_id atualmente inscritos em um canal de presença.
- Obter um canal com include=member_count retorna quantos membros estão presentes, sem listá-los.
member_count é exclusivo de canais de presença. Solicitá-lo em um canal público ou privado é um erro de validação, porque esses canais não possuem membros.
Você também pode solicitá-lo ao publicar, o que retorna o estado de cada canal de destino naquele momento. Veja Publicando eventos.
Próximos passos
- Autorizando canais cobre member_data e a string que seu backend assina.
- Canais privados são a mesma autorização sem identidade.
- Excluindo destinatários de eventos impede que um cliente receba sua própria alteração.
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico. Os recursos estão em inglês.
Explore a funcionalidadeRealtimeSiga o percurso de aprendizagemBuild your first integrationGuia de implementaçãoSend your first realtime event
Experimente na prática e obtenha um resumo de implementação