Canales de presencia
Un canal cuyo nombre empieza con presence- usa la autorización de canal privado y añade identidad de miembro. Tu backend asigna a cada suscriptor un member_id. Los suscriptores reciben la lista actual de miembros y eventos cuando los miembros se unen o abandonan el canal.
Usa canales de presencia para listas de usuarios en línea, visualizadores de documentos, indicadores de escritura o cursores colaborativos.
Suscripción
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 y Kotlin, subscribe devuelve un tipo de canal base. Conviértelo a PresenceChannel antes de acceder a myId o members. Swift proporciona un mapa de miembros para bird:subscription_succeeded y un Member para eventos de entrada y salida. Kotlin proporciona cada evento como JsonElement. En ambos clientes, lee el listado actual desde room.members.
bird:subscription_succeeded se dispara cuando la suscripción se completa. En ese momento, room.members contiene el listado actual y room.myId contiene tu member_id. Renderiza este listado inicial antes de aplicar los eventos posteriores de entrada y salida.
La autorización sigue el mismo flujo que un canal privado con una adición: tu endpoint devuelve member_data, una cadena JSON que contiene member_id y member_info opcional, y debe firmar esa cadena exacta. Consulta Autorización de canales.
Usa member_info de forma segura
Cada miembro del canal recibe member_info. Úsalo para datos pequeños de perfil público, como un nombre visible o una URL de avatar. No incluyas direcciones de correo electrónico, roles de autorización ni otros datos sensibles.
Tu backend asigna member_id y member_info en su respuesta de autorización firmada. El cliente puede solicitar una suscripción, pero no puede elegir la identidad firmada.
Miembros y conexiones
Un miembro puede tener varias conexiones. Por ejemplo, tres pestañas abiertas producen un miembro y tres conexiones:
| Qué ocurre | Evento de miembro | Conexiones del canal |
|---|---|---|
| Primera pestaña se suscribe | bird:member_added | 1 |
| Segunda pestaña se suscribe | ninguno | 2 |
| Segunda pestaña se cierra | ninguno | 1 |
| Última pestaña se cierra | bird:member_removed | 0 |
room.members representa identidades, no sesiones. Para recibir el número de conexiones abiertas, activa Connection counting y Connection count events, y luego bindea bird:connection_count.
Lectura de presencia desde tu servidor
Existen dos lecturas del lado del servidor, y ninguna requiere una suscripción:
- Listar miembros del canal devuelve los valores member_id actualmente suscritos a un canal de presencia.
- Obtener un canal con include=member_count devuelve cuántos miembros están presentes, sin listarlos.
member_count es exclusivo de presencia. Solicitarlo en un canal público o privado produce un error de validación, porque esos canales no tienen miembros.
También puedes solicitarlo al publicar, lo que devuelve el estado de cada canal de destino en ese momento. Consulta Publicación de eventos.
Próximos pasos
- Autorización de canales cubre member_data y la cadena que firma tu backend.
- Canales privados usan la misma autorización sin identidad.
- Excluir destinatarios de eventos evita que un cliente reciba su propio cambio.
Recursos relacionados
Continúa con la documentación, guías y ejemplos sobre este tema. Los recursos están en inglés.
Explorar la funcionalidadRealtimeSeguir la ruta de aprendizajeBuild your first integrationGuía de implementaciónSend your first realtime event
Prueba el ejercicio y obtén un resumen de implementación