跳转到内容

Realtime 资源观察

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

资源ObserveResource.resource 字段版本来源典型用途
播放状态playbackStateRoomPlaybackState.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