Obecność w czasie rzeczywistym

Kto tu jest. Bez odpytywania API.

Zasubskrybuj kanał obecności, a bieżąca lista członków zostanie dostarczona wraz z subskrypcją — pokój renderuje się jako zapełniony, a nie pusty. Następnie każdy klient słyszy te same dołączenia i opuszczenia. Twój backend przypisuje każdemu członkowi tożsamość podczas podpisywania subskrypcji — to właśnie sprawia, że lista jest wiarygodna.

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() });
});

Członek to osoba, nie gniazdo sieciowe.

Trzy karty to jeden członek.

Obecność jest częścią Bird Realtime API i zlicza tożsamości, a nie sesje. Członek pojawia się na liście, gdy jego pierwsze połączenie zasubskrybuje kanał, i znika, gdy ostatnie się rozłączy; karty pomiędzy nie generują żadnych zdarzeń, więc lista nie migocze za każdym razem, gdy ktoś otworzy zduplikowane okno. Jeśli potrzebujesz liczby gniazd, to osobne ustawienie aplikacji i osobne zdarzenie.

Co daje obecność

Lista członków, zmiany i tożsamość, na której jedno i drugie się opiera. Wszystko podpisane przez Twój backend.

  1. 01

    Lista członków, od razu po połączeniu.

    bird:subscription_succeeded zawiera bieżącą listę członków, więc pierwszy render to prawdziwy pokój. Dołączenia i opuszczenia nakładasz na tę listę, zamiast budować ją od zera.

  2. 02

    Tożsamość, którą kontrolujesz.

    Twój endpoint autoryzacyjny zwraca identyfikator członka i opcjonalne informacje o członku, a następnie podpisuje dokładnie ten ciąg. Klient może poprosić o subskrypcję, ale nie może wybrać, kim jest. Informacje o członku ogranicz do niewielkich danych publicznego profilu, takich jak nazwa wyświetlana lub awatar: każdy członek kanału je otrzymuje, a ich rozmiar jest ograniczony do 1 KB.

  3. 03

    Odczyt z Twojego serwera.

    Wylistuj członków kanału lub zapytaj o member_count bez ich listowania, bezpośrednio przez API. Żadne z tych zapytań nie wymaga subskrypcji, więc backend może sprawdzić, kto jest w pokoju, bez dołączania do niego. Liczba członków dotyczy wyłącznie kanałów obecności; zapytanie o nią na kanale publicznym lub prywatnym to błąd walidacji, ponieważ te kanały nie mają członków.

  4. 04

    Zdarzenia klientów między uczestnikami.

    Kanał obecności to jedno z dwóch miejsc, gdzie klient może wywoływać zdarzenia bezpośrednio do innych — wskaźniki pisania i pozycje kursorów nigdy nie trafiają do Twojego API. Dziesięć na sekundę na połączenie, a nadawca nie otrzymuje własnego zdarzenia.

  5. 05

    Liczba połączeń, gdy ich potrzebujesz.

    Członkowie odpowiadają na pytanie, kto tu jest. Włącz zliczanie połączeń i zdarzenia liczby połączeń, a bird:connection_count powie, ile gniazd jest otwartych na kanale — to ta liczba, do której osoba z trzema kartami dokłada trzy.

Zdarzenia adresowane do członka

Czasem celem jest osoba, a nie pokój.

Do zalogowanego członka można zwrócić się bezpośrednio, bez podawania kanału i bez autoryzacji subskrypcji. Jedno wywołanie dociera do każdego połączenia danej tożsamości, we wszystkich kartach i na wszystkich urządzeniach, i do nikogo innego — nawet jeśli inny członek binduje to samo zdarzenie. Jeśli nie ma aktywnego połączenia, wywołanie i tak się powiedzie: dostarczanie nie jest kolejkowane, więc zapisz powiadomienie i załaduj je, gdy wróci. Ta sama tożsamość jest celem rozłączenia, gdy sesja musi zakończyć się natychmiast.

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");

Lista znajomych to nie pokój.

Obecność odpowiada na pytanie, kto jest ze mną w tym pokoju. Zdarzenia listy obserwowanych odpowiadają, czy osoby, na których mi zależy, są online gdziekolwiek. Podpisana tożsamość członka może zawierać do 100 identyfikatorów członków, a przy włączonych zdarzeniach listy obserwowanych połączenie jest informowane, gdy ktokolwiek z nich pojawi się online lub przejdzie offline — pełny status listy jest dostarczany zaraz po zalogowaniu. Ponieważ lista znajduje się w podpisanej tożsamości, Twój endpoint decyduje, kto może obserwować kogo. Żadnych kanałów na relację, a obserwowane osoby nie muszą robić nic poza zalogowaniem się.

Zagłęb się w dokumentacji.

Kanały obecności obejmują listę członków, informacje o członkach i odczyty po stronie serwera. Autoryzacja kanałów to kontrakt implementowany przez Twój backend, wysyłanie zdarzeń do członka porównuje zdarzenia członkowskie z kanałami prywatnymi, a zdarzenia listy obserwowanych to wariant listy śledzonych.

Zastosuj w praktyce.

Kontynuuj z dokumentacją, przewodnikami i przykładami dotyczącymi tego tematu. Zasoby są w języku angielskim.

Wypróbuj ćwiczenie i uzyskaj brief wdrożeniowy

Renderuj pokój, a nie stan ładowania.

Obecność, zdarzenia klienta i dostarczanie adresowane do członków są dostępne w każdej aplikacji Realtime. Darmowy plan obejmuje 100 jednoczesnych połączeń.

Zacznij od jednego kanału.
Dodaj kolejne, gdy będziesz gotowy.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i weryfikacji nadawcy.

Używasz Claude Code, Cursor lub Codex? Skopiuj prompt konfiguracyjny, a Twój agent zainstaluje za Ciebie Bird CLI i umiejętności. Wybierz swój:

Cursor