fix: stop state ping-pong by removing broadcastStateRefresh from auto-persist
The CRDT auto-persist was broadcasting state-refresh after each save, causing other clients to fetch from DB and overwrite their local variables/characters with stale values. Since CRDT already syncs nodes/edges via yjs-update broadcasts, the state-refresh from auto-persist was redundant and destructive. Manual save still broadcasts state-refresh as intended. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
cd73b31739
commit
ec053d8126
|
|
@ -566,6 +566,11 @@ function FlowchartEditorInner({ projectId, projectName, userId, userDisplayName,
|
|||
},
|
||||
onPersist: async (persistNodes: FlowchartNode[], persistEdges: FlowchartEdge[]) => {
|
||||
try {
|
||||
// Auto-persist saves the current state for durability. We do NOT
|
||||
// broadcast state-refresh here because CRDT already syncs nodes/edges
|
||||
// via yjs-update broadcasts. Broadcasting here causes ping-pong:
|
||||
// other clients fetch from DB, overwrite their local variables/characters,
|
||||
// then their persist writes stale data back, causing a loop.
|
||||
await supabase
|
||||
.from('projects')
|
||||
.update({
|
||||
|
|
@ -577,8 +582,6 @@ function FlowchartEditorInner({ projectId, projectName, userId, userDisplayName,
|
|||
},
|
||||
})
|
||||
.eq('id', projectId)
|
||||
// Notify other clients to refresh after successful auto-persist
|
||||
realtimeRef.current?.broadcastStateRefresh()
|
||||
} catch {
|
||||
// Persistence failure is non-critical; will retry on next change
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue