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.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
// 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.
Pozostałe funkcje Realtime
Jedna aplikacja, jedna para kluczy. Poznaj pozostałe możliwości.
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ń.