P13-02 · 房主绘制实时广播
- Phase / ID: P13-02
- Depends on: P13-01 room snapshot viewer
- Files:
site/app/composables/useYunlefunCloudRooms.ts、site/app/composables/useSiteCloudRoomCollaboration.ts、site/app/utils/cloudRoomOperations.ts、site/app/pages/index.vue - Effort: L
Context
在只读房间成立后,第二步让房主绘制时其它成员实时看到。低延迟 preview 可以走临时 presence,但最终状态必须由服务端排序后的 stroke:commit 决定。
Acceptance
- [x] 房主 stroke commit 能以最终像素状态广播给观看者。P13 v1 使用 committed tile patch + polling,优先保证最终一致。
- [x] stroke commit 进入服务端排序 operation log。
saier-room-api.appendOperation已按baseRevision分配 revision,并以clientOpId幂等去重;site 端通过useSiteCloudRoomCollaboration()追加 committed tile patch payload。 - [x] 观看者按 revision 顺序 replay committed stroke。当前实现使用 polling
listOperations(afterRevision)+ committed tile patch apply,后续可替换为更轻的SaierStrokeCommitpayload / realtime transport。 - [x] smudge / water / sampler 类笔刷严格按服务端顺序应用。当前 data plane 传输最终 tile patch,优先保证像素一致性;语义 stroke replay 优化留到后续。
- [x] 网络乱序 / 重复消息不会造成重复 stroke。handler 单测覆盖重复
clientOpId不重复写入;stalebaseRevision返回revision_conflict。 - [x] replay 后可生成像素 hash 或 patch hash 用于一致性检查。
cloudRoomOperations为 committed patch 生成稳定patchHash,单测覆盖确定性。
Implementation Notes
cloudbase/functions/saier-room-api已提供appendOperation/listOperations,作为 P13-02 的持久 op log 后端。useSiteCloudRoomCollaboration()已接入updatePresenceheartbeat,成员在线态和当前工具 / 图层 presence 不进入持久 log。- 低延迟 ghost preview 不作为 P13 v1 的 correctness gate。当前先同步 committed patch;后续如需要笔迹“正在画”的观感,再通过 presence / realtime 层补
stroke:start/stroke:appendpreview。 - painter 目前没有 per-instance stroke recorder 暴露给 site;当前用 committed tile patch 保证正确性。后续若要降低带宽,需要按 Stroke Recording 补
SaierStrokeCommitrecorder / replay API。
Out of scope
- 多人同时绘制。
- layer / document command 同步。
- 离线编辑。