diff --git a/api/controllers/console/app/online_user.py b/api/controllers/console/app/online_user.py index 0c653f47bc..db8076e65a 100644 --- a/api/controllers/console/app/online_user.py +++ b/api/controllers/console/app/online_user.py @@ -140,10 +140,10 @@ def handle_collaboration_event(sid, data): return {"msg": "event_broadcasted"} -@sio.on("graph_update") -def handle_graph_update(sid, data): +@sio.on("graph_event") +def handle_graph_event(sid, data): """ - Handle graph updates - simple broadcast relay. + Handle graph events - simple broadcast relay. """ mapping = redis_client.get(f"ws_sid_map:{sid}") diff --git a/web/app/components/workflow/collaboration/manage.ts b/web/app/components/workflow/collaboration/manage.ts index 4ff51ead57..fd8ac52db2 100644 --- a/web/app/components/workflow/collaboration/manage.ts +++ b/web/app/components/workflow/collaboration/manage.ts @@ -1,13 +1,13 @@ import { LoroDoc } from 'loro-crdt' import { isEqual } from 'lodash-es' -import { useWebSocketStore } from '../store/websocket-store' +import { type WebSocketInstance, useWebSocketStore } from '../store/websocket-store' import type { Edge, Node } from '../types' class LoroSocketIOProvider { - private doc: any - private socket: any + private doc: LoroDoc + private socket: WebSocketInstance - constructor(socket: any, doc: any) { + constructor(socket: WebSocketInstance, doc: LoroDoc) { this.socket = socket this.doc = doc this.setupEventListeners() @@ -15,9 +15,9 @@ class LoroSocketIOProvider { private setupEventListeners() { this.doc.subscribe((event: any) => { - if (event.origin !== 'remote') { + if (event.by === 'local') { const update = this.doc.export({ mode: 'update' }) - this.socket.emit('graph_update', update) + this.socket.emit('graph_event', update) } }) @@ -59,9 +59,9 @@ class CollaborationManager { console.log('nodesMap', event) if (event.by === 'import') { requestAnimationFrame(() => { - const { setNodes } = reactFlowStore.getState() + const { setNodes: reactFlowSetNodes } = reactFlowStore.getState() const updatedNodes = Array.from(this.nodesMap.values()) - setNodes(updatedNodes) + reactFlowSetNodes(updatedNodes) }) } }) @@ -69,9 +69,9 @@ class CollaborationManager { this.edgesMap?.subscribe((event: any) => { if (event.by === 'import') { requestAnimationFrame(() => { - const { setEdges } = reactFlowStore.getState() + const { setEdges: reactFlowSetEdges } = reactFlowStore.getState() const updatedEdges = Array.from(this.edgesMap.values()) - setEdges(updatedEdges) + reactFlowSetEdges(updatedEdges) }) } }) diff --git a/web/app/components/workflow/store/websocket-store.ts b/web/app/components/workflow/store/websocket-store.ts index 41fd594d8e..8349172585 100644 --- a/web/app/components/workflow/store/websocket-store.ts +++ b/web/app/components/workflow/store/websocket-store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { connectOnlineUserWebSocket } from '@/service/demo/online-user' -type WebSocketInstance = ReturnType +export type WebSocketInstance = ReturnType type WebSocketStore = { socket: WebSocketInstance | null @@ -35,7 +35,7 @@ export const useWebSocketStore = create((set, get) => ({ try { handler(update) } - catch (error) { + catch (error) { console.error(`Error in collaboration event handler for ${update.type}:`, error) } })