Echtzeit-Präsenz
Wer ist da. Ohne Ihre API zu fragen.
Abonnieren Sie einen Präsenz-Channel, und die aktuelle Mitgliederliste kommt mit dem Abonnement – der Raum erscheint sofort gefüllt statt leer. Danach hören alle Clients dieselben Beitritts- und Abgangsereignisse. Ihr Backend weist jedem Mitglied seine Identität zu, wenn es das Abonnement signiert – das macht die Liste vertrauenswürdig.
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() });
});
Täglich vertraut von Teams, die erstklassige Software entwickeln
Weitere Kundenberichte lesenEin Mitglied ist eine Person, kein Socket.
Drei Tabs sind ein Mitglied.
Präsenz ist Teil der Bird Realtime API und zählt Identitäten statt Sitzungen. Ein Mitglied erscheint in der Liste, wenn seine erste Verbindung abonniert, und verlässt sie, wenn die letzte Verbindung endet; die Tabs dazwischen erzeugen nichts, sodass die Liste nicht bei jedem Öffnen eines doppelten Fensters flackert. Wenn Sie stattdessen die Socket-Anzahl benötigen, ist das eine separate App-Einstellung und ein separates Ereignis.
Was Präsenz Ihnen bietet
Die Mitgliederliste, die Änderungen und die Identität, an der beides hängt. Alles von Ihrem eigenen Backend signiert.
- 01
Die Mitgliederliste, sofort bei Verbindung.
bird:subscription_succeeded liefert die aktuelle Mitgliederliste, sodass der erste Render den echten Raum zeigt. Sie wenden Beitritte und Abgänge darauf an, statt die Liste von Grund auf aufzubauen.
- 02
Eine Identität, die Sie kontrollieren.
Ihr Autorisierungsendpunkt gibt eine member id und optionale member info zurück und signiert genau diesen String. Ein Client kann ein Abonnement anfordern, aber nicht wählen, wer er ist. Beschränken Sie member info auf kleine öffentliche Profildaten wie einen Anzeigenamen oder ein Avatar: Jedes Mitglied des Channels empfängt sie, und die Größe ist auf 1 KB begrenzt.
- 03
Lesezugriff von Ihrem Server.
Listen Sie die Mitglieder eines Channels auf oder fragen Sie member_count ab, ohne sie aufzulisten – direkt über die API. Beides erfordert kein Abonnement, sodass ein Backend beantworten kann, wer in einem Raum ist, ohne ihm beizutreten. Member count gibt es nur bei Präsenz-Channels; die Abfrage auf einem öffentlichen oder privaten Channel ist ein Validierungsfehler, weil diese Channels keine Mitglieder haben.
- 04
Client-Events zwischen Teilnehmern.
Ein Präsenz-Channel ist einer der beiden Orte, an denen ein Client ein Event direkt an die anderen auslösen kann – Tippindikatoren und Cursor-Positionen berühren also nie Ihre API. Zehn pro Sekunde pro Verbindung, und der Sender empfängt sein eigenes Event nicht.
- 05
Verbindungszähler, wenn Sie sie brauchen.
Members beantworten, wer da ist. Aktivieren Sie Connection Counting und Connection-Count-Events, und bird:connection_count gibt an, wie viele Sockets auf dem Channel offen sind – also die Zahl, zu der die Person mit drei Tabs drei beiträgt.
Mitglied-adressierte Events
Manchmal ist das Ziel eine Person, kein Raum.
Ein angemeldetes Mitglied kann direkt adressiert werden – ohne einen Channel zu benennen und ohne ein Abonnement zu autorisieren. Ein Aufruf erreicht jede Verbindung, die diese Identität hält, über alle Tabs und Geräte hinweg, und niemand sonst, selbst wenn ein anderes Mitglied denselben Event-Namen bindet. Ohne aktive Verbindung ist der Aufruf trotzdem erfolgreich: Die Zustellung wird nicht in eine Warteschlange gestellt – speichern Sie die Benachrichtigung und laden Sie sie, wenn die Person zurückkehrt. Dieselbe Identität ist auch das Ziel von Disconnect, wenn eine Sitzung sofort enden muss.
// 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");
Eine Kontaktliste ist kein Raum.
Präsenz beantwortet, wer in diesem Raum mit mir ist. Watchlist-Events beantworten, ob die Personen, die mich interessieren, irgendwo online sind. Die signierte Identität eines Mitglieds kann bis zu 100 member ids enthalten, und mit aktivierten Watchlist-Events wird die Verbindung informiert, wenn eine davon online oder offline geht – mit dem aktuellen Status der gesamten Liste direkt nach der Anmeldung. Weil die Liste in der signierten Identität lebt, entscheidet Ihr Endpunkt, wer wen beobachten darf. Kein Channel pro Beziehung, und die beobachteten Personen müssen nichts weiter tun als sich anzumelden.
Tiefer in die Dokumentation einsteigen.
Presence channels behandelt die Mitgliederliste, member info und die serverseitigen Lesezugriffe. Authorizing channels ist der Vertrag, den Ihr Backend implementiert, sending events to a member vergleicht Member-Events mit privaten Channels, und watchlist events ist die Variante mit Beobachtungslisten.
In die Praxis umsetzen.
Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema. Die Ressourcen sind auf Englisch.
Der Rest von Realtime
Eine App, ein Schlüsselpaar. Entdecken Sie die weiteren Funktionen.
Zeigen Sie den Raum, nicht einen Ladezustand.
Presence, Client-Events und mitgliederbezogene Zustellung sind in jeder Realtime-App enthalten. Der kostenlose Plan umfasst 100 gleichzeitige Verbindungen.