From c667ff6a58b36b67bb92ff5a20df646e0777c6d5 Mon Sep 17 00:00:00 2001 From: haoyuren <13851610112@163.com> Date: Sun, 15 Mar 2026 19:13:57 -0500 Subject: Fix OT ack/error swallowed when doc transitions to editor mode When addEditorDoc is called while the bridge has in-flight OT ops (awaitingConfirm), the ack/error response was ignored because handleOtUpdate/handleOtError skipped editor docs entirely. This left the bridge's OtClient stuck and the edit appeared lost until removeEditorDoc re-discovered the discrepancy. Fix: always process acks regardless of editor doc status, and only skip OT errors for editor docs when the bridge has no OtClient. Co-Authored-By: Claude Opus 4.6 --- src/main/fileSyncBridge.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/fileSyncBridge.ts b/src/main/fileSyncBridge.ts index 296ed12..c9397f0 100644 --- a/src/main/fileSyncBridge.ts +++ b/src/main/fileSyncBridge.ts @@ -282,8 +282,11 @@ export class FileSyncBridge { } } - // For non-editor docs, handle ack (op with no ops array = ack for our own op) - if (!this.editorDocs.has(docId) && !update.op) { + // Handle ack — process even for editor docs so the bridge's OtClient + // can finish pending ops (e.g. ops sent just before addEditorDoc was called). + // Without this, the OtClient stays stuck in awaitingConfirm and the ops + // appear lost until removeEditorDoc re-discovers the discrepancy. + if (!update.op) { const otClient = this.otClients.get(docId) if (otClient) { otClient.onAck() @@ -298,7 +301,12 @@ export class FileSyncBridge { const error = args[0] as { doc?: string; message?: string } | undefined if (!error?.doc) return const docId = error.doc - if (this.editorDocs.has(docId)) return // renderer handles editor docs + + // Don't skip editor docs entirely — the bridge may have sent ops just before + // addEditorDoc was called, and the error response arrives after. If we skip, + // the bridge's OtClient stays stuck and the ops are silently lost. + // Only skip if the bridge has no OtClient for this doc. + if (this.editorDocs.has(docId) && !this.otClients.has(docId)) return const relPath = this.docPathMap[docId] if (!relPath) return -- cgit v1.2.3