订阅在线状态频道后,当前名册会随订阅一起送达,因此房间渲染时就已有成员,而非空白一片。此后,每个客户端都会收到相同的加入和离开通知。您的后端在签署订阅时为每个成员分配身份,这正是名册值得信赖的原因。
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() });
});
成员是一个人,而非一个套接字。
三个标签页算一个成员。
在线状态是 Bird Realtime API 的一部分,它计算的是身份而非会话。当成员的第一个连接订阅时加入列表,当最后一个连接断开时离开列表;中间的标签页不产生任何事件,因此每当有人打开重复窗口时,名册不会闪烁。如果您需要的是套接字计数,那是一个单独的应用设置和单独的事件。
在线状态为您提供什么
名册、变更以及将两者关联的身份标识。全部由您自己的后端签名。
- 01
名册,到达即可用。
bird:subscription_succeeded 携带当前成员列表,因此首次渲染就是真实的房间。您在此基础上应用加入和离开事件,而非从空状态构建列表。
- 02
由您掌控的身份标识。
您的授权端点返回成员 ID 和可选的成员信息,并对该精确字符串进行签名。客户端可以请求订阅,但无法选择自己的身份。成员信息应限于显示名称或头像等小型公开资料数据:频道中的每个成员都会收到它,且上限为 1 KB。
- 03
从服务器端读取。
列出频道的成员,或直接通过 API 查询 member_count 而无需列出成员。两者都不需要订阅,因此后端无需加入房间即可查询谁在其中。成员计数仅适用于在线状态频道;在公共或私有频道上查询会返回验证错误,因为这些频道没有成员。
- 04
对等端之间的客户端事件。
在线状态频道是客户端可以直接向其他人触发事件的两种场所之一,因此输入指示器和光标位置永远不会经过您的 API。每个连接每秒十个事件,且发送者不会收到自己的事件。
- 05
在需要时获取连接计数。
成员回答的是谁在这里。开启连接计数和连接计数事件后,bird:connection_count 回答的是频道上有多少个打开的套接字——也就是那个开了三个标签页的人贡献了三个连接的数字。
成员定向事件
有时目标是一个人,而非一个房间。
已登录的成员可以被直接寻址,无需指定频道名称,也无需授权订阅。一次调用即可到达该身份持有的每个连接,跨越每个标签页和设备,且不会触达其他人,即使另一个成员绑定了相同的事件名称。如果他们没有活跃连接,调用仍然成功:消息不会排队,因此请存储通知并在他们回来时加载。同一身份也是会话需要立即结束时断开连接的目标。
// 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");
好友列表不是房间。
在线状态回答的是谁在这个房间里。关注列表事件回答的是我关心的人是否在任何地方在线。成员的签名身份最多可携带 100 个成员 ID,启用关注列表事件后,当其中任何人上线或离线时连接都会收到通知,整个列表的当前状态在登录后立即送达。因为列表存在于签名身份中,您的端点决定谁可以关注谁。无需为每个关系创建频道,被关注的人只需正常登录即可。
付诸实践。
继续查阅此主题的文档、指南和示例。资源为英文。