yuetsh
66a564710f
fix(collab): 两处会让协作「看起来正常、其实各写各的」的缺陷
都是实测复现出来的,不是推测。
1. 教师第二次接单,看到的是上一个学生的代码拼在自己文档里
CollabModal 的 code ref 跨会话不清。n-modal 默认 display-directive="if",
每次打开都重挂 CodeMirror,拿这个 ref 当初始文档;而 yCollab 只观察 ytext、
从不反过来用 ytext 覆盖编辑器。于是上一轮的代码留在文档里,新学生的内容
作为 delta 插到位置 0,两边偏移从此对不上。
实测三轮会累积成 CCC/BBB/AAA/XXX,且教师敲一行之后,教师看到
「BBB/AAA/XXX」、学生看到「BBB/XXX」——两份不同的文档。
改法:不绑 v-model,文档完全交给 Yjs;并把 start 的起点从「房间打开 +
await nextTick」换成「编辑器 ready」,顺带修掉绑到已 destroy 的旧 view。
2. 学生换连接后房间静默死掉
handleCollabOpen 迁移 socket 时只补发了 help_status,没补 room_open,
而前端每次连接建立都会把 room 清成 null —— 页面显示「老师正在帮你」,
编辑器却早把 yCollab 摘了,老师敲的字一个也到不了。
补发 room_open 也修不好:CRDT 状态跟着旧连接没了,新建 Y.Doc 再 seed
会和老师那份合并成重复文本。所以改成直接拆房、请求退回排队,
老师再点一次 —— 和老师掉线走同一条路子。
顺带修掉验证时挖出来的第三个:握手帧会被丢。
两端挂 yCollab 的时刻不同步(教师等模态框、学生等 chunk),先挂好的那端发的
SyncStep1 到对面时还没有 binaryHandler,服务端转发是成功的、客户端却静静丢掉。
丢的偏偏是握手——y-protocols 里 A 的内容靠 B 发的 Step1 换回来,教师的 Step1
一丢,学生的代码就永远到不了教师那边(单向同步,同样看着像在协作)。
CollabWebSocket 改成 handler 装上之前先把二进制帧缓着,装上再按序放行。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016DHxhKNxXfG89JnVzHbvgj
2026-08-30 09:37:41 -06:00
..
2026-08-30 09:37:41 -06:00
2026-08-30 09:37:41 -06:00