Subscreva um canal de presença e o registo atual chega com a subscrição, para que a sala apareça preenchida em vez de vazia. A partir daí, todos os clientes recebem as mesmas entradas e saídas. O seu backend atribui a cada membro a sua identidade ao assinar a subscrição, e é isso que torna a lista fiável.
import type { Member } from "@messagebird/realtime";
const room = bird.subscribe("presence-room-42");
room.bind("bird:subscription_succeeded", () => {
// The roster is already here. Paint it before anyone moves.
render({ me: room.myId, members: [...room.members.values()] });
});
room.bind<Member>("bird:member_added", (member) => join(member.member_id));
room.bind<Member>("bird:member_removed", (member) => leave(member.member_id));
input.addEventListener("input", () => {
room.trigger("client-typing", { at: Date.now() });
});
Um membro é uma pessoa, não um socket.
Três separadores são um único membro.
A presença faz parte da Bird Realtime API e conta identidades em vez de sessões. Um membro entra na lista quando a sua primeira ligação subscreve e sai quando a última se desliga; os separadores intermédios não produzem nada, por isso o registo não oscila sempre que alguém abre uma janela duplicada. Se precisar da contagem de sockets, isso é uma configuração de aplicação separada e um evento separado.
O que a presença lhe oferece
O registo, as alterações e a identidade para associar ambos. Tudo assinado pelo seu próprio backend.
- 01
O registo, à chegada.
bird:subscription_succeeded traz a lista de membros atual, para que a primeira renderização mostre a sala real. Aplica entradas e saídas sobre ela em vez de construir a lista a partir de um estado vazio.
- 02
Uma identidade que você controla.
O seu endpoint de autorização devolve um id de membro e informações opcionais do membro, e assina exatamente essa string. Um cliente pode pedir para subscrever, mas não pode escolher quem é. Limite as informações do membro a dados de perfil público pequenos, como um nome de exibição ou um avatar: todos os membros do canal as recebem, e estão limitadas a 1 KB.
- 03
Leituras a partir do seu servidor.
Liste os membros de um canal, ou peça o member_count sem os listar, diretamente pela API. Nenhuma das opções precisa de subscrição, para que um backend possa saber quem está numa sala sem entrar nela. A contagem de membros é exclusiva da presença; solicitá-la num canal público ou privado é um erro de validação, porque esses canais não têm membros.
- 04
Eventos de cliente entre pares.
Um canal de presença é um dos dois locais onde um cliente pode disparar um evento diretamente para os outros, de modo que indicadores de digitação e posições de cursor nunca tocam na sua API. Dez por segundo por ligação, e o remetente não recebe o seu próprio evento.
- 05
Contagens de ligações, quando precisar delas.
Os membros respondem quem está aqui. Ative a contagem de ligações e os eventos de contagem de ligações, e bird:connection_count responde quantos sockets estão abertos no canal — que é o número para o qual a pessoa com três separadores contribui com três.
Eventos endereçados a membros
Às vezes o destino é uma pessoa, não uma sala.
Um membro autenticado pode ser contactado diretamente, sem nomear um canal e sem autorizar uma subscrição. Uma chamada alcança todas as ligações que essa identidade mantém, em todos os separadores e dispositivos, e mais ninguém, mesmo que outro membro vincule o mesmo nome de evento. Se não tiver nenhuma ligação ativa, a chamada continua a ter sucesso: a entrega não é enfileirada, por isso guarde a notificação e carregue-a quando o membro voltar. A mesma identidade é o alvo de desconexão quando uma sessão precisa de terminar imediatamente.
// Address the person, not a channel. Every tab, every device.
await bird.realtime.members.send(APP_ID, "u_42", {
event: "order.shipped",
data: { order_id: "ord_123" },
});
// The roster, read from your server. No subscription needed.
const roster = await bird.realtime.channels.members(APP_ID, "presence-room-42");
// Password changed. Close every connection they hold.
await bird.realtime.members.disconnect(APP_ID, "u_42");
Uma lista de contactos não é uma sala.
A presença responde quem está nesta sala comigo. Os eventos de watchlist respondem se as pessoas de quem me importo estão online em qualquer lugar. A identidade assinada de um membro pode transportar até 100 ids de membros, e com os eventos de watchlist ativados a ligação é notificada quando qualquer um deles fica online ou offline, com o estado atual de toda a lista entregue logo após o início de sessão. Como a lista vive dentro da identidade assinada, o seu endpoint decide quem pode observar quem. Sem um canal por relação, e as pessoas observadas não fazem nada além de iniciar sessão.
Aprofunde na documentação.
Canais de presença cobre o registo, as informações de membros e as leituras do lado do servidor. Autorização de canais é o contrato que o seu backend implementa, enviar eventos a um membro compara eventos de membros com canais privados, e eventos de watchlist é a variante de lista de seguimento.
Coloque em prática.
Continue com a documentação, guias e exemplos sobre este tópico. Os recursos estão em inglês.
O resto do Realtime
Uma aplicação, um par de chaves. Explore as outras capacidades.
Renderize a sala, não um estado de carregamento.
Presença, eventos do cliente e entrega endereçada a membros estão incluídos em todas as aplicações Realtime. O plano gratuito cobre 100 conexões simultâneas.