跳转到内容

订阅 Realtime 资源

资源观察用于订阅房间资源。带版本资源可以携带恢复游标,播放信息始终返回当前播放源可直接交给播放器使用的数据。资源变化时,服务端可以推送完整 payload,也可以只通知客户端重新拉取。

资源 ObserveResource.resource 字段 版本来源 典型用途
播放状态 playbackState RoomPlaybackState.version 播放器 UI、同步当前播放时间和状态
播放信息 playback 每次观察返回当前值 获取当前播放源 URL、header、代理策略和过期时间
房间设置 roomSettings 房间设置版本 控制聊天、播放权限等 UI
播放列表项 playlistItems 列表快照版本 根列表、子播放列表、provider 浏览和搜索结果
房间成员 roomMembers 成员列表快照版本 成员列表、分页、搜索、角色和状态过滤

每个观察由 observeId 标识。observeId 只需要在当前连接内唯一,长度 1-128。使用稳定命名,例如 playback-stateplaylist-root:p1:50members:online

每条连接最多保留 64 个观察。超过限制时服务端返回 ResourceObserveError,不会关闭 WebSocket。

行为
0 等同于 PUSH_SNAPSHOT
2 变化时推送完整 ResourceChanged.payload,适合低延迟 UI
1 变化时只推送 changedOnly,客户端随后通过 HTTP/gRPC 拉取
  1. 客户端连接房间 WebSocket。
  2. 客户端发送 ClientMessage.observeResource,包含 observeIddeliveryMode 和目标资源。支持恢复游标的资源还可以带事件序列。
  3. 服务端加载当前资源,返回 ServerMessage.resourceObserved
  4. 如果服务端判断资源已变化,随后返回同一 observeIdServerMessage.resourceChanged
  5. 连接期间,房间事件、缓存失效、Provider credential 变更或播放信息过期会触发重新评估。

ResourceObserved 字段:

字段 说明
observeId 对应客户端提交的订阅 ID
changed 服务端当前资源是否需要发送给客户端
eventCursor 支持事件回放资源的恢复游标

ResourceChanged 字段:

字段 说明
observeId 哪个订阅发生变化
payload 完整快照或 changedOnly,取决于 deliveryMode
eventCursor 已回放资源事件对应的游标

不再需要某个视图、列表或查询时,发送 ClientMessage.unobserveResource

sendClientMessage({
unobserveResource: {
observeId: 'playlist-root',
},
});

取消订阅没有确认消息。断开连接时,服务端会自动清理该连接上的所有观察。

下面示例是 TypeScript 风格伪代码。实际字段名取决于你使用的 protobuf 代码生成器。

sendClientMessage({
observeResource: {
observeId: 'playback-state',
deliveryMode: 2,
playbackState: {
afterEventSequence: cached.playbackStateEventSequence,
},
},
});

服务端变化时返回 ResourceChanged.payload.playbackState

事件类型 刷新资源
播放状态变化 playbackStateplayback
当前播放媒体或播放列表相关媒体更新 playback,必要时 playlistItems
播放列表创建、更新、删除、重排或媒体增删 playlistItems
房间设置变化 roomSettingsroomMembers
用户加入、离开或权限变化 roomMembers
缓存失效命中当前房间或用户 对应的播放、设置、列表或成员资源
Provider credential 变更 可能影响当前用户播放信息和 provider 浏览结果
播放信息过期 到期后自动重新评估 playback 观察

服务端会对同一房间内相同查询做短窗口合并,减少多个连接同时订阅同一资源时的重复快照加载。客户端不需要依赖这个优化,但可以为多个视图建立独立 observeId