实时在线状态

谁在这里。 无需调用您的 API。

订阅在线状态频道后,当前名册会随订阅一起送达,因此房间渲染时就已有成员,而非空白一片。此后,每个客户端都会收到相同的加入和离开通知。您的后端在签署订阅时为每个成员分配身份,这正是名册值得信赖的原因。

room.ts
18 members
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 的一部分,它计算的是身份而非会话。当成员的第一个连接订阅时加入列表,当最后一个连接断开时离开列表;中间的标签页不产生任何事件,因此每当有人打开重复窗口时,名册不会闪烁。如果您需要的是套接字计数,那是一个单独的应用设置和单独的事件。

在线状态为您提供什么

名册、变更以及将两者关联的身份标识。全部由您自己的后端签名。

  1. 01

    名册,到达即可用。

    bird:subscription_succeeded 携带当前成员列表,因此首次渲染就是真实的房间。您在此基础上应用加入和离开事件,而非从空状态构建列表。

  2. 02

    由您掌控的身份标识。

    您的授权端点返回成员 ID 和可选的成员信息,并对该精确字符串进行签名。客户端可以请求订阅,但无法选择自己的身份。成员信息应限于显示名称或头像等小型公开资料数据:频道中的每个成员都会收到它,且上限为 1 KB。

  3. 03

    从服务器端读取。

    列出频道的成员,或直接通过 API 查询 member_count 而无需列出成员。两者都不需要订阅,因此后端无需加入房间即可查询谁在其中。成员计数仅适用于在线状态频道;在公共或私有频道上查询会返回验证错误,因为这些频道没有成员。

  4. 04

    对等端之间的客户端事件。

    在线状态频道是客户端可以直接向其他人触发事件的两种场所之一,因此输入指示器和光标位置永远不会经过您的 API。每个连接每秒十个事件,且发送者不会收到自己的事件。

  5. 05

    在需要时获取连接计数。

    成员回答的是谁在这里。开启连接计数和连接计数事件后,bird:connection_count 回答的是频道上有多少个打开的套接字——也就是那个开了三个标签页的人贡献了三个连接的数字。

成员定向事件

有时目标是一个人,而非一个房间。

已登录的成员可以被直接寻址,无需指定频道名称,也无需授权订阅。一次调用即可到达该身份持有的每个连接,跨越每个标签页和设备,且不会触达其他人,即使另一个成员绑定了相同的事件名称。如果他们没有活跃连接,调用仍然成功:消息不会排队,因此请存储通知并在他们回来时加载。同一身份也是会话需要立即结束时断开连接的目标。

members.ts
server
// 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,启用关注列表事件后,当其中任何人上线或离线时连接都会收到通知,整个列表的当前状态在登录后立即送达。因为列表存在于签名身份中,您的端点决定谁可以关注谁。无需为每个关系创建频道,被关注的人只需正常登录即可。

深入了解文档。

在线状态频道涵盖名册、成员信息和服务器端读取。频道授权是您的后端实现的契约,向成员发送事件将成员事件与私有频道进行比较,关注列表事件是关注列表变体。

付诸实践。

继续查阅此主题的文档、指南和示例。资源为英文。

动手实践并获取实施简报

渲染房间,而非加载状态。

每个 Realtime 应用均内置在线状态、客户端事件和成员定向推送功能。免费计划支持 100 个并发连接。

从一个渠道开始。
准备好后,再添加其他渠道。

测试 API 密钥即刻可用。添加支付方式并验证发送者身份后,即可解锁生产环境。

正在使用 Claude Code、Cursor 或 Codex?复制一条设置提示,您的智能代理即可自动安装 Bird CLI 和相关技能。选择您的工具:

Cursor