Find the anon key with npx @insforge/cli secrets get ANON_KEY, or in the dashboard: click Install and open API Keys.
思维模型
TypeScript SDK 向您的 InsForge 后端打开一个 Socket.IO 连接。您订阅命名频道、监听事件名称,并可选地将事件发布回您已加入的频道。
事件可以来自两个地方:
- 调用
realtime.publish(channel, event, payload) 的数据库触发器。
- 调用
insforge.realtime.publish(channel, event, payload) 的客户端。
有关后端频道和 RLS 模型,请参见实时概述。
快速开始
在调用 connect() 之前注册 connect、disconnect、connect_error 和 error 处理程序,以便早期连接失败可见。
connect()
建立 WebSocket 连接。
返回:
注意事项:
- 当存在当前身份验证令牌时,SDK 会包含它。如果没有登录用户,它可以使用配置的匿名密钥。
- 在连接已在进行中时的多次
connect() 调用会重用相同的连接 promise。
- 连接尝试在 10 秒后超时。
subscribe()
订阅频道并接收当前的在线状态快照。
参数:
| 参数 | 类型 | 描述 |
|---|
channel | string | 解析的频道名称,如 orders、order:123 或 chat:room-1。 |
返回:
subscribe() 会在需要时自动连接。仍建议显式调用 connect(),以便连接事件处理程序已附加。
subscribe() 是幂等的:对您已加入的频道再次调用它会重新请求订阅并解析服务器当前的在线状态快照。服务器按逻辑成员追踪在线状态,因此重复订阅永远不会产生重复成员或虚假的 presence:join 事件。
publish()
将事件发布到频道。
参数:
| 参数 | 类型 | 描述 |
|---|
channel | string | 要发布到的频道。客户端必须已经订阅。 |
event | string | 订阅者监听的事件名称。 |
payload | Record<string, unknown> | JSON 可序列化的消息载荷。 |
发布需要先成功订阅同一频道。如果在 realtime.messages 上启用了 RLS,发布也会根据 INSERT 策略进行检查。
发布失败通过 error 事件发出。
on()
监听自定义事件、连接事件、在线状态事件和实时错误。
保留事件:
| 事件 | 载荷 | 描述 |
|---|
connect | 无 | WebSocket 已连接。 |
connect_error | Error | 初始连接或重新连接失败。 |
disconnect | string | WebSocket 已断开连接。 |
error | RealtimeErrorPayload | 订阅或发布失败。 |
presence:join | PresenceJoinMessage | 逻辑成员在频道中变为在线。 |
presence:leave | PresenceLeaveMessage | 逻辑成员在频道中不再在线。 |
presence:sync | PresenceSyncEvent | 频道的新在线状态快照。在每次成功订阅时触发,包括重新连接后的自动重新订阅。 |
once()
监听事件一次,然后自动移除监听器。
off()
移除事件监听器。
unsubscribe()
离开频道。
unsubscribe() 是即发即忘的。如果这是逻辑成员的最后一个套接字,其他订阅者会收到 presence:leave。
disconnect()
关闭 WebSocket 并清除本地订阅。
消息结构
传递的消息包括您的载荷字段加上服务器元数据。
元数据:
对于数据库触发的消息,senderType 为 system;对于客户端发布的消息,senderType 为 user。
在线状态
成功的订阅会返回当前的在线状态快照。
在线状态成员:
监听变化:
读取在线状态
SDK 为每个已订阅的频道维护成员列表 — 从订阅快照初始化,并通过 presence:join/presence:leave 增量和重新连接重新同步保持最新。随时读取它,而不是自己合并增量:
对于您未订阅的频道,返回空数组。当套接字短暂断开连接时,它保留最后已知的状态,一旦频道重新订阅就会被新快照替换。
重新连接
当连接断开时,SDK 会在重新连接时自动重新订阅每个频道,并为每个频道发出带有新在线状态快照的 presence:sync。在您断开连接期间加入或离开的成员不会产生单独的 presence:join/presence:leave 增量,因此请替换(而非合并)您在 SDK 之外保留的任何状态:
如果您直接从 getPresenceState() 渲染,presence:sync 只是您的重新渲染信号。如果重新订阅被拒绝(例如用户的访问权限在断开连接时被撤销),SDK 会丢弃该频道并改为发出 error。
令牌刷新
当已登录用户的访问令牌刷新时,SDK 会让已建立的套接字保持连接 — 没有带内重新身份验证、重新连接或在线状态波动。稍后的初始连接或网络重新连接会在其握手之前获取最新的访问令牌。登录、登出或切换用户会以新身份重新连接套接字。
访问权限降低会在实时连接上惰性应用:发布会在每条消息上根据 RLS 重新检查,新订阅会在加入时重新检查,但对已加入频道的持续接收会一直持续,直到客户端取消订阅或重新连接。
| 属性 | 类型 | 描述 |
|---|
isConnected | boolean | 套接字当前是否已连接。 |
connectionState | 'disconnected' | 'connecting' | 'connected' | 当前 SDK 连接状态。 |
socketId | string | undefined | 连接时的 Socket.IO ID。 |
getSubscribedChannels() | () => string[] | 已订阅频道的本地列表。 |
getPresenceState(channel) | (channel: string) => PresenceMember[] | 由 SDK 维护的已订阅频道的当前成员。 |
错误处理
常见实时错误代码:
| 代码 | 含义 |
|---|
REALTIME_UNAUTHORIZED | RLS 或频道匹配拒绝了订阅或发布。 |
REALTIME_NOT_SUBSCRIBED | 客户端尝试在订阅频道之前发布。 |
INTERNAL_ERROR | 后端无法完成实时操作。 |
完整示例