diff options
Diffstat (limited to 'src/main/overleafSocket.ts')
| -rw-r--r-- | src/main/overleafSocket.ts | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/main/overleafSocket.ts b/src/main/overleafSocket.ts index 811e433..195eb05 100644 --- a/src/main/overleafSocket.ts +++ b/src/main/overleafSocket.ts @@ -155,6 +155,10 @@ export class OverleafSocket extends EventEmitter { this.ws.on('close', () => { this.stopHeartbeat() + // Clear pending ack callbacks to prevent timeout errors after reconnect + for (const [id, cb] of this.ackCallbacks) { + this.ackCallbacks.delete(id) + } if (this._state === 'connected' && this.shouldReconnect) { this.scheduleReconnect() } @@ -298,8 +302,10 @@ export class OverleafSocket extends EventEmitter { } async applyOtUpdate(docId: string, ops: unknown[], version: number, hash: string): Promise<void> { - // Fire-and-forget: server responds with otUpdateApplied or otUpdateError event - this.ws?.send(encodeEvent('applyOtUpdate', [docId, { doc: docId, op: ops, v: version, hash, lastV: version }])) + // Use emitWithAck so the server's callback response comes back as a Socket.IO ack + // Do NOT send hash — Overleaf's document-updater hash check causes disconnect + rollback on mismatch + const result = await this.emitWithAck('applyOtUpdate', [docId, { doc: docId, op: ops, v: version }]) + if (result) console.log(`[applyOtUpdate] ack for ${docId} v=${version}`) } /** Get list of connected users with their cursor positions */ |
