Canaux de présence
Un canal dont le nom commence par presence- utilise l'autorisation de canal privé et ajoute l'identité du membre. Votre backend attribue à chaque abonné un member_id. Les abonnés reçoivent la liste actuelle des membres et les événements lorsque des membres rejoignent ou quittent le canal.
Utilisez les canaux de présence pour des listes de présence en ligne, des indicateurs de consultation de documents, des indicateurs de saisie ou des curseurs collaboratifs.
Abonnement
const room = bird.subscribe("presence-room-1");
room.bind("bird:subscription_succeeded", () => {
console.log("me:", room.myId);
console.log("here now:", [...room.members.values()]);
});
room.bind("bird:member_added", (member) => console.log("joined", member.member_id));
room.bind("bird:member_removed", (member) => console.log("left", member.member_id));guard let room = bird.subscribe("presence-room-1") as? PresenceChannel else { return }
room.bind(BirdProtocol.Event.subscriptionSucceeded) { _ in
print("me:", room.myId ?? "")
print("here now:", room.members.keys)
}
room.bind(BirdProtocol.Event.memberAdded) { member in
print("joined", (member as? Member)?.memberId ?? "")
}
room.bind(BirdProtocol.Event.memberRemoved) { member in
print("left", (member as? Member)?.memberId ?? "")
}val room = bird.subscribe("presence-room-1")
if (room is PresenceChannel) {
room.bind(BirdProtocol.Event.SUBSCRIPTION_SUCCEEDED) {
println("me: ${room.myId}")
println("here now: ${room.members.keys}")
}
room.bind(BirdProtocol.Event.MEMBER_ADDED) { data ->
println("joined ${data?.jsonObject?.get("member_id")?.jsonPrimitive?.content}")
}
room.bind(BirdProtocol.Event.MEMBER_REMOVED) { data ->
println("left ${data?.jsonObject?.get("member_id")?.jsonPrimitive?.content}")
}
}En Swift et Kotlin, subscribe renvoie un type de canal de base. Convertissez-le en PresenceChannel avant d'accéder à myId ou members. Swift fournit une map de membres pour bird:subscription_succeeded et un Member pour les événements de connexion et de déconnexion. Kotlin fournit chaque événement sous forme de JsonElement. Dans les deux clients, lisez la liste actuelle depuis room.members.
bird:subscription_succeeded se déclenche lorsque l'abonnement est terminé. À ce moment, room.members contient la liste actuelle et room.myId contient votre member_id. Affichez cette liste initiale avant d'appliquer les événements ultérieurs de connexion et de déconnexion.
L'autorisation suit le même flux qu'un canal privé avec un ajout : votre endpoint renvoie member_data, une chaîne JSON contenant member_id et un member_info optionnel, et il doit signer cette chaîne exacte. Voir Autoriser les canaux.
Utilisez member_info en toute sécurité
Chaque membre du canal reçoit member_info. Utilisez-le pour de petites données de profil public telles qu'un nom d'affichage ou une URL d'avatar. N'incluez pas d'adresses e-mail, de rôles d'autorisation ou d'autres données sensibles.
Votre backend attribue member_id et member_info dans sa réponse d'autorisation signée. Le client peut demander un abonnement mais ne peut pas choisir l'identité signée.
Membres et connexions
Un membre peut avoir plusieurs connexions. Par exemple, trois onglets ouverts produisent un membre et trois connexions :
| Ce qui se passe | Événement membre | Nombre de connexions au canal |
|---|---|---|
| Le premier onglet s'abonne | bird:member_added | 1 |
| Le deuxième onglet s'abonne | aucun | 2 |
| Le deuxième onglet se ferme | aucun | 1 |
| Le dernier onglet se ferme | bird:member_removed | 0 |
room.members représente des identités plutôt que des sessions. Pour recevoir le nombre de connexions ouvertes, activez Connection counting et Connection count events, puis bindez bird:connection_count.
Lire la présence depuis votre serveur
Deux lectures côté serveur existent, et aucune ne nécessite d'abonnement :
- Lister les membres du canal renvoie les valeurs member_id actuellement abonnées à un canal de présence.
- Obtenir un canal avec include=member_count renvoie le nombre de membres présents, sans les lister.
member_count est réservé aux canaux de présence. Le demander sur un canal public ou privé est une erreur de validation, car ces canaux n'ont pas de membres.
Vous pouvez aussi le demander lors de la publication, ce qui renvoie l'état de chaque canal cible à cet instant. Voir Publier des événements.
Étapes suivantes
- Autoriser les canaux couvre member_data et la chaîne que votre backend signe.
- Canaux privés offrent la même autorisation sans identité.
- Exclure les destinataires d'événements empêche un client de recevoir son propre changement.
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.
Explorer la fonctionnalitéRealtimeSuivre le parcours d'apprentissageBuild your first integrationGuide d'implémentationSend your first realtime event
Essayez la pratique et obtenez un guide d'implémentation