Presença em tempo real

Quem está aqui. Sem consultar a sua API.

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.

room.ts
18 members
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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

members.ts
server
// 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.

Experimente na prática e obtenha um resumo de implementação

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.

Comece com um canal.
Adicione os outros quando estiver pronto.

Uma chave API de teste é sua imediatamente. A produção é desbloqueada quando você adiciona um método de pagamento e verifica um remetente.

Usa Claude Code, Cursor ou Codex? Copie um prompt de configuração e o seu agente instala o Bird CLI e as skills por si. Escolha o seu:

Cursor