Skip to content

Commit 25087e6

Browse files
nieaoclaude
andcommitted
fix(yjsSync): 用同步恢复 _suppressLocalPush, 不用 microtask
根本 bug: applyRemoteToLocal 用 queueMicrotask 恢复 _suppressLocalPush. 但 finalizeStartup 是这个调用顺序: 1. applyRemoteToLocal() ← 这里 wasSuppressed = true (启动时), microtask 排队恢复 true 2. _suppressLocalPush = false ← 同步设 3. (调用栈结束) 4. microtask: _suppressLocalPush = wasSuppressed (true) ← 又锁死! 结果: _suppressLocalPush 永远是 true, 浏览器创建的所有节点 (Aletheia ontologyNode + promote 的 TaskNode) 全部漏 push 到 yjs, conductor 看不见, ResultNode 永不涌现. 实测确认: window.__yjsDebug.isSuppressed() === true. 浏览器 zustand 11 nodes / 2 TaskNodes, yjs 只有 10 / 1. 修复: 同步恢复, setState 是 sync 调用 callback 也 sync 触发, suppress 已经在 setState 期间生效, 不需要 microtask 延迟. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 410da83 commit 25087e6

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

src/collab/yjsSync.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,17 @@ function applyRemoteToLocal() {
170170
const edges = []
171171
yEdges.forEach((v) => edges.push(v))
172172

173+
// ⚠ 不要用 microtask 恢复 _suppressLocalPush — finalizeStartup 调完
174+
// applyRemoteToLocal 后会设 _suppressLocalPush = false, 但 microtask 在那之后
175+
// 才把 wasSuppressed=true 写回, 永远把 _suppressLocalPush 锁死在 true,
176+
// 结果浏览器派的新节点全都漏 push 到 yjs.
177+
// 同步恢复就行 — setState 是 sync 调用, callback 也 sync 触发, suppress 已生效.
173178
const wasSuppressed = _suppressLocalPush
174179
_suppressLocalPush = true
175180
try {
176181
useCanvasStore.setState({ nodes, edges })
177182
} finally {
178-
queueMicrotask(() => { _suppressLocalPush = wasSuppressed })
183+
_suppressLocalPush = wasSuppressed
179184
}
180185
}
181186

0 commit comments

Comments
 (0)