canvu-react 0.4.43 → 0.4.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/realtime/protocol.ts","../src/realtime/use-realtime-canvas-document.ts","../src/realtime/use-realtime-peer-follow.ts","../src/realtime/yjs-document.ts","../src/realtime/use-realtime-session.ts"],"names":["useState","useRef","useCallback","useEffect","useMemo","Y","id","previous","options","mergedItems"],"mappings":"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","file":"realtimeNative.cjs","sourcesContent":["import type {\n\tRealtimeConnectionState,\n\tRemotePresenceCamera,\n\tRemotePresenceMarkupStroke,\n\tRemotePresencePeer,\n} from \"../react/presence/types\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type RealtimeSessionPeer = RemotePresencePeer & {\n\treadonly clientId: string;\n\treadonly peerId: string;\n\treadonly roomId: string;\n\treadonly joinedAt: number;\n\treadonly lastSeenAt: number;\n\treadonly isSelf: boolean;\n\treadonly connectionState?: RealtimeConnectionState;\n};\n\nexport type RealtimeDocumentSnapshot = {\n\treadonly revision: number;\n\treadonly items: VectorSceneItem[];\n\treadonly updatedAt: number;\n\treadonly updatedByClientId?: string;\n\treadonly persistedRevision?: number;\n};\n\nexport type RealtimeConnectionInfo = {\n\treadonly state: RealtimeConnectionState;\n\treadonly connected: boolean;\n\treadonly roomId: string;\n\treadonly clientId: string | null;\n\treadonly retryCount: number;\n\treadonly lastConnectedAt: number | null;\n\treadonly lastMessageAt: number | null;\n\treadonly lastPongAt: number | null;\n\treadonly lastError: string | null;\n};\n\nexport type RealtimePresencePayload = {\n\treadonly cursor: { readonly x: number; readonly y: number } | null;\n\treadonly markupStroke?: RemotePresenceMarkupStroke | null;\n\treadonly camera?: RemotePresenceCamera | null;\n\treadonly activeTool?: string;\n};\n\nexport type RealtimeClientPeer = {\n\treadonly clientId: string;\n\treadonly peerId: string;\n\treadonly displayName?: string;\n\treadonly color?: string;\n\treadonly image?: string;\n};\n\nexport type RealtimeClientMessage =\n\t| {\n\t\t\treadonly type: \"session:join\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly peer: RealtimeClientPeer;\n\t }\n\t| {\n\t\t\treadonly type: \"session:leave\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t }\n\t| {\n\t\t\treadonly type: \"session:ping\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly sentAt: number;\n\t }\n\t| {\n\t\t\treadonly type: \"presence:update\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly presence: RealtimePresencePayload;\n\t }\n\t| {\n\t\t\treadonly type: \"document:update\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly baseRevision: number;\n\t\t\treadonly items: VectorSceneItem[];\n\t };\n\nexport type RealtimeServerMessage =\n\t| {\n\t\t\treadonly type: \"session:welcome\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly serverTime: number;\n\t\t\treadonly document: RealtimeDocumentSnapshot;\n\t\t\treadonly peers: RealtimeSessionPeer[];\n\t }\n\t| {\n\t\t\treadonly type: \"session:peer-joined\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly peer: RealtimeSessionPeer;\n\t }\n\t| {\n\t\t\treadonly type: \"session:peer-left\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t }\n\t| {\n\t\t\treadonly type: \"session:pong\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly sentAt: number;\n\t\t\treadonly serverTime: number;\n\t }\n\t| {\n\t\t\treadonly type: \"session:error\";\n\t\t\treadonly roomId?: string;\n\t\t\treadonly code: string;\n\t\t\treadonly message: string;\n\t }\n\t| {\n\t\t\treadonly type: \"presence:sync\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly peers: RealtimeSessionPeer[];\n\t\t\treadonly serverTime: number;\n\t }\n\t| {\n\t\t\treadonly type: \"document:sync\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly document: RealtimeDocumentSnapshot;\n\t }\n\t| {\n\t\t\treadonly type: \"document:resync-required\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly reason: string;\n\t\t\treadonly document: RealtimeDocumentSnapshot;\n\t };\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction getNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction parseCursor(value: unknown): { x: number; y: number } | null | undefined {\n\tif (value === null) return null;\n\tif (!isRecord(value)) return undefined;\n\tconst x = getNumber(value.x);\n\tconst y = getNumber(value.y);\n\tif (x == null || y == null) return undefined;\n\treturn { x, y };\n}\n\nfunction parseCamera(value: unknown): RemotePresenceCamera | null | undefined {\n\tif (value === null) return null;\n\tif (!isRecord(value)) return undefined;\n\tconst x = getNumber(value.x);\n\tconst y = getNumber(value.y);\n\tconst zoom = getNumber(value.zoom);\n\tconst viewportWidth = getNumber(value.viewportWidth);\n\tconst viewportHeight = getNumber(value.viewportHeight);\n\tif (\n\t\tx == null ||\n\t\ty == null ||\n\t\tzoom == null ||\n\t\tviewportWidth == null ||\n\t\tviewportHeight == null\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { x, y, zoom, viewportWidth, viewportHeight };\n}\n\nfunction parseMarkupStroke(\n\tvalue: unknown,\n): RemotePresenceMarkupStroke | null | undefined {\n\tif (value === null) return null;\n\tif (!isRecord(value) || !Array.isArray(value.points)) return undefined;\n\tconst tool = getString(value.tool);\n\tif (\n\t\ttool !== \"draw\" &&\n\t\ttool !== \"pencil\" &&\n\t\ttool !== \"brush\" &&\n\t\ttool !== \"marker\" &&\n\t\ttool !== \"laser\"\n\t) {\n\t\treturn undefined;\n\t}\n\tconst points = value.points\n\t\t.map((point) => {\n\t\t\tif (!isRecord(point)) return null;\n\t\t\tconst x = getNumber(point.x);\n\t\t\tconst y = getNumber(point.y);\n\t\t\tif (x == null || y == null) return null;\n\t\t\treturn { x, y };\n\t\t})\n\t\t.filter((point): point is { x: number; y: number } => point != null);\n\tconst strokeWidth = getNumber(value.strokeWidth);\n\tconst stroke = getString(value.stroke);\n\tconst strokeOpacity = getNumber(value.strokeOpacity);\n\treturn {\n\t\tpoints,\n\t\ttool,\n\t\t...(strokeWidth != null ? { strokeWidth } : {}),\n\t\t...(stroke ? { stroke } : {}),\n\t\t...(strokeOpacity != null ? { strokeOpacity } : {}),\n\t};\n}\n\nfunction parsePresencePayload(value: unknown): RealtimePresencePayload | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst cursor = parseCursor(value.cursor);\n\tif (cursor === undefined) return undefined;\n\tconst markupStroke = parseMarkupStroke(value.markupStroke);\n\tif (markupStroke === undefined && value.markupStroke !== undefined)\n\t\treturn undefined;\n\tconst camera = parseCamera(value.camera);\n\tif (camera === undefined && value.camera !== undefined) return undefined;\n\treturn {\n\t\tcursor,\n\t\t...(markupStroke !== undefined ? { markupStroke } : {}),\n\t\t...(camera !== undefined ? { camera } : {}),\n\t\t...(getString(value.activeTool)\n\t\t\t? { activeTool: getString(value.activeTool) }\n\t\t\t: {}),\n\t};\n}\n\nfunction parseItems(value: unknown): VectorSceneItem[] | undefined {\n\treturn Array.isArray(value) ? (value as VectorSceneItem[]) : undefined;\n}\n\nfunction parseDocumentSnapshot(\n\tvalue: unknown,\n): RealtimeDocumentSnapshot | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst revision = getNumber(value.revision);\n\tconst updatedAt = getNumber(value.updatedAt);\n\tconst items = parseItems(value.items);\n\tif (revision == null || updatedAt == null || items == null) return undefined;\n\treturn {\n\t\trevision,\n\t\tupdatedAt,\n\t\titems,\n\t\t...(getString(value.updatedByClientId)\n\t\t\t? { updatedByClientId: getString(value.updatedByClientId) }\n\t\t\t: {}),\n\t\t...(getNumber(value.persistedRevision) != null\n\t\t\t? { persistedRevision: getNumber(value.persistedRevision) }\n\t\t\t: {}),\n\t};\n}\n\nexport function parseRealtimeSessionPeer(\n\tvalue: unknown,\n): RealtimeSessionPeer | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst clientId = getString(value.clientId);\n\tconst peerId = getString(value.peerId);\n\tconst roomId = getString(value.roomId);\n\tconst joinedAt = getNumber(value.joinedAt);\n\tconst lastSeenAt = getNumber(value.lastSeenAt);\n\tconst cursor = parseCursor(value.cursor);\n\tif (\n\t\tclientId == null ||\n\t\tpeerId == null ||\n\t\troomId == null ||\n\t\tjoinedAt == null ||\n\t\tlastSeenAt == null ||\n\t\tcursor === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\tconst markupStroke = parseMarkupStroke(value.markupStroke);\n\tif (markupStroke === undefined && value.markupStroke !== undefined)\n\t\treturn undefined;\n\tconst camera = parseCamera(value.camera);\n\tif (camera === undefined && value.camera !== undefined) return undefined;\n\tconst isSelf = value.isSelf === true;\n\tconst connectionState = getString(value.connectionState) as\n\t\t| RealtimeConnectionState\n\t\t| undefined;\n\treturn {\n\t\tid: clientId,\n\t\tclientId,\n\t\tpeerId,\n\t\troomId,\n\t\tjoinedAt,\n\t\tlastSeenAt,\n\t\tisSelf,\n\t\tcursor,\n\t\t...(getString(value.displayName)\n\t\t\t? { displayName: getString(value.displayName) }\n\t\t\t: {}),\n\t\t...(getString(value.color) ? { color: getString(value.color) } : {}),\n\t\t...(getString(value.image) ? { image: getString(value.image) } : {}),\n\t\t...(markupStroke !== undefined ? { markupStroke } : {}),\n\t\t...(camera !== undefined ? { camera } : {}),\n\t\t...(getString(value.activeTool)\n\t\t\t? { activeTool: getString(value.activeTool) }\n\t\t\t: {}),\n\t\t...(connectionState ? { connectionState } : {}),\n\t};\n}\n\nfunction parsePeers(value: unknown): RealtimeSessionPeer[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst peers = value\n\t\t.map((peer) => parseRealtimeSessionPeer(peer))\n\t\t.filter((peer): peer is RealtimeSessionPeer => peer != null);\n\treturn peers.length === value.length ? peers : undefined;\n}\n\nexport function parseRealtimeClientMessage(\n\tvalue: unknown,\n): RealtimeClientMessage | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst type = getString(value.type);\n\tif (type === \"session:join\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst peer = isRecord(value.peer) ? value.peer : undefined;\n\t\tconst clientId = peer ? getString(peer.clientId) : undefined;\n\t\tconst peerId = peer ? getString(peer.peerId) : undefined;\n\t\tif (!roomId || !peer || !clientId || !peerId) return undefined;\n\t\treturn {\n\t\t\ttype,\n\t\t\troomId,\n\t\t\tpeer: {\n\t\t\t\tclientId,\n\t\t\t\tpeerId,\n\t\t\t\t...(getString(peer.displayName)\n\t\t\t\t\t? { displayName: getString(peer.displayName) }\n\t\t\t\t\t: {}),\n\t\t\t\t...(getString(peer.color) ? { color: getString(peer.color) } : {}),\n\t\t\t\t...(getString(peer.image) ? { image: getString(peer.image) } : {}),\n\t\t\t},\n\t\t};\n\t}\n\tif (type === \"session:leave\" || type === \"session:ping\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tif (!roomId || !clientId) return undefined;\n\t\tif (type === \"session:leave\") {\n\t\t\treturn { type, roomId, clientId };\n\t\t}\n\t\tconst sentAt = getNumber(value.sentAt);\n\t\tif (sentAt == null) return undefined;\n\t\treturn { type, roomId, clientId, sentAt };\n\t}\n\tif (type === \"presence:update\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst presence = parsePresencePayload(value.presence);\n\t\tif (!roomId || !clientId || !presence) return undefined;\n\t\treturn { type, roomId, clientId, presence };\n\t}\n\tif (type === \"document:update\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst baseRevision = getNumber(value.baseRevision);\n\t\tconst items = parseItems(value.items);\n\t\tif (!roomId || !clientId || baseRevision == null || !items) return undefined;\n\t\treturn { type, roomId, clientId, baseRevision, items };\n\t}\n\treturn undefined;\n}\n\nexport function parseRealtimeServerMessage(\n\tvalue: unknown,\n): RealtimeServerMessage | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst type = getString(value.type);\n\tif (type === \"session:welcome\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst serverTime = getNumber(value.serverTime);\n\t\tconst document = parseDocumentSnapshot(value.document);\n\t\tconst peers = parsePeers(value.peers);\n\t\tif (!roomId || !clientId || serverTime == null || !document || !peers) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { type, roomId, clientId, serverTime, document, peers };\n\t}\n\tif (type === \"session:peer-joined\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst peer = parseRealtimeSessionPeer(value.peer);\n\t\tif (!roomId || !peer) return undefined;\n\t\treturn { type, roomId, peer };\n\t}\n\tif (type === \"session:peer-left\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tif (!roomId || !clientId) return undefined;\n\t\treturn { type, roomId, clientId };\n\t}\n\tif (type === \"session:pong\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst sentAt = getNumber(value.sentAt);\n\t\tconst serverTime = getNumber(value.serverTime);\n\t\tif (!roomId || !clientId || sentAt == null || serverTime == null) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { type, roomId, clientId, sentAt, serverTime };\n\t}\n\tif (type === \"session:error\") {\n\t\tconst code = getString(value.code);\n\t\tconst message = getString(value.message);\n\t\tif (!code || !message) return undefined;\n\t\treturn {\n\t\t\ttype,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\t...(getString(value.roomId) ? { roomId: getString(value.roomId) } : {}),\n\t\t};\n\t}\n\tif (type === \"presence:sync\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst peers = parsePeers(value.peers);\n\t\tconst serverTime = getNumber(value.serverTime);\n\t\tif (!roomId || !peers || serverTime == null) return undefined;\n\t\treturn { type, roomId, peers, serverTime };\n\t}\n\tif (type === \"document:sync\" || type === \"document:resync-required\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst document = parseDocumentSnapshot(value.document);\n\t\tif (!roomId || !document) return undefined;\n\t\tif (type === \"document:sync\") {\n\t\t\treturn { type, roomId, document };\n\t\t}\n\t\tconst reason = getString(value.reason);\n\t\tif (!reason) return undefined;\n\t\treturn { type, roomId, reason, document };\n\t}\n\treturn undefined;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport type {\n\tRealtimeDocumentConflict,\n\tRealtimeSyncState,\n\tUseRealtimeSessionResult,\n} from \"./use-realtime-session\";\n\ntype UseRealtimeCanvasDocumentOptions = {\n\tsession: Pick<\n\t\tUseRealtimeSessionResult,\n\t\t| \"connection\"\n\t\t| \"document\"\n\t\t| \"remoteAdapter\"\n\t\t| \"hasLocalOfflineDraft\"\n\t\t| \"hasPendingDocumentSync\"\n\t\t| \"syncState\"\n\t\t| \"conflict\"\n\t\t| \"resolveConflict\"\n\t\t| \"clearLocalDraft\"\n\t\t| \"flushDocumentSync\"\n\t> | null;\n\titems: readonly VectorSceneItem[];\n\tonItemsChange?: (nextItems: VectorSceneItem[]) => void;\n\tnormalizeItems?: (nextItems: readonly VectorSceneItem[]) => VectorSceneItem[];\n\thydrateItems?: (\n\t\tnextItems: readonly VectorSceneItem[],\n\t) => Promise<VectorSceneItem[]>;\n\tenabled?: boolean;\n};\n\nexport type UseRealtimeCanvasDocumentResult = {\n\titems: readonly VectorSceneItem[];\n\tonItemsChange?: (nextItems: VectorSceneItem[]) => void;\n\tloading: boolean;\n\tsaving: boolean;\n\thasLocalOfflineDraft: boolean;\n\tsyncState: RealtimeSyncState;\n\tconflict: RealtimeDocumentConflict | null;\n\tresolveConflict: (action: \"keep-local\" | \"use-server\") => void;\n\tclearLocalDraft: () => void;\n\tflush: () => Promise<void>;\n};\n\nfunction getSceneItemId(item: VectorSceneItem): string | null {\n\tconst id = (item as { id?: unknown }).id;\n\treturn typeof id === \"string\" ? id : null;\n}\n\nfunction hasMissingLocalItems(\n\tlocalItems: readonly VectorSceneItem[],\n\tincomingItems: readonly VectorSceneItem[],\n): boolean {\n\tconst incomingIds = new Set<string>();\n\tfor (const item of incomingItems) {\n\t\tconst id = getSceneItemId(item);\n\t\tif (id) incomingIds.add(id);\n\t}\n\tfor (const item of localItems) {\n\t\tconst id = getSceneItemId(item);\n\t\tif (id && !incomingIds.has(id)) return true;\n\t}\n\treturn false;\n}\n\nexport function useRealtimeCanvasDocument(\n\toptions: UseRealtimeCanvasDocumentOptions,\n): UseRealtimeCanvasDocumentResult {\n\tconst {\n\t\tsession,\n\t\titems,\n\t\tonItemsChange,\n\t\tnormalizeItems,\n\t\thydrateItems,\n\t\tenabled = true,\n\t} = options;\n\tconst [loading, setLoading] = useState(false);\n\tconst lastAppliedRevisionRef = useRef<number | null>(null);\n\tconst inFlightRevisionRef = useRef<number | null>(null);\n\t// Once we've ever propagated a non-empty items set to the consumer, treat\n\t// a subsequent inbound empty document as suspicious and skip it. This\n\t// guards against rare races (tab killed before localStorage debounce\n\t// flushed, Y.Doc reset, stale snapshot) that would otherwise wipe the\n\t// consumer's view to []. Genuine empty boards on first load still work\n\t// because hasEverPropagatedItemsRef starts false.\n\tconst hasEverPropagatedItemsRef = useRef(false);\n\tconst realtimeEnabled = enabled && session != null;\n\tconst documentRevision = session?.document?.revision ?? null;\n\tconst documentItems = session?.document?.items;\n\tconst documentUpdatedByClientId = session?.document?.updatedByClientId ?? null;\n\tconst connectionClientId = session?.connection.clientId ?? null;\n\tconst hasLocalOfflineDraft = session?.hasLocalOfflineDraft ?? false;\n\tconst hasPendingDocumentSync = session?.hasPendingDocumentSync ?? false;\n\n\tconst applyIncomingItems = useCallback(\n\t\tasync (nextItems: readonly VectorSceneItem[]) => {\n\t\t\tconst normalizedItems = normalizeItems\n\t\t\t\t? normalizeItems(nextItems)\n\t\t\t\t: [...nextItems];\n\t\t\tif (!hydrateItems) return normalizedItems;\n\t\t\treturn await hydrateItems(normalizedItems);\n\t\t},\n\t\t[hydrateItems, normalizeItems],\n\t);\n\n\tconst handleItemsChange = useCallback(\n\t\t(nextItems: VectorSceneItem[]) => {\n\t\t\tif (!enabled) {\n\t\t\t\tonItemsChange?.(normalizeItems ? normalizeItems(nextItems) : nextItems);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst normalizedItems = normalizeItems ? normalizeItems(nextItems) : nextItems;\n\t\t\tonItemsChange?.(normalizedItems);\n\t\t\tsession?.remoteAdapter.send?.(normalizedItems);\n\t\t},\n\t\t[enabled, normalizeItems, onItemsChange, session],\n\t);\n\n\tuseEffect(() => {\n\t\tif (items.length > 0) {\n\t\t\thasEverPropagatedItemsRef.current = true;\n\t\t}\n\t}, [items.length]);\n\n\tuseEffect(() => {\n\t\tif (!realtimeEnabled || !onItemsChange || !session?.document) return;\n\t\tif (documentUpdatedByClientId === connectionClientId) return;\n\t\tif (documentRevision == null) return;\n\t\tif (lastAppliedRevisionRef.current === documentRevision) return;\n\t\tif (inFlightRevisionRef.current === documentRevision) return;\n\t\tinFlightRevisionRef.current = documentRevision;\n\t\tlet cancelled = false;\n\t\tsetLoading(true);\n\t\tvoid applyIncomingItems(documentItems ?? [])\n\t\t\t.then((resolvedItems) => {\n\t\t\t\tif (cancelled) return;\n\t\t\t\tif (inFlightRevisionRef.current !== documentRevision) return;\n\t\t\t\tlastAppliedRevisionRef.current = documentRevision;\n\t\t\t\tconst hasLocalItems = items.length > 0;\n\t\t\t\tconst hasPendingLocalChanges =\n\t\t\t\t\thasLocalOfflineDraft || hasPendingDocumentSync;\n\t\t\t\tif (\n\t\t\t\t\tresolvedItems.length === 0 &&\n\t\t\t\t\t(hasEverPropagatedItemsRef.current ||\n\t\t\t\t\t\thasLocalItems ||\n\t\t\t\t\t\thasPendingLocalChanges)\n\t\t\t\t) {\n\t\t\t\t\t// Defensive: a previously non-empty document is now empty.\n\t\t\t\t\t// Almost always a stale or buggy snapshot — skip rather\n\t\t\t\t\t// than wipe the consumer's view. The next snapshot will\n\t\t\t\t\t// reconcile if the emptiness was real.\n\t\t\t\t\tif (hasLocalItems) {\n\t\t\t\t\t\tconst normalizedLocalItems = normalizeItems\n\t\t\t\t\t\t\t? normalizeItems(items)\n\t\t\t\t\t\t\t: [...items];\n\t\t\t\t\t\tsession.remoteAdapter.send?.(normalizedLocalItems);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (hasLocalItems && hasMissingLocalItems(items, resolvedItems)) {\n\t\t\t\t\tconst normalizedLocalItems = normalizeItems\n\t\t\t\t\t\t? normalizeItems(items)\n\t\t\t\t\t\t: [...items];\n\t\t\t\t\tsession.remoteAdapter.send?.(normalizedLocalItems);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (resolvedItems.length > 0) {\n\t\t\t\t\thasEverPropagatedItemsRef.current = true;\n\t\t\t\t}\n\t\t\t\tonItemsChange(resolvedItems);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (inFlightRevisionRef.current === documentRevision) {\n\t\t\t\t\tinFlightRevisionRef.current = null;\n\t\t\t\t}\n\t\t\t\tif (cancelled) return;\n\t\t\t\tsetLoading(false);\n\t\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [\n\t\tapplyIncomingItems,\n\t\tconnectionClientId,\n\t\tdocumentItems,\n\t\tdocumentRevision,\n\t\tdocumentUpdatedByClientId,\n\t\thasLocalOfflineDraft,\n\t\thasPendingDocumentSync,\n\t\titems,\n\t\tnormalizeItems,\n\t\tonItemsChange,\n\t\trealtimeEnabled,\n\t\tsession?.remoteAdapter,\n\t\tsession?.document,\n\t]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\titems,\n\t\t\tonItemsChange: onItemsChange ? handleItemsChange : undefined,\n\t\t\tloading,\n\t\t\tsaving: session?.hasPendingDocumentSync ?? false,\n\t\t\thasLocalOfflineDraft: session?.hasLocalOfflineDraft ?? false,\n\t\t\tsyncState: session?.syncState ?? \"offline\",\n\t\t\tconflict: session?.conflict ?? null,\n\t\t\tresolveConflict: session?.resolveConflict ?? (() => {}),\n\t\t\tclearLocalDraft: session?.clearLocalDraft ?? (() => {}),\n\t\t\tflush: session?.flushDocumentSync ?? (async () => {}),\n\t\t}),\n\t\t[handleItemsChange, items, loading, onItemsChange, session],\n\t);\n}\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { RealtimeSessionPeer } from \"./protocol\";\nimport type { RealtimeViewportHandle } from \"./use-realtime-session\";\n\nexport type UseRealtimePeerFollowOptions = {\n\tviewportRef: RefObject<RealtimeViewportHandle | null>;\n\tsessionPeers: RealtimeSessionPeer[];\n\tfollowedPeerId: string | null | undefined;\n\tonFollowEnd?: () => void;\n};\n\ntype ViewportCameraSnapshot = {\n\tx: number;\n\ty: number;\n\tzoom: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n};\n\ntype AnimationRuntime = typeof globalThis & {\n\trequestAnimationFrame?: (callback: FrameRequestCallback) => number;\n\tcancelAnimationFrame?: (handle: number) => void;\n};\n\nconst viewportFollowSyncSnapshots = new WeakMap<\n\tRealtimeViewportHandle,\n\tViewportCameraSnapshot\n>();\n\nfunction requestRuntimeAnimationFrame(callback: FrameRequestCallback): number {\n\tconst runtime = globalThis as AnimationRuntime;\n\tif (typeof runtime.requestAnimationFrame === \"function\") {\n\t\treturn runtime.requestAnimationFrame(callback);\n\t}\n\treturn globalThis.setTimeout(() => callback(Date.now()), 16);\n}\n\nfunction cancelRuntimeAnimationFrame(handle: number): void {\n\tconst runtime = globalThis as AnimationRuntime;\n\tif (typeof runtime.cancelAnimationFrame === \"function\") {\n\t\truntime.cancelAnimationFrame(handle);\n\t\treturn;\n\t}\n\tglobalThis.clearTimeout(handle);\n}\n\nfunction getFollowedPeer(\n\tsessionPeers: RealtimeSessionPeer[],\n\tfollowedPeerId: string,\n): RealtimeSessionPeer | undefined {\n\treturn sessionPeers.find(\n\t\t(peerState) =>\n\t\t\tpeerState.peerId === followedPeerId || peerState.id === followedPeerId,\n\t);\n}\n\nfunction getCameraKey(peer: RealtimeSessionPeer): string | null {\n\tif (!peer.camera) return null;\n\treturn [\n\t\tpeer.peerId,\n\t\tpeer.camera.x,\n\t\tpeer.camera.y,\n\t\tpeer.camera.zoom,\n\t\tpeer.camera.viewportWidth,\n\t\tpeer.camera.viewportHeight,\n\t].join(\":\");\n}\n\nfunction getViewportSizeKey(viewport: RealtimeViewportHandle | null): string | null {\n\tif (!viewport) return null;\n\tconst viewportSize = viewport.getViewportSize();\n\treturn [viewportSize.width, viewportSize.height].join(\":\");\n}\n\nfunction getFollowedCameraPosition(\n\tviewport: RealtimeViewportHandle,\n\tpeer: RealtimeSessionPeer,\n): { x: number; y: number; zoom: number } | null {\n\tif (!peer.camera) return null;\n\tconst viewportSize = viewport.getViewportSize();\n\treturn {\n\t\tx: peer.camera.x + (viewportSize.width - peer.camera.viewportWidth) / 2,\n\t\ty: peer.camera.y + (viewportSize.height - peer.camera.viewportHeight) / 2,\n\t\tzoom: peer.camera.zoom,\n\t};\n}\n\nfunction applyPeerCamera(\n\tviewport: RealtimeViewportHandle,\n\tpeer: RealtimeSessionPeer,\n): boolean {\n\tconst camera = viewport.getCamera();\n\tconst nextCamera = getFollowedCameraPosition(viewport, peer);\n\tconst viewportSize = viewport.getViewportSize();\n\tif (!camera || !nextCamera) return false;\n\tif (\n\t\tcamera.x === nextCamera.x &&\n\t\tcamera.y === nextCamera.y &&\n\t\tcamera.zoom === nextCamera.zoom\n\t) {\n\t\treturn true;\n\t}\n\tmarkViewportFollowSync(viewport, {\n\t\tx: nextCamera.x,\n\t\ty: nextCamera.y,\n\t\tzoom: nextCamera.zoom,\n\t\tviewportWidth: viewportSize.width,\n\t\tviewportHeight: viewportSize.height,\n\t});\n\tcamera.x = nextCamera.x;\n\tcamera.y = nextCamera.y;\n\tcamera.zoom = nextCamera.zoom;\n\tviewport.requestRender();\n\treturn true;\n}\n\nexport function markViewportFollowSync(\n\tviewport: RealtimeViewportHandle,\n\tsnapshot: ViewportCameraSnapshot,\n): void {\n\tviewportFollowSyncSnapshots.set(viewport, snapshot);\n}\n\nexport function consumeViewportFollowSync(\n\tviewport: RealtimeViewportHandle,\n\tsnapshot: ViewportCameraSnapshot,\n): boolean {\n\tconst currentSnapshot = viewportFollowSyncSnapshots.get(viewport);\n\tif (\n\t\t!currentSnapshot ||\n\t\tcurrentSnapshot.x !== snapshot.x ||\n\t\tcurrentSnapshot.y !== snapshot.y ||\n\t\tcurrentSnapshot.zoom !== snapshot.zoom ||\n\t\tcurrentSnapshot.viewportWidth !== snapshot.viewportWidth ||\n\t\tcurrentSnapshot.viewportHeight !== snapshot.viewportHeight\n\t) {\n\t\treturn false;\n\t}\n\tviewportFollowSyncSnapshots.delete(viewport);\n\treturn true;\n}\n\nexport function useRealtimePeerFollow(options: UseRealtimePeerFollowOptions): void {\n\tconst { viewportRef, sessionPeers, followedPeerId, onFollowEnd } = options;\n\tconst endedPeerIdRef = useRef<string | null>(null);\n\tconst lastAppliedCameraKeyRef = useRef<string | null>(null);\n\tconst [, setViewportSizeVersion] = useState(0);\n\n\tuseEffect(() => {\n\t\tif (!followedPeerId) return;\n\t\tlet animationFrameId = 0;\n\t\tlet lastViewportSizeKey = getViewportSizeKey(viewportRef.current ?? null);\n\n\t\tconst checkViewportSize = () => {\n\t\t\tconst nextViewportSizeKey = getViewportSizeKey(viewportRef.current ?? null);\n\t\t\tif (nextViewportSizeKey !== lastViewportSizeKey) {\n\t\t\t\tlastViewportSizeKey = nextViewportSizeKey;\n\t\t\t\tsetViewportSizeVersion((value) => value + 1);\n\t\t\t}\n\t\t\tanimationFrameId = requestRuntimeAnimationFrame(checkViewportSize);\n\t\t};\n\n\t\tanimationFrameId = requestRuntimeAnimationFrame(checkViewportSize);\n\t\treturn () => {\n\t\t\tcancelRuntimeAnimationFrame(animationFrameId);\n\t\t};\n\t}, [followedPeerId, viewportRef]);\n\n\tuseEffect(() => {\n\t\tif (!followedPeerId) {\n\t\t\tendedPeerIdRef.current = null;\n\t\t\tlastAppliedCameraKeyRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst followedPeer = getFollowedPeer(sessionPeers, followedPeerId);\n\t\tif (!followedPeer) {\n\t\t\tlastAppliedCameraKeyRef.current = null;\n\t\t\tif (endedPeerIdRef.current === followedPeerId) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tendedPeerIdRef.current = followedPeerId;\n\t\t\tonFollowEnd?.();\n\t\t\treturn;\n\t\t}\n\t\tif (!followedPeer.camera) {\n\t\t\tendedPeerIdRef.current = null;\n\t\t\tlastAppliedCameraKeyRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tendedPeerIdRef.current = null;\n\t\tconst viewport = viewportRef.current;\n\t\tconst nextCameraKey = [\n\t\t\tgetCameraKey(followedPeer),\n\t\t\tgetViewportSizeKey(viewport ?? null),\n\t\t].join(\":\");\n\t\tif (nextCameraKey && nextCameraKey === lastAppliedCameraKeyRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tif (!viewport || !applyPeerCamera(viewport, followedPeer)) {\n\t\t\treturn;\n\t\t}\n\t\tlastAppliedCameraKeyRef.current = nextCameraKey;\n\t}, [followedPeerId, onFollowEnd, sessionPeers, viewportRef]);\n}\n","import * as Y from \"yjs\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n// Phase 1 design: Yjs is the local source of truth for items, but the wire\n// protocol remains items-array snapshots (so legacy boards and unchanged\n// server work). The CRDT semantics buy us per-field merge on the client side\n// and accurate distinction between \"deleted by another user\" vs \"added\n// locally and not yet synced\".\n//\n// Y.Doc shape:\n// doc.getArray<Y.Map>(\"items\") → ordered list of items\n// each Y.Map has the VectorSceneItem fields (id, toolKind, bounds, etc.)\n//\n// We never put blob handles or rasterized image refs into the Y.Doc — those\n// are local-only and would not survive sync. sanitizeRealtimeItem upstream\n// already strips them before items reach this layer for outbound.\n\nconst ITEMS_KEY = \"items\";\nconst CLIENT_ONLY_IMAGE_KEYS = new Set([\n\t\"imageBlobId\",\n\t\"imageThumbnailBlobId\",\n\t\"imageRasterHref\",\n\t\"imageThumbnailHref\",\n]);\n\n// Window during which a freshly server-added id is protected from being\n// deleted by a local-items update. Necessary because the React consumer that\n// drives applyLocalItemsToYDoc cannot have rendered the just-received server\n// item yet, so its \"current local view\" legitimately lacks it. Without this\n// guard, a user drawing at 60fps while another peer adds items causes those\n// inbound items to vanish from the Y.Doc the next time the consumer's\n// onItemsChange fires.\nconst SERVER_ADD_RACE_WINDOW_MS = 2000;\n\nexport type YjsBoardDoc = {\n\treadonly doc: Y.Doc;\n\treadonly yItems: Y.Array<Y.Map<unknown>>;\n\t/**\n\t * Set of item ids that the server has confirmed in its latest snapshot.\n\t * Items present in the Y.Doc whose id is NOT in this set are considered\n\t * locally-pending — they have not yet been seen by the server. When a\n\t * server snapshot arrives lacking an id that IS in this set, we know the\n\t * server deleted it (rather than simply not having seen our local copy).\n\t */\n\tlastServerConfirmedIds: Set<string>;\n\tlastServerConfirmedItemSerializations: Map<string, string>;\n\t/**\n\t * Map of id → timestamp (ms) recording when the server most recently\n\t * surfaced an item. Used to protect freshly added remote items from being\n\t * deleted by a stale local-items update during the React-render race\n\t * window. Entries older than SERVER_ADD_RACE_WINDOW_MS are eligible for\n\t * pruning during deletion checks.\n\t */\n\tserverItemSeenAt: Map<string, number>;\n};\n\nexport function createYjsBoardDoc(): YjsBoardDoc {\n\tconst doc = new Y.Doc();\n\tconst yItems = doc.getArray<Y.Map<unknown>>(ITEMS_KEY);\n\treturn {\n\t\tdoc,\n\t\tyItems,\n\t\tlastServerConfirmedIds: new Set(),\n\t\tlastServerConfirmedItemSerializations: new Map(),\n\t\tserverItemSeenAt: new Map(),\n\t};\n}\n\nfunction getItemId(item: VectorSceneItem | Y.Map<unknown>): string | null {\n\tif (item instanceof Y.Map) {\n\t\tconst id = item.get(\"id\");\n\t\treturn typeof id === \"string\" ? id : null;\n\t}\n\tconst id = (item as { id?: unknown }).id;\n\treturn typeof id === \"string\" ? id : null;\n}\n\nfunction vectorItemToYMap(item: VectorSceneItem): Y.Map<unknown> {\n\tconst yMap = new Y.Map<unknown>();\n\tfor (const [key, value] of Object.entries(normalizeRealtimeItem(item))) {\n\t\tif (value === undefined) continue;\n\t\tyMap.set(key, value);\n\t}\n\treturn yMap;\n}\n\nfunction yMapToVectorItem(yMap: Y.Map<unknown>): VectorSceneItem {\n\tconst obj: Record<string, unknown> = {};\n\tfor (const [key, value] of yMap.entries()) {\n\t\tobj[key] = value;\n\t}\n\treturn obj as VectorSceneItem;\n}\n\n/**\n * Project the current Y.Doc state to a plain items array for the React\n * consumer (canvu's VectorCanvas).\n */\nexport function readVectorItems(yItems: Y.Array<Y.Map<unknown>>): VectorSceneItem[] {\n\tconst result: VectorSceneItem[] = [];\n\tfor (let i = 0; i < yItems.length; i++) {\n\t\tconst yMap = yItems.get(i);\n\t\tif (yMap) result.push(yMapToVectorItem(yMap));\n\t}\n\treturn result;\n}\n\n/**\n * Build an index of the current Y.Doc items by id for fast lookups during\n * merge. Items without an id are skipped — they cannot be reconciled by id\n * and stay as-is.\n */\nfunction indexYItemsById(\n\tyItems: Y.Array<Y.Map<unknown>>,\n): Map<string, { yMap: Y.Map<unknown>; index: number }> {\n\tconst result = new Map<string, { yMap: Y.Map<unknown>; index: number }>();\n\tfor (let i = 0; i < yItems.length; i++) {\n\t\tconst yMap = yItems.get(i);\n\t\tif (!yMap) continue;\n\t\tconst id = getItemId(yMap);\n\t\tif (!id) continue;\n\t\tresult.set(id, { yMap, index: i });\n\t}\n\treturn result;\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n\tif (left === right) return true;\n\tif (typeof left !== typeof right) return false;\n\tif (left === null || right === null) return false;\n\tif (typeof left !== \"object\") return false;\n\ttry {\n\t\treturn JSON.stringify(left) === JSON.stringify(right);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction serializeItem(value: VectorSceneItem | Y.Map<unknown>): string {\n\tconst item = value instanceof Y.Map ? yMapToVectorItem(value) : value;\n\treturn JSON.stringify(normalizeRealtimeItem(item));\n}\n\n/**\n * Update a Y.Map in place to match a target VectorSceneItem, touching only\n * the fields that actually changed. This keeps Yjs ops minimal and avoids\n * triggering observers for no-op updates.\n */\nfunction updateYMapInPlace(yMap: Y.Map<unknown>, next: VectorSceneItem): void {\n\tconst normalizedNext = normalizeRealtimeItem(next);\n\tconst nextKeys = new Set<string>();\n\tfor (const [key, value] of Object.entries(normalizedNext)) {\n\t\tif (value === undefined) continue;\n\t\tnextKeys.add(key);\n\t\tconst current = yMap.get(key);\n\t\tif (!valuesEqual(current, value)) {\n\t\t\tyMap.set(key, value);\n\t\t}\n\t}\n\tfor (const key of Array.from(yMap.keys())) {\n\t\tif (!nextKeys.has(key)) yMap.delete(key);\n\t}\n}\n\nfunction normalizeRealtimeItem(item: VectorSceneItem): VectorSceneItem {\n\tif (item.toolKind !== \"image\") return item;\n\tconst normalized = Object.fromEntries(\n\t\tObject.entries(item).filter(([key]) => !CLIENT_ONLY_IMAGE_KEYS.has(key)),\n\t) as Record<string, unknown>;\n\tnormalized.childrenSvg = \"\";\n\treturn normalized as VectorSceneItem;\n}\n\nexport type ApplyLocalItemsOptions = {\n\t/**\n\t * Items provided by the local consumer (canvu's VectorCanvas onItemsChange).\n\t * The Y.Doc is mutated to match this set: new ids are added (in the order\n\t * they appear), changed ids have their Y.Map fields updated, and ids\n\t * missing from the new list are removed.\n\t *\n\t * All mutations happen inside a single Y transaction so observers see one\n\t * coherent change.\n\t */\n\titems: readonly VectorSceneItem[];\n\t/**\n\t * Optional origin tag for the transaction. Useful to distinguish local\n\t * edits from remote applies when observing the doc.\n\t */\n\torigin?: unknown;\n};\n\n/**\n * Apply a complete items array from the local consumer as a set of minimal\n * Yjs operations. Order of the next array becomes the order in the Y.Array.\n *\n * Returns the list of item ids that are newly introduced (not present before\n * this call), so the caller can track them as \"locally-pending until server\n * confirms\".\n */\nexport function applyLocalItemsToYDoc(\n\tboard: YjsBoardDoc,\n\toptions: ApplyLocalItemsOptions,\n): { addedIds: string[]; removedIds: string[] } {\n\tconst { items, origin } = options;\n\tconst addedIds: string[] = [];\n\tconst removedIds: string[] = [];\n\tconst now = Date.now();\n\tboard.doc.transact(() => {\n\t\tconst currentIndex = indexYItemsById(board.yItems);\n\t\tconst nextIds = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tconst id = getItemId(item);\n\t\t\tif (!id) continue;\n\t\t\tnextIds.add(id);\n\t\t}\n\t\t// Walk deletes in descending index order so removals don't shift the\n\t\t// indices of items still pending deletion.\n\t\tconst toDelete: Array<{ id: string; index: number }> = [];\n\t\tfor (const [id, entry] of currentIndex) {\n\t\t\tif (nextIds.has(id)) continue;\n\t\t\t// Race guard: an id that the server surfaced within the last race\n\t\t\t// window may simply not have been rendered by the React consumer\n\t\t\t// yet, so its absence from `items` is not a real user delete.\n\t\t\t// Preserve it; the next local update after the consumer re-renders\n\t\t\t// will include it (no-op) or genuinely omit it (after the window\n\t\t\t// elapses, deletion will then go through).\n\t\t\tconst serverSeenAt = board.serverItemSeenAt.get(id);\n\t\t\tif (serverSeenAt != null && now - serverSeenAt < SERVER_ADD_RACE_WINDOW_MS) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttoDelete.push({ id, index: entry.index });\n\t\t}\n\t\ttoDelete.sort((a, b) => b.index - a.index);\n\t\tfor (const { id, index } of toDelete) {\n\t\t\tboard.yItems.delete(index, 1);\n\t\t\tboard.serverItemSeenAt.delete(id);\n\t\t\tremovedIds.push(id);\n\t\t}\n\t\tconst refreshedIndex = indexYItemsById(board.yItems);\n\t\tfor (let nextOrder = 0; nextOrder < items.length; nextOrder++) {\n\t\t\tconst item = items[nextOrder];\n\t\t\tif (!item) continue;\n\t\t\tconst id = getItemId(item);\n\t\t\tif (!id) continue;\n\t\t\tconst existing = refreshedIndex.get(id);\n\t\t\tif (existing) {\n\t\t\t\tupdateYMapInPlace(existing.yMap, item);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst yMap = vectorItemToYMap(item);\n\t\t\tboard.yItems.push([yMap]);\n\t\t\taddedIds.push(id);\n\t\t}\n\t}, origin);\n\treturn { addedIds, removedIds };\n}\n\nexport type ApplyServerSnapshotOptions = {\n\t/**\n\t * Server-confirmed items snapshot. Ordering of the snapshot is treated as\n\t * authoritative for items the server knows about.\n\t */\n\titems: readonly VectorSceneItem[];\n\t/**\n\t * Optional origin tag for the transaction.\n\t */\n\torigin?: unknown;\n};\n\n/**\n * Reconcile a server snapshot into the Y.Doc, additively.\n *\n * Rules:\n * - id present in snapshot AND in Y.Doc → update Y.Map fields in place.\n * - id present in snapshot AND NOT in Y.Doc → add to Y.Doc.\n * - id present in Y.Doc, NOT in snapshot → **keep**. We intentionally do\n * not delete based on server absence. With a snapshot wire protocol and\n * a store-and-broadcast server that does not merge, we cannot tell\n * \"another peer deleted this id\" apart from \"another peer sent a stale\n * snapshot that didn't include this id yet\". Treating absence as delete\n * caused a cascading wipe: each peer's update removed the others'\n * unsynced items, peer A's next snapshot then removed peer B's items\n * again, until everything converged to empty.\n *\n * The cost of being conservative: deletes performed by other peers do\n * not propagate visually. Local user deletes still work via\n * applyLocalItemsToYDoc (their Y.Doc loses the item, the next flush\n * pushes the new state up). Fixing cross-peer deletes properly requires\n * an explicit delete signal on the wire — that is Phase 2 (ops-based\n * protocol with server-side merge).\n *\n * `board.lastServerConfirmedIds` is still updated to the snapshot id set so\n * the local delete path's race guard remains accurate.\n */\nexport function applyServerSnapshotToYDoc(\n\tboard: YjsBoardDoc,\n\toptions: ApplyServerSnapshotOptions,\n): void {\n\tconst { items: snapshotItems, origin } = options;\n\tconst now = Date.now();\n\tboard.doc.transact(() => {\n\t\tfor (const item of snapshotItems) {\n\t\t\tconst id = getItemId(item);\n\t\t\tif (!id) continue;\n\t\t\tconst existing = indexYItemsById(board.yItems).get(id);\n\t\t\tif (existing) {\n\t\t\t\tconst currentSerialized = serializeItem(existing.yMap);\n\t\t\t\tconst incomingSerialized = serializeItem(item);\n\t\t\t\tconst confirmedSerialized =\n\t\t\t\t\tboard.lastServerConfirmedItemSerializations.get(id);\n\t\t\t\tconst hasPendingLocalChange =\n\t\t\t\t\tconfirmedSerialized === undefined\n\t\t\t\t\t\t? currentSerialized !== incomingSerialized\n\t\t\t\t\t\t: currentSerialized !== confirmedSerialized &&\n\t\t\t\t\t\t\tcurrentSerialized !== incomingSerialized;\n\t\t\t\tif (hasPendingLocalChange) {\n\t\t\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tupdateYMapInPlace(existing.yMap, item);\n\t\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst yMap = vectorItemToYMap(item);\n\t\t\tboard.yItems.push([yMap]);\n\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t}\n\t}, origin);\n\n\tboard.lastServerConfirmedIds = new Set();\n\tboard.lastServerConfirmedItemSerializations = new Map();\n\tfor (const item of snapshotItems) {\n\t\tconst id = getItemId(item);\n\t\tif (id) {\n\t\t\tboard.lastServerConfirmedIds.add(id);\n\t\t\tboard.lastServerConfirmedItemSerializations.set(id, serializeItem(item));\n\t\t}\n\t}\n}\n\n/**\n * Replace the entire Y.Doc state with a snapshot, discarding any local\n * changes. Used on initial load when no local draft exists and we just want\n * the server's view.\n */\nexport function replaceYDocWithSnapshot(\n\tboard: YjsBoardDoc,\n\toptions: ApplyServerSnapshotOptions,\n): void {\n\tconst { items: snapshotItems, origin } = options;\n\tconst now = Date.now();\n\tboard.doc.transact(() => {\n\t\tif (board.yItems.length > 0) {\n\t\t\tboard.yItems.delete(0, board.yItems.length);\n\t\t}\n\t\tfor (const item of snapshotItems) {\n\t\t\tboard.yItems.push([vectorItemToYMap(item)]);\n\t\t}\n\t}, origin);\n\tboard.lastServerConfirmedIds = new Set();\n\tboard.lastServerConfirmedItemSerializations = new Map();\n\tboard.serverItemSeenAt = new Map();\n\tfor (const item of snapshotItems) {\n\t\tconst id = getItemId(item);\n\t\tif (id) {\n\t\t\tboard.lastServerConfirmedIds.add(id);\n\t\t\tboard.lastServerConfirmedItemSerializations.set(id, serializeItem(item));\n\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t}\n\t}\n}\n\n/**\n * Return ids of items currently in the Y.Doc that have not yet been\n * confirmed in a server snapshot. These are the user's local additions still\n * waiting for the server to round-trip.\n */\nexport function getLocallyPendingItemIds(board: YjsBoardDoc): Set<string> {\n\tconst pending = new Set<string>();\n\tfor (let i = 0; i < board.yItems.length; i++) {\n\t\tconst yMap = board.yItems.get(i);\n\t\tif (!yMap) continue;\n\t\tconst id = getItemId(yMap);\n\t\tif (!id) continue;\n\t\tconst confirmedSerialized = board.lastServerConfirmedItemSerializations.get(id);\n\t\tif (!confirmedSerialized || serializeItem(yMap) !== confirmedSerialized) {\n\t\t\tpending.add(id);\n\t\t}\n\t}\n\treturn pending;\n}\n\n/**\n * Encode the Y.Doc state for persistence (localStorage offline draft).\n * Returns a base64-ish string suitable for JSON storage.\n */\nexport function encodeYDocState(board: YjsBoardDoc): string {\n\tconst update = Y.encodeStateAsUpdate(board.doc);\n\tlet binary = \"\";\n\tfor (let i = 0; i < update.length; i++) {\n\t\tbinary += String.fromCharCode(update[i] as number);\n\t}\n\treturn btoa(binary);\n}\n\n/**\n * Decode and apply a previously-encoded Y.Doc state. Returns true if the\n * state was applied successfully.\n */\nexport function decodeYDocState(board: YjsBoardDoc, encoded: string): boolean {\n\ttry {\n\t\tconst binary = atob(encoded);\n\t\tconst update = new Uint8Array(binary.length);\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tupdate[i] = binary.charCodeAt(i);\n\t\t}\n\t\tY.applyUpdate(board.doc, update);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { VectorCanvasRemoteAdapter } from \"../react/persistence\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\tparseRealtimeServerMessage,\n\ttype RealtimeClientMessage,\n\ttype RealtimeConnectionInfo,\n\ttype RealtimeDocumentSnapshot,\n\ttype RealtimeSessionPeer,\n} from \"./protocol\";\nimport { consumeViewportFollowSync } from \"./use-realtime-peer-follow\";\nimport {\n\tapplyLocalItemsToYDoc,\n\tapplyServerSnapshotToYDoc,\n\tcreateYjsBoardDoc,\n\tdecodeYDocState,\n\tencodeYDocState,\n\tgetLocallyPendingItemIds,\n\treadVectorItems,\n\treplaceYDocWithSnapshot,\n\ttype YjsBoardDoc,\n} from \"./yjs-document\";\n\n// Origin tags for Y.Doc transactions. Used to distinguish local edits from\n// remote applies when observing the doc so we can avoid feedback loops.\nconst ORIGIN_LOCAL = Symbol(\"canvu/realtime/local\");\nconst ORIGIN_REMOTE = Symbol(\"canvu/realtime/remote\");\nconst ORIGIN_BOOTSTRAP = Symbol(\"canvu/realtime/bootstrap\");\n\ntype RealtimeSessionPeerInput = {\n\tid: string;\n\tdisplayName?: string;\n\tcolor?: string;\n\timage?: string;\n\tclientId?: string;\n};\n\nexport type UseRealtimeSessionOptions = {\n\turl: string;\n\troomId: string;\n\tpeer: RealtimeSessionPeerInput;\n\tenabled?: boolean;\n\tdraftStorage?: RealtimeDraftStorage | null;\n\treconnect?: boolean;\n\theartbeatMs?: number;\n\tmaxReconnectDelayMs?: number;\n\tinitialReconnectDelayMs?: number;\n\tconnectTimeoutMs?: number;\n\tonError?: (message: string) => void;\n};\n\nexport type RealtimeDraftStorage = {\n\tgetItem: (key: string) => string | null | Promise<string | null>;\n\tsetItem: (key: string, value: string) => void | Promise<void>;\n\tremoveItem: (key: string) => void | Promise<void>;\n};\n\nexport type RealtimeViewportCamera = {\n\tx: number;\n\ty: number;\n\tzoom: number;\n};\n\nexport type RealtimeViewportHandle = {\n\tgetCamera: () => RealtimeViewportCamera | null;\n\trequestRender: () => void;\n\tgetViewportSize: () => { width: number; height: number };\n};\n\nexport type RealtimePlacementPreview =\n\t| {\n\t\t\treadonly kind: \"rect\" | \"ellipse\" | \"architectural-cloud\" | \"marquee\";\n\t\t\treadonly rect: {\n\t\t\t\treadonly x: number;\n\t\t\t\treadonly y: number;\n\t\t\t\treadonly width: number;\n\t\t\t\treadonly height: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\treadonly kind: \"line\" | \"arrow\";\n\t\t\treadonly start: { readonly x: number; readonly y: number };\n\t\t\treadonly end: { readonly x: number; readonly y: number };\n\t }\n\t| {\n\t\t\treadonly kind: \"stroke\";\n\t\t\treadonly tool: \"draw\" | \"marker\" | \"laser\";\n\t\t\treadonly points: readonly { readonly x: number; readonly y: number }[];\n\t\t\treadonly style?: StrokeStyle;\n\t };\n\nexport type RealtimeViewportPresenceBindings = {\n\tremotePresence: RealtimeSessionPeer[];\n\tonWorldPointerMove: (world: { readonly x: number; readonly y: number }) => void;\n\tonWorldPointerLeave: () => void;\n\tonPlacementPreviewChange: (preview: RealtimePlacementPreview | null) => void;\n\tonCameraChange: () => void;\n};\n\ntype BindViewportPresenceOptions = {\n\tactiveTool?: string;\n\tviewportRef?: RefObject<RealtimeViewportHandle | null>;\n};\n\nexport type RealtimeSyncState =\n\t| \"connected\"\n\t| \"reconnecting\"\n\t| \"offline\"\n\t| \"conflicted\";\n\nexport type RealtimeDocumentConflict = {\n\treadonly serverRevision: number;\n\treadonly serverItems: VectorSceneItem[];\n\treadonly localItems: VectorSceneItem[];\n};\n\ntype RealtimeOfflineDraft = {\n\treadonly roomId: string;\n\treadonly baseRevision: number;\n\treadonly items: VectorSceneItem[];\n\treadonly updatedAt: number;\n\t/**\n\t * Optional encoded Y.Doc state. When present, applying the draft on\n\t * reconnect uses the binary state (CRDT-preserving). Older drafts may\n\t * only have `items` (legacy format) — in that case we bootstrap a fresh\n\t * Y.Doc from the items array.\n\t */\n\treadonly yDocState?: string;\n\t/**\n\t * Optional list of ids that were not yet server-confirmed when the draft\n\t * was written. Lets us continue treating them as locally-pending after\n\t * reload.\n\t */\n\treadonly pendingIds?: string[];\n};\n\nexport type UseRealtimeSessionResult = {\n\tconnection: RealtimeConnectionInfo;\n\tsessionPeers: RealtimeSessionPeer[];\n\tremotePresence: RealtimeSessionPeer[];\n\tremoteAdapter: VectorCanvasRemoteAdapter;\n\tdocument: RealtimeDocumentSnapshot | null;\n\thasLocalOfflineDraft: boolean;\n\thasPendingDocumentSync: boolean;\n\tsyncState: RealtimeSyncState;\n\tconflict: RealtimeDocumentConflict | null;\n\tbindViewportPresence: (\n\t\toptions?: BindViewportPresenceOptions,\n\t) => RealtimeViewportPresenceBindings;\n\tsyncViewportPresence: (options?: BindViewportPresenceOptions) => boolean;\n\tresolveConflict: (action: \"keep-local\" | \"use-server\") => void;\n\tclearLocalDraft: () => void;\n\tflushDocumentSync: () => Promise<void>;\n\tdisconnect: () => void;\n\treconnectNow: () => void;\n};\n\nconst DRAFT_STORAGE_PREFIX = \"canvu-realtime-draft:\";\nconst DOCUMENT_FLUSH_DEBOUNCE_MS = 120;\nconst DRAFT_PERSIST_DEBOUNCE_MS = 420;\n\ntype IdleCallbackHandle = number | ReturnType<typeof setTimeout>;\ntype TimeoutHandle = ReturnType<typeof setTimeout>;\ntype IntervalHandle = ReturnType<typeof setInterval>;\ntype IdleRuntime = typeof globalThis & {\n\trequestIdleCallback?: (\n\t\tcallback: () => void,\n\t\toptions?: { timeout?: number },\n\t) => number;\n\tcancelIdleCallback?: (handle: number) => void;\n\tlocalStorage?: Storage;\n};\ntype SocketEventType = \"open\" | \"message\" | \"error\" | \"close\";\n\nfunction requestRuntimeIdleCallback(\n\tcallback: () => void,\n\ttimeout: number,\n): IdleCallbackHandle {\n\tconst runtime = globalThis as IdleRuntime;\n\tif (typeof runtime.requestIdleCallback === \"function\") {\n\t\treturn runtime.requestIdleCallback(callback, { timeout });\n\t}\n\treturn globalThis.setTimeout(callback, timeout);\n}\n\nfunction cancelRuntimeIdleCallback(handle: IdleCallbackHandle | null): void {\n\tif (handle == null) return;\n\tconst runtime = globalThis as IdleRuntime;\n\tif (typeof runtime.cancelIdleCallback === \"function\") {\n\t\truntime.cancelIdleCallback(Number(handle));\n\t\treturn;\n\t}\n\tglobalThis.clearTimeout(handle);\n}\n\nexport function createBrowserDraftStorage(): RealtimeDraftStorage | null {\n\tconst runtime = globalThis as IdleRuntime;\n\tconst storage = runtime.localStorage;\n\tif (!storage) return null;\n\treturn {\n\t\tgetItem: (key) => storage.getItem(key),\n\t\tsetItem: (key, value) => storage.setItem(key, value),\n\t\tremoveItem: (key) => storage.removeItem(key),\n\t};\n}\n\nfunction getSocketHandlerProperty(\n\ttype: SocketEventType,\n): \"onopen\" | \"onmessage\" | \"onerror\" | \"onclose\" {\n\tif (type === \"open\") return \"onopen\";\n\tif (type === \"message\") return \"onmessage\";\n\tif (type === \"error\") return \"onerror\";\n\treturn \"onclose\";\n}\n\nfunction addRealtimeSocketListener(\n\tsocket: WebSocket,\n\ttype: SocketEventType,\n\thandler: (event: Event | MessageEvent | CloseEvent) => void,\n): () => void {\n\tif (\n\t\ttypeof socket.addEventListener === \"function\" &&\n\t\ttypeof socket.removeEventListener === \"function\"\n\t) {\n\t\tconst listener = handler as EventListener;\n\t\tsocket.addEventListener(type, listener);\n\t\treturn () => socket.removeEventListener(type, listener);\n\t}\n\tconst property = getSocketHandlerProperty(type);\n\tconst handlerSocket = socket as WebSocket & {\n\t\tonopen: ((event: Event) => void) | null;\n\t\tonmessage: ((event: MessageEvent) => void) | null;\n\t\tonerror: ((event: Event) => void) | null;\n\t\tonclose: ((event: CloseEvent) => void) | null;\n\t};\n\tif (property === \"onopen\") {\n\t\tconst previous = handlerSocket.onopen;\n\t\thandlerSocket.onopen = (event) => handler(event);\n\t\treturn () => {\n\t\t\thandlerSocket.onopen = previous;\n\t\t};\n\t}\n\tif (property === \"onmessage\") {\n\t\tconst previous = handlerSocket.onmessage;\n\t\thandlerSocket.onmessage = (event) => handler(event);\n\t\treturn () => {\n\t\t\thandlerSocket.onmessage = previous;\n\t\t};\n\t}\n\tif (property === \"onerror\") {\n\t\tconst previous = handlerSocket.onerror;\n\t\thandlerSocket.onerror = (event) => handler(event);\n\t\treturn () => {\n\t\t\thandlerSocket.onerror = previous;\n\t\t};\n\t}\n\tconst previous = handlerSocket.onclose;\n\thandlerSocket.onclose = (event) => handler(event);\n\treturn () => {\n\t\thandlerSocket.onclose = previous;\n\t};\n}\n\nfunction createClientId(): string {\n\tif (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n\t\treturn crypto.randomUUID();\n\t}\n\treturn `client-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction normalizeSocketUrl(input: string): string {\n\tif (!input) return \"\";\n\tif (input.startsWith(\"ws://\") || input.startsWith(\"wss://\")) return input;\n\tif (input.startsWith(\"http://\")) return `ws://${input.slice(\"http://\".length)}`;\n\tif (input.startsWith(\"https://\")) return `wss://${input.slice(\"https://\".length)}`;\n\tif (input.startsWith(\"/\")) {\n\t\tconst location = globalThis.location;\n\t\tif (!location) return \"\";\n\t\tconst protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\treturn `${protocol}//${location.host}${input}`;\n\t}\n\treturn input;\n}\n\nfunction isValidSocketUrl(input: string): boolean {\n\tif (!input || input.includes(\"<\") || input.includes(\">\")) return false;\n\ttry {\n\t\tconst parsed = new URL(input);\n\t\treturn parsed.protocol === \"ws:\" || parsed.protocol === \"wss:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction sanitizeRealtimeItem(item: VectorSceneItem): VectorSceneItem {\n\tif (item.toolKind !== \"image\") return item;\n\treturn {\n\t\t...item,\n\t\timageBlobId: undefined,\n\t\timageThumbnailBlobId: undefined,\n\t\timageRasterHref: undefined,\n\t\timageThumbnailHref: undefined,\n\t\tchildrenSvg: \"\",\n\t};\n}\n\nfunction sanitizeRealtimeItems(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\treturn items.map(sanitizeRealtimeItem);\n}\n\nfunction sanitizeRealtimeSnapshot(\n\tsnapshot: RealtimeDocumentSnapshot,\n): RealtimeDocumentSnapshot {\n\treturn {\n\t\t...snapshot,\n\t\titems: sanitizeRealtimeItems(snapshot.items),\n\t};\n}\n\nfunction serializeItems(items: VectorSceneItem[]): string | null {\n\ttry {\n\t\treturn JSON.stringify(sanitizeRealtimeItems(items));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction sameSerializedItems(\n\tleft: VectorSceneItem[] | null | undefined,\n\tright: VectorSceneItem[] | null | undefined,\n): boolean {\n\tif (left === right) return true;\n\tif (!left || !right) return false;\n\tconst leftJson = serializeItems(left);\n\tconst rightJson = serializeItems(right);\n\treturn leftJson != null && leftJson === rightJson;\n}\n\nfunction nowMs(): number {\n\treturn Date.now();\n}\n\nfunction hasDurableDocumentPersistence(snapshot: RealtimeDocumentSnapshot): boolean {\n\treturn (\n\t\tsnapshot.persistedRevision == null ||\n\t\tsnapshot.persistedRevision >= snapshot.revision\n\t);\n}\n\nfunction draftStorageKey(roomId: string): string {\n\treturn `${DRAFT_STORAGE_PREFIX}${roomId}`;\n}\n\nfunction isRealtimeOfflineDraft(value: unknown): value is RealtimeOfflineDraft {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst record = value as Record<string, unknown>;\n\tif (\n\t\ttypeof record.roomId !== \"string\" ||\n\t\ttypeof record.baseRevision !== \"number\" ||\n\t\ttypeof record.updatedAt !== \"number\" ||\n\t\t!Array.isArray(record.items)\n\t) {\n\t\treturn false;\n\t}\n\tif (record.yDocState != null && typeof record.yDocState !== \"string\") {\n\t\treturn false;\n\t}\n\tif (record.pendingIds != null && !Array.isArray(record.pendingIds)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nasync function readRealtimeOfflineDraft(\n\troomId: string,\n\tstorage: RealtimeDraftStorage | null,\n): Promise<RealtimeOfflineDraft | null> {\n\tif (!storage || !roomId) return null;\n\ttry {\n\t\tconst raw = await storage.getItem(draftStorageKey(roomId));\n\t\tif (!raw) return null;\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (!isRealtimeOfflineDraft(parsed)) return null;\n\t\treturn {\n\t\t\t...parsed,\n\t\t\titems: sanitizeRealtimeItems(parsed.items),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeRealtimeOfflineDraft(\n\tdraft: RealtimeOfflineDraft | null,\n\tstorage: RealtimeDraftStorage | null,\n): Promise<void> {\n\tif (!storage) return;\n\tif (!draft) return;\n\ttry {\n\t\tawait storage.setItem(\n\t\t\tdraftStorageKey(draft.roomId),\n\t\t\tJSON.stringify({\n\t\t\t\t...draft,\n\t\t\t\titems: sanitizeRealtimeItems(draft.items),\n\t\t\t}),\n\t\t);\n\t} catch {}\n}\n\nasync function removeRealtimeOfflineDraft(\n\troomId: string,\n\tstorage: RealtimeDraftStorage | null,\n): Promise<void> {\n\tif (!storage || !roomId) return;\n\ttry {\n\t\tawait storage.removeItem(draftStorageKey(roomId));\n\t} catch {}\n}\n\nfunction getViewportCameraSnapshot(\n\tviewport: RealtimeViewportHandle | null | undefined,\n): RealtimeSessionPeer[\"camera\"] | null {\n\tif (!viewport) return null;\n\tconst camera = viewport.getCamera();\n\tif (!camera) return null;\n\tconst viewportSize = viewport.getViewportSize();\n\treturn {\n\t\tx: camera.x,\n\t\ty: camera.y,\n\t\tzoom: camera.zoom,\n\t\tviewportWidth: viewportSize.width,\n\t\tviewportHeight: viewportSize.height,\n\t};\n}\n\nfunction prepareRealtimeItems(\n\titems: readonly VectorSceneItem[],\n): { items: VectorSceneItem[]; serialized: string } | null {\n\ttry {\n\t\tconst sanitizedItems = sanitizeRealtimeItems(items);\n\t\treturn {\n\t\t\titems: sanitizedItems,\n\t\t\tserialized: JSON.stringify(sanitizedItems),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction getRealtimeItemId(item: VectorSceneItem): string | null {\n\tconst id = (item as { id?: unknown }).id;\n\treturn typeof id === \"string\" ? id : null;\n}\n\nfunction serializeRealtimeItem(item: VectorSceneItem): string | null {\n\ttry {\n\t\treturn JSON.stringify(sanitizeRealtimeItem(item));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction resolvePendingDraftItemIds(\n\tboard: YjsBoardDoc,\n\titems: readonly VectorSceneItem[],\n): string[] | undefined {\n\tconst pendingIds = new Set<string>();\n\tfor (const item of items) {\n\t\tconst id = getRealtimeItemId(item);\n\t\tif (!id) continue;\n\t\tconst confirmedSerialized = board.lastServerConfirmedItemSerializations.get(id);\n\t\tconst serialized = serializeRealtimeItem(item);\n\t\tif (!confirmedSerialized || !serialized || serialized !== confirmedSerialized) {\n\t\t\tpendingIds.add(id);\n\t\t}\n\t}\n\treturn pendingIds.size > 0 ? Array.from(pendingIds) : undefined;\n}\n\nfunction remoteMarkupStrokeFromPlacementPreview(\n\tpreview: RealtimePlacementPreview | null,\n): RealtimeSessionPeer[\"markupStroke\"] | null {\n\tif (!preview || preview.kind !== \"stroke\" || preview.points.length === 0) {\n\t\treturn null;\n\t}\n\tconst style = preview.style;\n\treturn {\n\t\tpoints: preview.points,\n\t\ttool: preview.tool,\n\t\t...(style?.strokeWidth != null ? { strokeWidth: style.strokeWidth } : {}),\n\t\t...(style?.stroke ? { stroke: style.stroke } : {}),\n\t\t...(style?.strokeOpacity != null ? { strokeOpacity: style.strokeOpacity } : {}),\n\t};\n}\n\nexport function useRealtimeSession(\n\toptions: UseRealtimeSessionOptions,\n): UseRealtimeSessionResult {\n\tconst {\n\t\turl,\n\t\troomId,\n\t\tpeer,\n\t\tenabled = true,\n\t\tdraftStorage = createBrowserDraftStorage(),\n\t\treconnect = true,\n\t\theartbeatMs = 10_000,\n\t\tmaxReconnectDelayMs = 12_000,\n\t\tinitialReconnectDelayMs = 800,\n\t\tconnectTimeoutMs = 10_000,\n\t\tonError,\n\t} = options;\n\n\tconst clientIdRef = useRef(peer.clientId ?? createClientId());\n\tconst wsRef = useRef<WebSocket | null>(null);\n\tconst reconnectTimerRef = useRef<TimeoutHandle | null>(null);\n\tconst heartbeatTimerRef = useRef<IntervalHandle | null>(null);\n\tconst connectTimeoutRef = useRef<TimeoutHandle | null>(null);\n\tconst documentFlushTimerRef = useRef<TimeoutHandle | null>(null);\n\tconst documentFlushIdleRef = useRef<IdleCallbackHandle | null>(null);\n\tconst draftPersistTimerRef = useRef<TimeoutHandle | null>(null);\n\tconst draftPersistIdleRef = useRef<IdleCallbackHandle | null>(null);\n\tconst draftStorageRef = useRef<RealtimeDraftStorage | null>(draftStorage);\n\tdraftStorageRef.current = draftStorage;\n\tconst manualDisconnectRef = useRef(false);\n\tconst retryCountRef = useRef(0);\n\tconst currentRevisionRef = useRef(0);\n\tconst outboundInFlightRef = useRef<{\n\t\tbaseRevision: number;\n\t\titems: VectorSceneItem[];\n\t\tserialized: string | null;\n\t} | null>(null);\n\tconst queuedDirtyRef = useRef(false);\n\t// Latest items snapshot the consumer wants to push, captured by\n\t// queueDocumentSend at potentially 60fps. The expensive merge into the\n\t// Y.Doc, projection, encoding and React state updates are all deferred\n\t// to flushQueuedDocument so the input thread on iPad isn't saturated\n\t// during continuous drawing.\n\tconst pendingLocalItemsRef = useRef<VectorSceneItem[] | null>(null);\n\tconst subscriberRefs = useRef(new Set<(items: VectorSceneItem[]) => void>());\n\tconst boardRef = useRef<YjsBoardDoc | null>(null);\n\tif (boardRef.current == null) {\n\t\tboardRef.current = createYjsBoardDoc();\n\t}\n\tconst lastCursorRef = useRef<{ x: number; y: number } | null>(null);\n\tconst lastMarkupStrokeRef = useRef<\n\t\tRealtimeSessionPeer[\"markupStroke\"] | null | undefined\n\t>(null);\n\tconst lastCameraRef = useRef<RealtimeSessionPeer[\"camera\"] | null | undefined>(\n\t\tnull,\n\t);\n\tconst lastActiveToolRef = useRef<string | undefined>(undefined);\n\tconst latestDocumentRef = useRef<RealtimeDocumentSnapshot | null>(null);\n\tconst connectionStateRef = useRef<RealtimeConnectionInfo[\"state\"]>(\n\t\tenabled ? \"connecting\" : \"offline\",\n\t);\n\tconst localDraftRef = useRef<RealtimeOfflineDraft | null>(null);\n\tconst conflictRef = useRef<RealtimeDocumentConflict | null>(null);\n\tconst onErrorRef = useRef(onError);\n\tonErrorRef.current = onError;\n\n\tconst [connectSequence, setConnectSequence] = useState(0);\n\tconst [connection, setConnection] = useState<RealtimeConnectionInfo>({\n\t\tstate: enabled ? \"connecting\" : \"offline\",\n\t\tconnected: false,\n\t\troomId,\n\t\tclientId: null,\n\t\tretryCount: 0,\n\t\tlastConnectedAt: null,\n\t\tlastMessageAt: null,\n\t\tlastPongAt: null,\n\t\tlastError: null,\n\t});\n\tconst [sessionPeers, setSessionPeers] = useState<RealtimeSessionPeer[]>([]);\n\tconst [document, setDocument] = useState<RealtimeDocumentSnapshot | null>(null);\n\tconst [hasLocalOfflineDraft, setHasLocalOfflineDraft] = useState(false);\n\tconst [hasPendingDocumentSync, setHasPendingDocumentSync] = useState(false);\n\tconst [conflict, setConflict] = useState<RealtimeDocumentConflict | null>(null);\n\tconnectionStateRef.current = connection.state;\n\n\tconst syncState = useMemo<RealtimeSyncState>(() => {\n\t\tif (conflict != null) return \"conflicted\";\n\t\tif (connection.connected) return \"connected\";\n\t\tif (connection.state === \"reconnecting\" || connection.state === \"connecting\") {\n\t\t\treturn \"reconnecting\";\n\t\t}\n\t\treturn \"offline\";\n\t}, [conflict, connection.connected, connection.state]);\n\n\tconst clearReconnectTimer = useCallback(() => {\n\t\tif (reconnectTimerRef.current != null) {\n\t\t\tglobalThis.clearTimeout(reconnectTimerRef.current);\n\t\t\treconnectTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst clearHeartbeatTimer = useCallback(() => {\n\t\tif (heartbeatTimerRef.current != null) {\n\t\t\tglobalThis.clearInterval(heartbeatTimerRef.current);\n\t\t\theartbeatTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst clearConnectTimeout = useCallback(() => {\n\t\tif (connectTimeoutRef.current != null) {\n\t\t\tglobalThis.clearTimeout(connectTimeoutRef.current);\n\t\t\tconnectTimeoutRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst clearDocumentFlushSchedule = useCallback(() => {\n\t\tif (documentFlushTimerRef.current != null) {\n\t\t\tglobalThis.clearTimeout(documentFlushTimerRef.current);\n\t\t\tdocumentFlushTimerRef.current = null;\n\t\t}\n\t\tcancelRuntimeIdleCallback(documentFlushIdleRef.current);\n\t\tdocumentFlushIdleRef.current = null;\n\t}, []);\n\n\tconst clearDraftPersistSchedule = useCallback(() => {\n\t\tif (draftPersistTimerRef.current != null) {\n\t\t\tglobalThis.clearTimeout(draftPersistTimerRef.current);\n\t\t\tdraftPersistTimerRef.current = null;\n\t\t}\n\t\tcancelRuntimeIdleCallback(draftPersistIdleRef.current);\n\t\tdraftPersistIdleRef.current = null;\n\t}, []);\n\n\tconst updateConnection = useCallback(\n\t\t(\n\t\t\tpatch:\n\t\t\t\t| Partial<RealtimeConnectionInfo>\n\t\t\t\t| ((prev: RealtimeConnectionInfo) => RealtimeConnectionInfo),\n\t\t) => {\n\t\t\tsetConnection((prev) => {\n\t\t\t\tif (typeof patch === \"function\") return patch(prev);\n\t\t\t\treturn { ...prev, ...patch };\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst notifySubscribers = useCallback((items: VectorSceneItem[]) => {\n\t\tfor (const subscriber of subscriberRefs.current) {\n\t\t\tsubscriber(items);\n\t\t}\n\t}, []);\n\n\t// applyDocument merges a snapshot into the local Y.Doc. When `replace` is\n\t// true (used for the very first bootstrap when we have no local items), the\n\t// Y.Doc is reset to exactly the snapshot. Otherwise applyServerSnapshotToYDoc\n\t// runs the smart merge that preserves locally-pending items and respects\n\t// server-side deletes.\n\tconst applyDocument = useCallback(\n\t\t(\n\t\t\tsnapshot: RealtimeDocumentSnapshot,\n\t\t\toptions?: { suppressSubscriberNotify?: boolean; replace?: boolean },\n\t\t) => {\n\t\t\tconst currentSnapshot = latestDocumentRef.current;\n\t\t\tif (\n\t\t\t\tcurrentSnapshot &&\n\t\t\t\tcurrentSnapshot.revision === snapshot.revision &&\n\t\t\t\tcurrentSnapshot.updatedByClientId === snapshot.updatedByClientId &&\n\t\t\t\tcurrentSnapshot.persistedRevision === snapshot.persistedRevision &&\n\t\t\t\tsameSerializedItems(currentSnapshot.items, snapshot.items)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst board = boardRef.current;\n\t\t\tif (board) {\n\t\t\t\t// Drain any pending local items into the Y.Doc *before* applying\n\t\t\t\t// the server snapshot. queueDocumentSend only stashes the latest\n\t\t\t\t// items in pendingLocalItemsRef so the canvas hot path stays\n\t\t\t\t// cheap, but that means items the user just drew may not be in\n\t\t\t\t// the Y.Doc yet. If we merge the server snapshot first, the\n\t\t\t\t// projected items would be missing those local strokes and\n\t\t\t\t// trazo would receive a snapshot that wipes them from view\n\t\t\t\t// until the next flush round-trip echoes them back.\n\t\t\t\tif (!options?.replace) {\n\t\t\t\t\tconst pendingLocal = pendingLocalItemsRef.current;\n\t\t\t\t\tif (pendingLocal) {\n\t\t\t\t\t\tpendingLocalItemsRef.current = null;\n\t\t\t\t\t\tapplyLocalItemsToYDoc(board, {\n\t\t\t\t\t\t\titems: pendingLocal,\n\t\t\t\t\t\t\torigin: ORIGIN_LOCAL,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tqueuedDirtyRef.current = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (options?.replace) {\n\t\t\t\t\treplaceYDocWithSnapshot(board, {\n\t\t\t\t\t\titems: snapshot.items,\n\t\t\t\t\t\torigin: ORIGIN_REMOTE,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tapplyServerSnapshotToYDoc(board, {\n\t\t\t\t\t\titems: snapshot.items,\n\t\t\t\t\t\torigin: ORIGIN_REMOTE,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst mergedItems = board ? readVectorItems(board.yItems) : snapshot.items;\n\t\t\tconst mergedSnapshot: RealtimeDocumentSnapshot = {\n\t\t\t\t...snapshot,\n\t\t\t\titems: mergedItems,\n\t\t\t};\n\t\t\tcurrentRevisionRef.current = snapshot.revision;\n\t\t\tlatestDocumentRef.current = mergedSnapshot;\n\t\t\tsetDocument(mergedSnapshot);\n\t\t\tif (!options?.suppressSubscriberNotify) {\n\t\t\t\tnotifySubscribers(mergedItems);\n\t\t\t}\n\t\t},\n\t\t[notifySubscribers],\n\t);\n\n\tconst setConflictState = useCallback(\n\t\t(nextConflict: RealtimeDocumentConflict | null) => {\n\t\t\tconflictRef.current = nextConflict;\n\t\t\tsetConflict(nextConflict);\n\t\t},\n\t\t[],\n\t);\n\n\tconst setLocalDraft = useCallback(\n\t\t(nextDraft: RealtimeOfflineDraft | null) => {\n\t\t\tlocalDraftRef.current = nextDraft;\n\t\t\tsetHasLocalOfflineDraft(nextDraft != null);\n\t\t\tif (nextDraft) return;\n\t\t\tvoid removeRealtimeOfflineDraft(roomId, draftStorageRef.current);\n\t\t},\n\t\t[roomId],\n\t);\n\n\tconst persistLocalDraft = useCallback(() => {\n\t\tclearDraftPersistSchedule();\n\t\tif (!localDraftRef.current) {\n\t\t\tvoid removeRealtimeOfflineDraft(roomId, draftStorageRef.current);\n\t\t\treturn;\n\t\t}\n\t\t// Encode the Y.Doc state lazily, right before writing to localStorage,\n\t\t// so the expensive Y.encodeStateAsUpdate + base64 work stays out of\n\t\t// the per-flush hot path. flushQueuedDocument only updates the\n\t\t// in-memory draft (items + meta + pendingIds); the binary CRDT state\n\t\t// is materialised here on the debounced persistence schedule.\n\t\tconst board = boardRef.current;\n\t\tconst draft = localDraftRef.current;\n\t\tconst canEncodeYDocState =\n\t\t\tboard &&\n\t\t\tdraft.yDocState == null &&\n\t\t\tsameSerializedItems(readVectorItems(board.yItems), draft.items);\n\t\tconst draftToWrite = canEncodeYDocState\n\t\t\t? { ...draft, yDocState: encodeYDocState(board) }\n\t\t\t: draft;\n\t\tvoid writeRealtimeOfflineDraft(draftToWrite, draftStorageRef.current);\n\t}, [clearDraftPersistSchedule, roomId]);\n\n\tconst scheduleDraftPersistence = useCallback(() => {\n\t\tclearDraftPersistSchedule();\n\t\tdraftPersistTimerRef.current = globalThis.setTimeout(() => {\n\t\t\tdraftPersistTimerRef.current = null;\n\t\t\tdraftPersistIdleRef.current = requestRuntimeIdleCallback(() => {\n\t\t\t\tdraftPersistIdleRef.current = null;\n\t\t\t\tpersistLocalDraft();\n\t\t\t}, DRAFT_PERSIST_DEBOUNCE_MS);\n\t\t}, DRAFT_PERSIST_DEBOUNCE_MS);\n\t}, [clearDraftPersistSchedule, persistLocalDraft]);\n\n\tconst clearLocalDraft = useCallback(() => {\n\t\tsetLocalDraft(null);\n\t\tclearDraftPersistSchedule();\n\t}, [clearDraftPersistSchedule, setLocalDraft]);\n\n\tconst createSelfPeer = useCallback(\n\t\t(state: RealtimeConnectionInfo[\"state\"]): RealtimeSessionPeer => ({\n\t\t\tid: peer.id,\n\t\t\tclientId: clientIdRef.current,\n\t\t\tpeerId: peer.id,\n\t\t\troomId,\n\t\t\tjoinedAt: connection.lastConnectedAt ?? nowMs(),\n\t\t\tlastSeenAt: nowMs(),\n\t\t\tcursor: lastCursorRef.current,\n\t\t\tisSelf: true,\n\t\t\tconnectionState: state,\n\t\t\t...(peer.displayName ? { displayName: peer.displayName } : {}),\n\t\t\t...(peer.color ? { color: peer.color } : {}),\n\t\t\t...(peer.image ? { image: peer.image } : {}),\n\t\t\t...(lastMarkupStrokeRef.current !== undefined\n\t\t\t\t? { markupStroke: lastMarkupStrokeRef.current ?? null }\n\t\t\t\t: {}),\n\t\t\t...(lastCameraRef.current !== undefined\n\t\t\t\t? { camera: lastCameraRef.current ?? null }\n\t\t\t\t: {}),\n\t\t\t...(lastActiveToolRef.current\n\t\t\t\t? { activeTool: lastActiveToolRef.current }\n\t\t\t\t: {}),\n\t\t}),\n\t\t[\n\t\t\tconnection.lastConnectedAt,\n\t\t\tpeer.color,\n\t\t\tpeer.displayName,\n\t\t\tpeer.id,\n\t\t\tpeer.image,\n\t\t\troomId,\n\t\t],\n\t);\n\n\tconst collapsePeersToSelf = useCallback(\n\t\t(state: RealtimeConnectionInfo[\"state\"]) => {\n\t\t\tsetSessionPeers((prev) => {\n\t\t\t\tconst selfPeer = prev.find(\n\t\t\t\t\t(peerState) => peerState.clientId === clientIdRef.current,\n\t\t\t\t);\n\t\t\t\treturn [\n\t\t\t\t\tselfPeer\n\t\t\t\t\t\t? { ...selfPeer, isSelf: true, connectionState: state }\n\t\t\t\t\t\t: createSelfPeer(state),\n\t\t\t\t];\n\t\t\t});\n\t\t},\n\t\t[createSelfPeer],\n\t);\n\n\tconst applyPeers = useCallback((peers: RealtimeSessionPeer[]) => {\n\t\tconst selfClientId = clientIdRef.current;\n\t\tsetSessionPeers(\n\t\t\tpeers.map((peerState) =>\n\t\t\t\tpeerState.clientId === selfClientId\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...peerState,\n\t\t\t\t\t\t\tisSelf: true,\n\t\t\t\t\t\t\tconnectionState: connectionStateRef.current,\n\t\t\t\t\t\t}\n\t\t\t\t\t: peerState,\n\t\t\t),\n\t\t);\n\t}, []);\n\n\tconst buildClientMessage = useCallback(\n\t\t(message: RealtimeClientMessage): string => JSON.stringify(message),\n\t\t[],\n\t);\n\n\tconst sendRaw = useCallback(\n\t\t(message: RealtimeClientMessage): boolean => {\n\t\t\tconst ws = wsRef.current;\n\t\t\tconst WebSocketConstructor = globalThis.WebSocket;\n\t\t\tif (!ws || !WebSocketConstructor) return false;\n\t\t\tif (ws.readyState !== WebSocketConstructor.OPEN) return false;\n\t\t\tws.send(buildClientMessage(message));\n\t\t\treturn true;\n\t\t},\n\t\t[buildClientMessage],\n\t);\n\n\tconst flushQueuedDocument = useCallback(() => {\n\t\tclearDocumentFlushSchedule();\n\t\tconst board = boardRef.current;\n\t\tif (!board) return;\n\t\tif (!queuedDirtyRef.current && pendingLocalItemsRef.current == null) return;\n\t\tif (outboundInFlightRef.current) return;\n\t\t// Heavy work deferred from queueDocumentSend: apply the latest local\n\t\t// items snapshot the consumer pushed (possibly accumulated over many\n\t\t// 60fps onItemsChange firings) into the Y.Doc once.\n\t\tconst pendingLocal = pendingLocalItemsRef.current;\n\t\tif (pendingLocal) {\n\t\t\tpendingLocalItemsRef.current = null;\n\t\t\tapplyLocalItemsToYDoc(board, {\n\t\t\t\titems: pendingLocal,\n\t\t\t\torigin: ORIGIN_LOCAL,\n\t\t\t});\n\t\t}\n\t\tconst baseRevision = currentRevisionRef.current;\n\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\tconst preparedItems = prepareRealtimeItems(mergedItems);\n\t\tif (!preparedItems) return;\n\t\tqueuedDirtyRef.current = false;\n\t\toutboundInFlightRef.current = {\n\t\t\tbaseRevision,\n\t\t\titems: preparedItems.items,\n\t\t\tserialized: preparedItems.serialized,\n\t\t};\n\t\tconst didSend = sendRawRef.current({\n\t\t\ttype: \"document:update\",\n\t\t\troomId,\n\t\t\tclientId: clientIdRef.current,\n\t\t\tbaseRevision,\n\t\t\titems: preparedItems.items,\n\t\t});\n\t\t// Refresh the offline draft with the post-merge state. Doing this\n\t\t// here (~8x/sec at flush rate) instead of on every queueDocumentSend\n\t\t// avoids encoding the full Y.Doc and triggering React state churn at\n\t\t// 60fps during drawing.\n\t\tconst pendingIds = getLocallyPendingItemIds(board);\n\t\tif (pendingIds.size > 0) {\n\t\t\t// Don't encode the Y.Doc here — persistLocalDraft materialises it\n\t\t\t// lazily so this hot path stays cheap during 60fps drawing.\n\t\t\tsetLocalDraftRef.current({\n\t\t\t\troomId,\n\t\t\t\tbaseRevision,\n\t\t\t\titems: mergedItems,\n\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\tpendingIds: Array.from(pendingIds),\n\t\t\t});\n\t\t\tscheduleDraftPersistenceRef.current?.();\n\t\t}\n\t\tif (!didSend) {\n\t\t\tqueuedDirtyRef.current = true;\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tsetHasPendingDocumentSync(true);\n\t\t}\n\t}, [clearDocumentFlushSchedule, roomId]);\n\n\tconst scheduleDocumentFlush = useCallback(() => {\n\t\tclearDocumentFlushSchedule();\n\t\tdocumentFlushTimerRef.current = globalThis.setTimeout(() => {\n\t\t\tdocumentFlushTimerRef.current = null;\n\t\t\tdocumentFlushIdleRef.current = requestRuntimeIdleCallback(() => {\n\t\t\t\tdocumentFlushIdleRef.current = null;\n\t\t\t\tflushQueuedDocument();\n\t\t\t}, DOCUMENT_FLUSH_DEBOUNCE_MS);\n\t\t}, DOCUMENT_FLUSH_DEBOUNCE_MS);\n\t}, [clearDocumentFlushSchedule, flushQueuedDocument]);\n\n\t// queueDocumentSend is on the canvas hot path — invoked at up to 60fps\n\t// during continuous drawing. Keep it O(1): just stash the latest items\n\t// snapshot and schedule a flush. All Y.Doc mutations, projection,\n\t// encoding and React state updates are amortised across the flush\n\t// window (DOCUMENT_FLUSH_DEBOUNCE_MS) inside flushQueuedDocument.\n\tconst queueDocumentSend = useCallback(\n\t\t(items: VectorSceneItem[]) => {\n\t\t\tpendingLocalItemsRef.current = items;\n\t\t\tqueuedDirtyRef.current = true;\n\t\t\tsetHasPendingDocumentSync(true);\n\t\t\tsetHasLocalOfflineDraft(true);\n\t\t\tconst board = boardRef.current;\n\t\t\tconst draftItems = sanitizeRealtimeItems(items);\n\t\t\tsetLocalDraftRef.current({\n\t\t\t\troomId,\n\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\titems: draftItems,\n\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\tpendingIds: board\n\t\t\t\t\t? resolvePendingDraftItemIds(board, draftItems)\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tscheduleDraftPersistenceRef.current?.();\n\t\t\tscheduleDocumentFlushRef.current();\n\t\t},\n\t\t[roomId],\n\t);\n\n\t// Bootstrap the Y.Doc from a persisted draft. When the draft has a binary\n\t// yDocState (new format), we decode it directly to preserve CRDT history\n\t// and pending-id tracking. For legacy drafts (items only), we replace the\n\t// Y.Doc with the items array and conservatively mark every item as still\n\t// \"pending server confirmation\" — the next server snapshot will reconcile.\n\tconst applyDraftSnapshot = useCallback(\n\t\t(\n\t\t\tdraft: RealtimeOfflineDraft,\n\t\t\toptions?: { suppressSubscriberNotify?: boolean },\n\t\t) => {\n\t\t\tconst board = boardRef.current;\n\t\t\tif (board) {\n\t\t\t\tlet restoredFromBinary = false;\n\t\t\t\tif (draft.yDocState) {\n\t\t\t\t\tif (board.yItems.length > 0) {\n\t\t\t\t\t\tboard.doc.transact(() => {\n\t\t\t\t\t\t\tboard.yItems.delete(0, board.yItems.length);\n\t\t\t\t\t\t}, ORIGIN_BOOTSTRAP);\n\t\t\t\t\t}\n\t\t\t\t\trestoredFromBinary = decodeYDocState(board, draft.yDocState);\n\t\t\t\t\tif (restoredFromBinary) {\n\t\t\t\t\t\tconst allIds = new Set<string>();\n\t\t\t\t\t\tconst allItems = readVectorItems(board.yItems);\n\t\t\t\t\t\tfor (let i = 0; i < board.yItems.length; i++) {\n\t\t\t\t\t\t\tconst yMap = board.yItems.get(i);\n\t\t\t\t\t\t\tif (!yMap) continue;\n\t\t\t\t\t\t\tconst id = yMap.get(\"id\");\n\t\t\t\t\t\t\tif (typeof id === \"string\") allIds.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst pendingIds = new Set(draft.pendingIds ?? []);\n\t\t\t\t\t\tboard.lastServerConfirmedIds = new Set();\n\t\t\t\t\t\tboard.lastServerConfirmedItemSerializations = new Map();\n\t\t\t\t\t\tfor (const id of allIds) {\n\t\t\t\t\t\t\tif (!pendingIds.has(id)) {\n\t\t\t\t\t\t\t\tboard.lastServerConfirmedIds.add(id);\n\t\t\t\t\t\t\t\tconst item = allItems.find((candidate) => candidate.id === id);\n\t\t\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\t\t\tboard.lastServerConfirmedItemSerializations.set(\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(item),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!restoredFromBinary) {\n\t\t\t\t\treplaceYDocWithSnapshot(board, {\n\t\t\t\t\t\titems: draft.items,\n\t\t\t\t\t\torigin: ORIGIN_BOOTSTRAP,\n\t\t\t\t\t});\n\t\t\t\t\t// Legacy draft: no record of which ids were already confirmed by the\n\t\t\t\t\t// server. Mark all as pending so the next server snapshot can\n\t\t\t\t\t// reconcile correctly (additive merge will preserve them, and any\n\t\t\t\t\t// server-deleted ids will simply not be in lastServerConfirmedIds\n\t\t\t\t\t// to be re-added).\n\t\t\t\t\tboard.lastServerConfirmedIds = new Set();\n\t\t\t\t\tboard.lastServerConfirmedItemSerializations = new Map();\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst items = board ? readVectorItems(board.yItems) : draft.items;\n\t\t\tconst snapshot: RealtimeDocumentSnapshot = {\n\t\t\t\trevision: draft.baseRevision,\n\t\t\t\titems,\n\t\t\t\tupdatedAt: draft.updatedAt,\n\t\t\t\tupdatedByClientId: clientIdRef.current,\n\t\t\t};\n\t\t\tcurrentRevisionRef.current = snapshot.revision;\n\t\t\tlatestDocumentRef.current = snapshot;\n\t\t\tsetDocument(snapshot);\n\t\t\tif (!options?.suppressSubscriberNotify) {\n\t\t\t\tnotifySubscribers(items);\n\t\t\t}\n\t\t},\n\t\t[notifySubscribers],\n\t);\n\n\t// With Yjs as the source of truth, conflicts no longer exist as a concept.\n\t// Every server snapshot is merged into the Y.Doc; locally-added items that\n\t// the server has not yet seen are preserved, and items the server deleted\n\t// (i.e. id was in the previous server snapshot but is absent now) are\n\t// removed. The legacy \"keep-local vs use-server\" choice is gone.\n\t//\n\t// Returns true when the local Y.Doc still has pending items the server\n\t// hasn't seen after the merge (so the caller knows to re-schedule a flush).\n\tconst resolveAuthoritativeDocument = useCallback(\n\t\t(\n\t\t\tserverDocument: RealtimeDocumentSnapshot,\n\t\t\toptions?: { suppressSubscriberNotify?: boolean },\n\t\t): boolean => {\n\t\t\tconst board = boardRef.current;\n\t\t\tconst hadLocalContent =\n\t\t\t\tlocalDraftRef.current != null || (board != null && board.yItems.length > 0);\n\n\t\t\tapplyDocument(serverDocument, {\n\t\t\t\t...options,\n\t\t\t\treplace: !hadLocalContent,\n\t\t\t});\n\n\t\t\tif (!board) {\n\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\tclearLocalDraftRef.current();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst pendingIds = getLocallyPendingItemIds(board);\n\t\t\tif (pendingIds.size === 0) {\n\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\tqueuedDirtyRef.current = false;\n\t\t\t\tif (hasDurableDocumentPersistence(serverDocument)) {\n\t\t\t\t\tclearLocalDraftRef.current();\n\t\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\t\t\tsetLocalDraft({\n\t\t\t\t\troomId,\n\t\t\t\t\tbaseRevision: serverDocument.revision,\n\t\t\t\t\titems: mergedItems,\n\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\tpendingIds: [],\n\t\t\t\t});\n\t\t\t\tsetHasPendingDocumentSync(true);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\t\tsetLocalDraft({\n\t\t\t\troomId,\n\t\t\t\tbaseRevision: serverDocument.revision,\n\t\t\t\titems: mergedItems,\n\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\tpendingIds: Array.from(pendingIds),\n\t\t\t});\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tqueuedDirtyRef.current = true;\n\t\t\tsetHasPendingDocumentSync(true);\n\t\t\tscheduleDocumentFlush();\n\t\t\treturn true;\n\t\t},\n\t\t[applyDocument, roomId, scheduleDocumentFlush, setLocalDraft],\n\t);\n\n\tconst sendPresenceUpdate = useCallback(() => {\n\t\tsendRaw({\n\t\t\ttype: \"presence:update\",\n\t\t\troomId,\n\t\t\tclientId: clientIdRef.current,\n\t\t\tpresence: {\n\t\t\t\tcursor: lastCursorRef.current,\n\t\t\t\tmarkupStroke: lastMarkupStrokeRef.current ?? null,\n\t\t\t\tcamera: lastCameraRef.current ?? null,\n\t\t\t\t...(lastActiveToolRef.current\n\t\t\t\t\t? { activeTool: lastActiveToolRef.current }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t});\n\t}, [roomId, sendRaw]);\n\n\tconst scheduleReconnect = useCallback(() => {\n\t\tif (!reconnect || manualDisconnectRef.current) return;\n\t\tclearReconnectTimer();\n\t\tretryCountRef.current += 1;\n\t\tconst delay = Math.min(\n\t\t\tmaxReconnectDelayMs,\n\t\t\tinitialReconnectDelayMs * 2 ** Math.max(0, retryCountRef.current - 1),\n\t\t);\n\t\tupdateConnection((prev) => ({\n\t\t\t...prev,\n\t\t\tstate: \"reconnecting\",\n\t\t\tconnected: false,\n\t\t\tretryCount: retryCountRef.current,\n\t\t}));\n\t\treconnectTimerRef.current = globalThis.setTimeout(() => {\n\t\t\tsetConnectSequence((value) => value + 1);\n\t\t}, delay);\n\t}, [\n\t\tclearReconnectTimer,\n\t\tinitialReconnectDelayMs,\n\t\tmaxReconnectDelayMs,\n\t\treconnect,\n\t\tupdateConnection,\n\t]);\n\n\t// Kept for API back-compat with consumers that still call resolveConflict.\n\t// Yjs handles merge automatically inside resolveAuthoritativeDocument, so\n\t// `conflict` is always null and this becomes a no-op. We accept the action\n\t// argument silently so callers don't break.\n\tconst resolveConflict = useCallback((_action: \"keep-local\" | \"use-server\") => {\n\t\tvoid _action;\n\t}, []);\n\n\tconst setConflictStateRef = useRef(setConflictState);\n\tsetConflictStateRef.current = setConflictState;\n\tconst updateConnectionRef = useRef(updateConnection);\n\tupdateConnectionRef.current = updateConnection;\n\tconst applyDocumentRef = useRef(applyDocument);\n\tapplyDocumentRef.current = applyDocument;\n\tconst clearLocalDraftRef = useRef(clearLocalDraft);\n\tclearLocalDraftRef.current = clearLocalDraft;\n\tconst collapsePeersToSelfRef = useRef(collapsePeersToSelf);\n\tcollapsePeersToSelfRef.current = collapsePeersToSelf;\n\tconst applyPeersRef = useRef(applyPeers);\n\tapplyPeersRef.current = applyPeers;\n\tconst resolveAuthoritativeDocumentRef = useRef(resolveAuthoritativeDocument);\n\tresolveAuthoritativeDocumentRef.current = resolveAuthoritativeDocument;\n\tconst scheduleDocumentFlushRef = useRef(scheduleDocumentFlush);\n\tscheduleDocumentFlushRef.current = scheduleDocumentFlush;\n\tconst scheduleReconnectRef = useRef(scheduleReconnect);\n\tscheduleReconnectRef.current = scheduleReconnect;\n\tconst sendRawRef = useRef(sendRaw);\n\tsendRawRef.current = sendRaw;\n\tconst setLocalDraftRef = useRef(setLocalDraft);\n\tsetLocalDraftRef.current = setLocalDraft;\n\tconst scheduleDraftPersistenceRef = useRef(scheduleDraftPersistence);\n\tscheduleDraftPersistenceRef.current = scheduleDraftPersistence;\n\tconst persistLocalDraftRef = useRef(persistLocalDraft);\n\tpersistLocalDraftRef.current = persistLocalDraft;\n\n\tuseEffect(() => {\n\t\tconst runtimeWindow = globalThis.window;\n\t\tconst runtimeDocument = runtimeWindow?.document;\n\t\tif (!runtimeWindow || !runtimeDocument) return;\n\t\tconst persistDraft = () => {\n\t\t\tpersistLocalDraftRef.current();\n\t\t};\n\t\tconst handleVisibilityChange = () => {\n\t\t\tif (runtimeDocument.visibilityState === \"hidden\") persistDraft();\n\t\t};\n\t\truntimeWindow.addEventListener(\"pagehide\", persistDraft);\n\t\truntimeDocument.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\t\treturn () => {\n\t\t\truntimeWindow.removeEventListener(\"pagehide\", persistDraft);\n\t\t\truntimeDocument.removeEventListener(\n\t\t\t\t\"visibilitychange\",\n\t\t\t\thandleVisibilityChange,\n\t\t\t);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tif (boardRef.current) {\n\t\t\tboardRef.current.doc.destroy();\n\t\t}\n\t\tboardRef.current = createYjsBoardDoc();\n\t\tif (!roomId) {\n\t\t\tclearDocumentFlushSchedule();\n\t\t\tclearDraftPersistSchedule();\n\t\t\tlocalDraftRef.current = null;\n\t\t\tsetHasLocalOfflineDraft(false);\n\t\t\tsetHasPendingDocumentSync(false);\n\t\t\tsetConflictState(null);\n\t\t\tqueuedDirtyRef.current = false;\n\t\t\tpendingLocalItemsRef.current = null;\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tlatestDocumentRef.current = null;\n\t\t\tsetDocument(null);\n\t\t\tcurrentRevisionRef.current = 0;\n\t\t\treturn;\n\t\t}\n\t\tsetConflictState(null);\n\t\tpendingLocalItemsRef.current = null;\n\t\toutboundInFlightRef.current = null;\n\t\tvoid readRealtimeOfflineDraft(roomId, draftStorageRef.current).then(\n\t\t\t(localDraft) => {\n\t\t\t\tif (cancelled) return;\n\t\t\t\tsetLocalDraft(localDraft);\n\t\t\t\tsetHasPendingDocumentSync(localDraft != null);\n\t\t\t\tqueuedDirtyRef.current = localDraft != null;\n\t\t\t\tif (localDraft) {\n\t\t\t\t\tapplyDraftSnapshot(localDraft, {\n\t\t\t\t\t\tsuppressSubscriberNotify: sameSerializedItems(\n\t\t\t\t\t\t\tlatestDocumentRef.current?.items,\n\t\t\t\t\t\t\tlocalDraft.items,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatestDocumentRef.current = null;\n\t\t\t\tsetDocument(null);\n\t\t\t\tcurrentRevisionRef.current = 0;\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [\n\t\tapplyDraftSnapshot,\n\t\tclearDocumentFlushSchedule,\n\t\tclearDraftPersistSchedule,\n\t\troomId,\n\t\tsetConflictState,\n\t\tsetLocalDraft,\n\t]);\n\n\tuseEffect(() => {\n\t\tvoid connectSequence;\n\t\tif (!enabled) {\n\t\t\tmanualDisconnectRef.current = true;\n\t\t\tclearReconnectTimer();\n\t\t\tclearHeartbeatTimer();\n\t\t\tclearConnectTimeout();\n\t\t\tclearDocumentFlushSchedule();\n\t\t\twsRef.current?.close();\n\t\t\twsRef.current = null;\n\t\t\tqueuedDirtyRef.current = localDraftRef.current != null;\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tsetHasPendingDocumentSync(localDraftRef.current != null);\n\t\t\tcollapsePeersToSelfRef.current(\"offline\");\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"offline\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tclientId: null,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tmanualDisconnectRef.current = false;\n\t\tconst socketUrl = normalizeSocketUrl(url);\n\t\tif (!socketUrl) {\n\t\t\tcollapsePeersToSelfRef.current(\"offline\");\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"offline\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tlastError: null,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\t\tif (!isValidSocketUrl(socketUrl)) {\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"error\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tlastError: \"URL de websocket invalida.\",\n\t\t\t}));\n\t\t\tonErrorRef.current?.(\"URL de websocket invalida.\");\n\t\t\treturn;\n\t\t}\n\t\tconst WebSocketConstructor = globalThis.WebSocket;\n\t\tif (!WebSocketConstructor) {\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"error\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tlastError: \"WebSocket nao esta disponivel neste runtime.\",\n\t\t\t}));\n\t\t\tonErrorRef.current?.(\"WebSocket nao esta disponivel neste runtime.\");\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t...prev,\n\t\t\tstate: retryCountRef.current > 0 ? \"reconnecting\" : \"connecting\",\n\t\t\tconnected: false,\n\t\t\troomId,\n\t\t\tlastError: null,\n\t\t}));\n\n\t\tconst socket = new WebSocketConstructor(socketUrl);\n\t\twsRef.current = socket;\n\t\tclearConnectTimeout();\n\t\tconnectTimeoutRef.current = globalThis.setTimeout(() => {\n\t\t\tif (socket.readyState === WebSocketConstructor.CONNECTING) {\n\t\t\t\tsocket.close();\n\t\t\t}\n\t\t}, connectTimeoutMs);\n\n\t\tconst removeSocketListeners = [\n\t\t\taddRealtimeSocketListener(socket, \"open\", () => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tclearConnectTimeout();\n\t\t\t\tsendRawRef.current({\n\t\t\t\t\ttype: \"session:join\",\n\t\t\t\t\troomId,\n\t\t\t\t\tpeer: {\n\t\t\t\t\t\tclientId: clientIdRef.current,\n\t\t\t\t\t\tpeerId: peer.id,\n\t\t\t\t\t\t...(peer.displayName ? { displayName: peer.displayName } : {}),\n\t\t\t\t\t\t...(peer.color ? { color: peer.color } : {}),\n\t\t\t\t\t\t...(peer.image ? { image: peer.image } : {}),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tclearHeartbeatTimer();\n\t\t\t\theartbeatTimerRef.current = globalThis.setInterval(() => {\n\t\t\t\t\tsendRawRef.current({\n\t\t\t\t\t\ttype: \"session:ping\",\n\t\t\t\t\t\troomId,\n\t\t\t\t\t\tclientId: clientIdRef.current,\n\t\t\t\t\t\tsentAt: nowMs(),\n\t\t\t\t\t});\n\t\t\t\t}, heartbeatMs);\n\t\t\t}),\n\n\t\t\taddRealtimeSocketListener(socket, \"message\", (event) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tif (!(\"data\" in event)) return;\n\t\t\t\tlet payload: unknown = event.data;\n\t\t\t\tif (typeof payload === \"string\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpayload = JSON.parse(payload);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst parsed = parseRealtimeServerMessage(payload);\n\t\t\t\tif (!parsed) return;\n\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tlastMessageAt: nowMs(),\n\t\t\t\t}));\n\n\t\t\t\tif (parsed.type === \"session:welcome\") {\n\t\t\t\t\tretryCountRef.current = 0;\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tstate: \"connected\",\n\t\t\t\t\t\tconnected: true,\n\t\t\t\t\t\tclientId: parsed.clientId,\n\t\t\t\t\t\tretryCount: 0,\n\t\t\t\t\t\tlastConnectedAt: nowMs(),\n\t\t\t\t\t\tlastError: null,\n\t\t\t\t\t}));\n\t\t\t\t\tapplyPeersRef.current(parsed.peers);\n\t\t\t\t\tconst handledByDraft = resolveAuthoritativeDocumentRef.current(\n\t\t\t\t\t\tsanitizeRealtimeSnapshot(parsed.document),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsuppressSubscriberNotify:\n\t\t\t\t\t\t\t\tlocalDraftRef.current != null &&\n\t\t\t\t\t\t\t\tsameSerializedItems(\n\t\t\t\t\t\t\t\t\tlatestDocumentRef.current?.items,\n\t\t\t\t\t\t\t\t\tlocalDraftRef.current.items,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (!handledByDraft) {\n\t\t\t\t\t\tqueuedDirtyRef.current = false;\n\t\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\t\t}\n\t\t\t\t\tscheduleDocumentFlushRef.current();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"presence:sync\") {\n\t\t\t\t\tapplyPeersRef.current(parsed.peers);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:peer-joined\") {\n\t\t\t\t\tsetSessionPeers((prev) => {\n\t\t\t\t\t\tconst next = prev.filter(\n\t\t\t\t\t\t\t(peerState) => peerState.clientId !== parsed.peer.clientId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnext.push(\n\t\t\t\t\t\t\tparsed.peer.clientId === clientIdRef.current\n\t\t\t\t\t\t\t\t? { ...parsed.peer, isSelf: true }\n\t\t\t\t\t\t\t\t: parsed.peer,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:peer-left\") {\n\t\t\t\t\tsetSessionPeers((prev) =>\n\t\t\t\t\t\tprev.filter((peerState) => peerState.clientId !== parsed.clientId),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:pong\") {\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlastPongAt: parsed.serverTime,\n\t\t\t\t\t}));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:error\") {\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tstate: prev.connected ? prev.state : \"error\",\n\t\t\t\t\t\tlastError: parsed.message,\n\t\t\t\t\t}));\n\t\t\t\t\tonErrorRef.current?.(parsed.message);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"document:sync\") {\n\t\t\t\t\tconst selfClientId = clientIdRef.current;\n\t\t\t\t\tconst inFlight = outboundInFlightRef.current;\n\t\t\t\t\tconst isSelfAck = parsed.document.updatedByClientId === selfClientId;\n\t\t\t\t\tif (!isSelfAck) {\n\t\t\t\t\t\t// Update from another peer. Clear in-flight (server moved on, our\n\t\t\t\t\t\t// pending send will be re-flushed against the new revision) and\n\t\t\t\t\t\t// run the smart merge.\n\t\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\t\tresolveAuthoritativeDocumentRef.current(\n\t\t\t\t\t\t\tsanitizeRealtimeSnapshot(parsed.document),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Our own update was acked. Apply the canonical server view (with\n\t\t\t\t\t// any normalisation the server might have done) into the Y.Doc as\n\t\t\t\t\t// a smart merge — if we already drew more strokes during the round\n\t\t\t\t\t// trip, they survive as locally-pending.\n\t\t\t\t\tconst shouldSuppress =\n\t\t\t\t\t\tinFlight != null &&\n\t\t\t\t\t\tsameSerializedItems(inFlight.items, parsed.document.items);\n\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\tapplyDocumentRef.current(sanitizeRealtimeSnapshot(parsed.document), {\n\t\t\t\t\t\tsuppressSubscriberNotify: shouldSuppress,\n\t\t\t\t\t});\n\t\t\t\t\tconst board = boardRef.current;\n\t\t\t\t\tconst stillPending = board\n\t\t\t\t\t\t? getLocallyPendingItemIds(board).size > 0\n\t\t\t\t\t\t: false;\n\t\t\t\t\tif (stillPending) {\n\t\t\t\t\t\tconst mergedItems = board ? readVectorItems(board.yItems) : [];\n\t\t\t\t\t\tsetLocalDraftRef.current({\n\t\t\t\t\t\t\troomId,\n\t\t\t\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\t\t\t\titems: mergedItems,\n\t\t\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\t\t\tpendingIds: board\n\t\t\t\t\t\t\t\t? Array.from(getLocallyPendingItemIds(board))\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tqueuedDirtyRef.current = true;\n\t\t\t\t\t\tsetHasPendingDocumentSync(true);\n\t\t\t\t\t\tscheduleDocumentFlushRef.current();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueuedDirtyRef.current = false;\n\t\t\t\t\t\tif (hasDurableDocumentPersistence(parsed.document)) {\n\t\t\t\t\t\t\tclearLocalDraftRef.current();\n\t\t\t\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst mergedItems = board ? readVectorItems(board.yItems) : [];\n\t\t\t\t\t\t\tsetLocalDraftRef.current({\n\t\t\t\t\t\t\t\troomId,\n\t\t\t\t\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\t\t\t\t\titems: mergedItems,\n\t\t\t\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\t\t\t\tpendingIds: [],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetHasPendingDocumentSync(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetConflictStateRef.current(null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"document:resync-required\") {\n\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\tqueuedDirtyRef.current = localDraftRef.current != null;\n\t\t\t\t\tsetHasPendingDocumentSync(queuedDirtyRef.current);\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlastError: parsed.reason,\n\t\t\t\t\t}));\n\t\t\t\t\tresolveAuthoritativeDocumentRef.current(\n\t\t\t\t\t\tsanitizeRealtimeSnapshot(parsed.document),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\n\t\t\taddRealtimeSocketListener(socket, \"error\", () => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tstate: prev.connected ? prev.state : \"error\",\n\t\t\t\t\tlastError: \"Falha de conexão websocket.\",\n\t\t\t\t}));\n\t\t\t}),\n\n\t\t\taddRealtimeSocketListener(socket, \"close\", () => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tclearHeartbeatTimer();\n\t\t\t\tclearConnectTimeout();\n\t\t\t\twsRef.current = null;\n\t\t\t\tcollapsePeersToSelfRef.current(\n\t\t\t\t\tmanualDisconnectRef.current || !enabled ? \"offline\" : \"reconnecting\",\n\t\t\t\t);\n\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tconnected: false,\n\t\t\t\t\tclientId: prev.clientId,\n\t\t\t\t\tstate: manualDisconnectRef.current || !enabled ? \"offline\" : prev.state,\n\t\t\t\t}));\n\t\t\t\tif (!manualDisconnectRef.current && enabled) {\n\t\t\t\t\tscheduleReconnectRef.current();\n\t\t\t\t}\n\t\t\t}),\n\t\t];\n\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tfor (const removeSocketListener of removeSocketListeners) {\n\t\t\t\tremoveSocketListener();\n\t\t\t}\n\t\t\tclearReconnectTimer();\n\t\t\tclearHeartbeatTimer();\n\t\t\tclearConnectTimeout();\n\t\t\tclearDocumentFlushSchedule();\n\t\t\tsocket.close();\n\t\t};\n\t}, [\n\t\tclearConnectTimeout,\n\t\tclearDocumentFlushSchedule,\n\t\tclearHeartbeatTimer,\n\t\tclearReconnectTimer,\n\t\tconnectSequence,\n\t\tconnectTimeoutMs,\n\t\tenabled,\n\t\theartbeatMs,\n\t\tpeer.color,\n\t\tpeer.displayName,\n\t\tpeer.id,\n\t\tpeer.image,\n\t\troomId,\n\t\turl,\n\t]);\n\n\tuseEffect(() => {\n\t\tsetSessionPeers((prev) =>\n\t\t\tprev.map((peerState) =>\n\t\t\t\tpeerState.clientId === clientIdRef.current\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...peerState,\n\t\t\t\t\t\t\tisSelf: true,\n\t\t\t\t\t\t\tconnectionState: connection.state,\n\t\t\t\t\t\t}\n\t\t\t\t\t: peerState,\n\t\t\t),\n\t\t);\n\t}, [connection.state]);\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tclearDocumentFlushSchedule();\n\t\t\tclearDraftPersistSchedule();\n\t\t\tif (boardRef.current) {\n\t\t\t\tboardRef.current.doc.destroy();\n\t\t\t\tboardRef.current = null;\n\t\t\t}\n\t\t},\n\t\t[clearDocumentFlushSchedule, clearDraftPersistSchedule],\n\t);\n\n\tconst flushDocumentSync = useCallback(async () => {\n\t\t// Manual flush (saveCurrentCanvas in trazo): drain pendingLocalItemsRef\n\t\t// into the Y.Doc and update the draft synchronously before persisting,\n\t\t// so the localStorage snapshot reflects the latest local changes even\n\t\t// when called while a previous send is still in-flight.\n\t\tconst board = boardRef.current;\n\t\tconst pendingLocal = pendingLocalItemsRef.current;\n\t\tif (board && pendingLocal) {\n\t\t\tpendingLocalItemsRef.current = null;\n\t\t\tapplyLocalItemsToYDoc(board, {\n\t\t\t\titems: pendingLocal,\n\t\t\t\torigin: ORIGIN_LOCAL,\n\t\t\t});\n\t\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\t\tconst pendingIds = getLocallyPendingItemIds(board);\n\t\t\tif (pendingIds.size > 0) {\n\t\t\t\tsetLocalDraftRef.current({\n\t\t\t\t\troomId,\n\t\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\t\titems: mergedItems,\n\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\tpendingIds: Array.from(pendingIds),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tpersistLocalDraft();\n\t\tif (!connection.connected) return;\n\t\tflushQueuedDocument();\n\t}, [connection.connected, flushQueuedDocument, persistLocalDraft, roomId]);\n\n\tconst remoteAdapter = useMemo<VectorCanvasRemoteAdapter>(\n\t\t() => ({\n\t\t\tsubscribe(onItems) {\n\t\t\t\tsubscriberRefs.current.add(onItems);\n\t\t\t\tif (latestDocumentRef.current) {\n\t\t\t\t\tonItems(latestDocumentRef.current.items);\n\t\t\t\t}\n\t\t\t\treturn () => {\n\t\t\t\t\tsubscriberRefs.current.delete(onItems);\n\t\t\t\t};\n\t\t\t},\n\t\t\tsend(items) {\n\t\t\t\tqueueDocumentSend(items);\n\t\t\t},\n\t\t\tflush() {\n\t\t\t\treturn flushDocumentSync();\n\t\t\t},\n\t\t}),\n\t\t[flushDocumentSync, queueDocumentSend],\n\t);\n\n\tconst disconnect = useCallback(() => {\n\t\tmanualDisconnectRef.current = true;\n\t\tclearReconnectTimer();\n\t\tclearHeartbeatTimer();\n\t\tclearConnectTimeout();\n\t\tsendRaw({\n\t\t\ttype: \"session:leave\",\n\t\t\troomId,\n\t\t\tclientId: clientIdRef.current,\n\t\t});\n\t\twsRef.current?.close();\n\t\twsRef.current = null;\n\t\tcollapsePeersToSelf(\"offline\");\n\t\tupdateConnection((prev) => ({\n\t\t\t...prev,\n\t\t\tstate: \"offline\",\n\t\t\tconnected: false,\n\t\t}));\n\t}, [\n\t\tclearConnectTimeout,\n\t\tclearHeartbeatTimer,\n\t\tclearReconnectTimer,\n\t\tcollapsePeersToSelf,\n\t\troomId,\n\t\tsendRaw,\n\t\tupdateConnection,\n\t]);\n\n\tconst reconnectNow = useCallback(() => {\n\t\tdisconnect();\n\t\tmanualDisconnectRef.current = false;\n\t\tretryCountRef.current = 0;\n\t\tsetConnectSequence((value) => value + 1);\n\t}, [disconnect]);\n\n\tconst remotePresence = useMemo(\n\t\t() => sessionPeers.filter((peerState) => !peerState.isSelf),\n\t\t[sessionPeers],\n\t);\n\n\tconst syncViewportPresence = useCallback(\n\t\t(bindingOptions?: BindViewportPresenceOptions) => {\n\t\t\tconst viewport = bindingOptions?.viewportRef?.current;\n\t\t\tconst cameraSnapshot = getViewportCameraSnapshot(viewport);\n\t\t\tif (!cameraSnapshot) return false;\n\t\t\tlastCameraRef.current = cameraSnapshot;\n\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\tsendPresenceUpdate();\n\t\t\treturn true;\n\t\t},\n\t\t[sendPresenceUpdate],\n\t);\n\n\tconst bindViewportPresence = useCallback(\n\t\t(\n\t\t\tbindingOptions?: BindViewportPresenceOptions,\n\t\t): RealtimeViewportPresenceBindings => ({\n\t\t\tremotePresence,\n\t\t\tonWorldPointerMove(world) {\n\t\t\t\tlastCursorRef.current = world;\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t\tonWorldPointerLeave() {\n\t\t\t\tlastCursorRef.current = null;\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t\tonPlacementPreviewChange(preview: RealtimePlacementPreview | null) {\n\t\t\t\tlastMarkupStrokeRef.current =\n\t\t\t\t\tremoteMarkupStrokeFromPlacementPreview(preview);\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t\tonCameraChange() {\n\t\t\t\tconst viewport = bindingOptions?.viewportRef?.current;\n\t\t\t\tconst cameraSnapshot = getViewportCameraSnapshot(viewport);\n\t\t\t\tif (!cameraSnapshot) return;\n\t\t\t\tif (viewport && consumeViewportFollowSync(viewport, cameraSnapshot)) {\n\t\t\t\t\tlastCameraRef.current = cameraSnapshot;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlastCameraRef.current = cameraSnapshot;\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t}),\n\t\t[remotePresence, sendPresenceUpdate],\n\t);\n\n\treturn {\n\t\tconnection,\n\t\tsessionPeers,\n\t\tremotePresence,\n\t\tremoteAdapter,\n\t\tdocument,\n\t\thasLocalOfflineDraft,\n\t\thasPendingDocumentSync,\n\t\tsyncState,\n\t\tconflict,\n\t\tbindViewportPresence,\n\t\tsyncViewportPresence,\n\t\tresolveConflict,\n\t\tclearLocalDraft,\n\t\tflushDocumentSync,\n\t\tdisconnect,\n\t\treconnectNow,\n\t};\n}\n"]}
1
+ {"version":3,"sources":["../src/realtime/protocol.ts","../src/realtime/use-realtime-canvas-document.ts","../src/realtime/use-realtime-peer-follow.ts","../src/realtime/yjs-document.ts","../src/realtime/use-realtime-session.ts"],"names":["useState","useRef","useCallback","useEffect","useMemo","CLIENT_ONLY_IMAGE_KEYS","Y","id","previous","options","mergedItems"],"mappings":"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","file":"realtimeNative.cjs","sourcesContent":["import type {\n\tRealtimeConnectionState,\n\tRemotePresenceCamera,\n\tRemotePresenceMarkupStroke,\n\tRemotePresencePeer,\n} from \"../react/presence/types\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type RealtimeSessionPeer = RemotePresencePeer & {\n\treadonly clientId: string;\n\treadonly peerId: string;\n\treadonly roomId: string;\n\treadonly joinedAt: number;\n\treadonly lastSeenAt: number;\n\treadonly isSelf: boolean;\n\treadonly connectionState?: RealtimeConnectionState;\n};\n\nexport type RealtimeDocumentSnapshot = {\n\treadonly revision: number;\n\treadonly items: VectorSceneItem[];\n\treadonly updatedAt: number;\n\treadonly updatedByClientId?: string;\n\treadonly persistedRevision?: number;\n};\n\nexport type RealtimeConnectionInfo = {\n\treadonly state: RealtimeConnectionState;\n\treadonly connected: boolean;\n\treadonly roomId: string;\n\treadonly clientId: string | null;\n\treadonly retryCount: number;\n\treadonly lastConnectedAt: number | null;\n\treadonly lastMessageAt: number | null;\n\treadonly lastPongAt: number | null;\n\treadonly lastError: string | null;\n};\n\nexport type RealtimePresencePayload = {\n\treadonly cursor: { readonly x: number; readonly y: number } | null;\n\treadonly markupStroke?: RemotePresenceMarkupStroke | null;\n\treadonly camera?: RemotePresenceCamera | null;\n\treadonly activeTool?: string;\n};\n\nexport type RealtimeClientPeer = {\n\treadonly clientId: string;\n\treadonly peerId: string;\n\treadonly displayName?: string;\n\treadonly color?: string;\n\treadonly image?: string;\n};\n\nexport type RealtimeClientMessage =\n\t| {\n\t\t\treadonly type: \"session:join\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly peer: RealtimeClientPeer;\n\t }\n\t| {\n\t\t\treadonly type: \"session:leave\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t }\n\t| {\n\t\t\treadonly type: \"session:ping\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly sentAt: number;\n\t }\n\t| {\n\t\t\treadonly type: \"presence:update\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly presence: RealtimePresencePayload;\n\t }\n\t| {\n\t\t\treadonly type: \"document:update\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly baseRevision: number;\n\t\t\treadonly items: VectorSceneItem[];\n\t };\n\nexport type RealtimeServerMessage =\n\t| {\n\t\t\treadonly type: \"session:welcome\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly serverTime: number;\n\t\t\treadonly document: RealtimeDocumentSnapshot;\n\t\t\treadonly peers: RealtimeSessionPeer[];\n\t }\n\t| {\n\t\t\treadonly type: \"session:peer-joined\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly peer: RealtimeSessionPeer;\n\t }\n\t| {\n\t\t\treadonly type: \"session:peer-left\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t }\n\t| {\n\t\t\treadonly type: \"session:pong\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly clientId: string;\n\t\t\treadonly sentAt: number;\n\t\t\treadonly serverTime: number;\n\t }\n\t| {\n\t\t\treadonly type: \"session:error\";\n\t\t\treadonly roomId?: string;\n\t\t\treadonly code: string;\n\t\t\treadonly message: string;\n\t }\n\t| {\n\t\t\treadonly type: \"presence:sync\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly peers: RealtimeSessionPeer[];\n\t\t\treadonly serverTime: number;\n\t }\n\t| {\n\t\t\treadonly type: \"document:sync\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly document: RealtimeDocumentSnapshot;\n\t }\n\t| {\n\t\t\treadonly type: \"document:resync-required\";\n\t\t\treadonly roomId: string;\n\t\t\treadonly reason: string;\n\t\t\treadonly document: RealtimeDocumentSnapshot;\n\t };\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction getNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction parseCursor(value: unknown): { x: number; y: number } | null | undefined {\n\tif (value === null) return null;\n\tif (!isRecord(value)) return undefined;\n\tconst x = getNumber(value.x);\n\tconst y = getNumber(value.y);\n\tif (x == null || y == null) return undefined;\n\treturn { x, y };\n}\n\nfunction parseCamera(value: unknown): RemotePresenceCamera | null | undefined {\n\tif (value === null) return null;\n\tif (!isRecord(value)) return undefined;\n\tconst x = getNumber(value.x);\n\tconst y = getNumber(value.y);\n\tconst zoom = getNumber(value.zoom);\n\tconst viewportWidth = getNumber(value.viewportWidth);\n\tconst viewportHeight = getNumber(value.viewportHeight);\n\tif (\n\t\tx == null ||\n\t\ty == null ||\n\t\tzoom == null ||\n\t\tviewportWidth == null ||\n\t\tviewportHeight == null\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { x, y, zoom, viewportWidth, viewportHeight };\n}\n\nfunction parseMarkupStroke(\n\tvalue: unknown,\n): RemotePresenceMarkupStroke | null | undefined {\n\tif (value === null) return null;\n\tif (!isRecord(value) || !Array.isArray(value.points)) return undefined;\n\tconst tool = getString(value.tool);\n\tif (\n\t\ttool !== \"draw\" &&\n\t\ttool !== \"pencil\" &&\n\t\ttool !== \"brush\" &&\n\t\ttool !== \"marker\" &&\n\t\ttool !== \"laser\"\n\t) {\n\t\treturn undefined;\n\t}\n\tconst points = value.points\n\t\t.map((point) => {\n\t\t\tif (!isRecord(point)) return null;\n\t\t\tconst x = getNumber(point.x);\n\t\t\tconst y = getNumber(point.y);\n\t\t\tif (x == null || y == null) return null;\n\t\t\treturn { x, y };\n\t\t})\n\t\t.filter((point): point is { x: number; y: number } => point != null);\n\tconst strokeWidth = getNumber(value.strokeWidth);\n\tconst stroke = getString(value.stroke);\n\tconst strokeOpacity = getNumber(value.strokeOpacity);\n\treturn {\n\t\tpoints,\n\t\ttool,\n\t\t...(strokeWidth != null ? { strokeWidth } : {}),\n\t\t...(stroke ? { stroke } : {}),\n\t\t...(strokeOpacity != null ? { strokeOpacity } : {}),\n\t};\n}\n\nfunction parsePresencePayload(value: unknown): RealtimePresencePayload | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst cursor = parseCursor(value.cursor);\n\tif (cursor === undefined) return undefined;\n\tconst markupStroke = parseMarkupStroke(value.markupStroke);\n\tif (markupStroke === undefined && value.markupStroke !== undefined)\n\t\treturn undefined;\n\tconst camera = parseCamera(value.camera);\n\tif (camera === undefined && value.camera !== undefined) return undefined;\n\treturn {\n\t\tcursor,\n\t\t...(markupStroke !== undefined ? { markupStroke } : {}),\n\t\t...(camera !== undefined ? { camera } : {}),\n\t\t...(getString(value.activeTool)\n\t\t\t? { activeTool: getString(value.activeTool) }\n\t\t\t: {}),\n\t};\n}\n\nfunction parseItems(value: unknown): VectorSceneItem[] | undefined {\n\treturn Array.isArray(value) ? (value as VectorSceneItem[]) : undefined;\n}\n\nfunction parseDocumentSnapshot(\n\tvalue: unknown,\n): RealtimeDocumentSnapshot | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst revision = getNumber(value.revision);\n\tconst updatedAt = getNumber(value.updatedAt);\n\tconst items = parseItems(value.items);\n\tif (revision == null || updatedAt == null || items == null) return undefined;\n\treturn {\n\t\trevision,\n\t\tupdatedAt,\n\t\titems,\n\t\t...(getString(value.updatedByClientId)\n\t\t\t? { updatedByClientId: getString(value.updatedByClientId) }\n\t\t\t: {}),\n\t\t...(getNumber(value.persistedRevision) != null\n\t\t\t? { persistedRevision: getNumber(value.persistedRevision) }\n\t\t\t: {}),\n\t};\n}\n\nexport function parseRealtimeSessionPeer(\n\tvalue: unknown,\n): RealtimeSessionPeer | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst clientId = getString(value.clientId);\n\tconst peerId = getString(value.peerId);\n\tconst roomId = getString(value.roomId);\n\tconst joinedAt = getNumber(value.joinedAt);\n\tconst lastSeenAt = getNumber(value.lastSeenAt);\n\tconst cursor = parseCursor(value.cursor);\n\tif (\n\t\tclientId == null ||\n\t\tpeerId == null ||\n\t\troomId == null ||\n\t\tjoinedAt == null ||\n\t\tlastSeenAt == null ||\n\t\tcursor === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\tconst markupStroke = parseMarkupStroke(value.markupStroke);\n\tif (markupStroke === undefined && value.markupStroke !== undefined)\n\t\treturn undefined;\n\tconst camera = parseCamera(value.camera);\n\tif (camera === undefined && value.camera !== undefined) return undefined;\n\tconst isSelf = value.isSelf === true;\n\tconst connectionState = getString(value.connectionState) as\n\t\t| RealtimeConnectionState\n\t\t| undefined;\n\treturn {\n\t\tid: clientId,\n\t\tclientId,\n\t\tpeerId,\n\t\troomId,\n\t\tjoinedAt,\n\t\tlastSeenAt,\n\t\tisSelf,\n\t\tcursor,\n\t\t...(getString(value.displayName)\n\t\t\t? { displayName: getString(value.displayName) }\n\t\t\t: {}),\n\t\t...(getString(value.color) ? { color: getString(value.color) } : {}),\n\t\t...(getString(value.image) ? { image: getString(value.image) } : {}),\n\t\t...(markupStroke !== undefined ? { markupStroke } : {}),\n\t\t...(camera !== undefined ? { camera } : {}),\n\t\t...(getString(value.activeTool)\n\t\t\t? { activeTool: getString(value.activeTool) }\n\t\t\t: {}),\n\t\t...(connectionState ? { connectionState } : {}),\n\t};\n}\n\nfunction parsePeers(value: unknown): RealtimeSessionPeer[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst peers = value\n\t\t.map((peer) => parseRealtimeSessionPeer(peer))\n\t\t.filter((peer): peer is RealtimeSessionPeer => peer != null);\n\treturn peers.length === value.length ? peers : undefined;\n}\n\nexport function parseRealtimeClientMessage(\n\tvalue: unknown,\n): RealtimeClientMessage | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst type = getString(value.type);\n\tif (type === \"session:join\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst peer = isRecord(value.peer) ? value.peer : undefined;\n\t\tconst clientId = peer ? getString(peer.clientId) : undefined;\n\t\tconst peerId = peer ? getString(peer.peerId) : undefined;\n\t\tif (!roomId || !peer || !clientId || !peerId) return undefined;\n\t\treturn {\n\t\t\ttype,\n\t\t\troomId,\n\t\t\tpeer: {\n\t\t\t\tclientId,\n\t\t\t\tpeerId,\n\t\t\t\t...(getString(peer.displayName)\n\t\t\t\t\t? { displayName: getString(peer.displayName) }\n\t\t\t\t\t: {}),\n\t\t\t\t...(getString(peer.color) ? { color: getString(peer.color) } : {}),\n\t\t\t\t...(getString(peer.image) ? { image: getString(peer.image) } : {}),\n\t\t\t},\n\t\t};\n\t}\n\tif (type === \"session:leave\" || type === \"session:ping\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tif (!roomId || !clientId) return undefined;\n\t\tif (type === \"session:leave\") {\n\t\t\treturn { type, roomId, clientId };\n\t\t}\n\t\tconst sentAt = getNumber(value.sentAt);\n\t\tif (sentAt == null) return undefined;\n\t\treturn { type, roomId, clientId, sentAt };\n\t}\n\tif (type === \"presence:update\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst presence = parsePresencePayload(value.presence);\n\t\tif (!roomId || !clientId || !presence) return undefined;\n\t\treturn { type, roomId, clientId, presence };\n\t}\n\tif (type === \"document:update\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst baseRevision = getNumber(value.baseRevision);\n\t\tconst items = parseItems(value.items);\n\t\tif (!roomId || !clientId || baseRevision == null || !items) return undefined;\n\t\treturn { type, roomId, clientId, baseRevision, items };\n\t}\n\treturn undefined;\n}\n\nexport function parseRealtimeServerMessage(\n\tvalue: unknown,\n): RealtimeServerMessage | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst type = getString(value.type);\n\tif (type === \"session:welcome\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst serverTime = getNumber(value.serverTime);\n\t\tconst document = parseDocumentSnapshot(value.document);\n\t\tconst peers = parsePeers(value.peers);\n\t\tif (!roomId || !clientId || serverTime == null || !document || !peers) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { type, roomId, clientId, serverTime, document, peers };\n\t}\n\tif (type === \"session:peer-joined\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst peer = parseRealtimeSessionPeer(value.peer);\n\t\tif (!roomId || !peer) return undefined;\n\t\treturn { type, roomId, peer };\n\t}\n\tif (type === \"session:peer-left\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tif (!roomId || !clientId) return undefined;\n\t\treturn { type, roomId, clientId };\n\t}\n\tif (type === \"session:pong\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst clientId = getString(value.clientId);\n\t\tconst sentAt = getNumber(value.sentAt);\n\t\tconst serverTime = getNumber(value.serverTime);\n\t\tif (!roomId || !clientId || sentAt == null || serverTime == null) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { type, roomId, clientId, sentAt, serverTime };\n\t}\n\tif (type === \"session:error\") {\n\t\tconst code = getString(value.code);\n\t\tconst message = getString(value.message);\n\t\tif (!code || !message) return undefined;\n\t\treturn {\n\t\t\ttype,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\t...(getString(value.roomId) ? { roomId: getString(value.roomId) } : {}),\n\t\t};\n\t}\n\tif (type === \"presence:sync\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst peers = parsePeers(value.peers);\n\t\tconst serverTime = getNumber(value.serverTime);\n\t\tif (!roomId || !peers || serverTime == null) return undefined;\n\t\treturn { type, roomId, peers, serverTime };\n\t}\n\tif (type === \"document:sync\" || type === \"document:resync-required\") {\n\t\tconst roomId = getString(value.roomId);\n\t\tconst document = parseDocumentSnapshot(value.document);\n\t\tif (!roomId || !document) return undefined;\n\t\tif (type === \"document:sync\") {\n\t\t\treturn { type, roomId, document };\n\t\t}\n\t\tconst reason = getString(value.reason);\n\t\tif (!reason) return undefined;\n\t\treturn { type, roomId, reason, document };\n\t}\n\treturn undefined;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport type {\n\tRealtimeDocumentConflict,\n\tRealtimeSyncState,\n\tUseRealtimeSessionResult,\n} from \"./use-realtime-session\";\n\ntype UseRealtimeCanvasDocumentOptions = {\n\tsession: Pick<\n\t\tUseRealtimeSessionResult,\n\t\t| \"connection\"\n\t\t| \"document\"\n\t\t| \"remoteAdapter\"\n\t\t| \"hasLocalOfflineDraft\"\n\t\t| \"hasPendingDocumentSync\"\n\t\t| \"syncState\"\n\t\t| \"conflict\"\n\t\t| \"resolveConflict\"\n\t\t| \"clearLocalDraft\"\n\t\t| \"flushDocumentSync\"\n\t> | null;\n\titems: readonly VectorSceneItem[];\n\tonItemsChange?: (nextItems: VectorSceneItem[]) => void;\n\tnormalizeItems?: (nextItems: readonly VectorSceneItem[]) => VectorSceneItem[];\n\thydrateItems?: (\n\t\tnextItems: readonly VectorSceneItem[],\n\t) => Promise<VectorSceneItem[]>;\n\tenabled?: boolean;\n};\n\ntype PreserveLocalRealtimeItemsInput = {\n\treadonly localItems: readonly VectorSceneItem[];\n\treadonly incomingItems: readonly VectorSceneItem[];\n\treadonly hasPendingLocalChanges: boolean;\n};\n\nexport type UseRealtimeCanvasDocumentResult = {\n\titems: readonly VectorSceneItem[];\n\tonItemsChange?: (nextItems: VectorSceneItem[]) => void;\n\tloading: boolean;\n\tsaving: boolean;\n\thasLocalOfflineDraft: boolean;\n\tsyncState: RealtimeSyncState;\n\tconflict: RealtimeDocumentConflict | null;\n\tresolveConflict: (action: \"keep-local\" | \"use-server\") => void;\n\tclearLocalDraft: () => void;\n\tflush: () => Promise<void>;\n};\n\nconst CLIENT_ONLY_IMAGE_KEYS = new Set([\n\t\"imageBlobId\",\n\t\"imageThumbnailBlobId\",\n\t\"imageRasterHref\",\n\t\"imageThumbnailHref\",\n]);\n\nfunction getSceneItemId(item: VectorSceneItem): string | null {\n\tconst id = (item as { id?: unknown }).id;\n\treturn typeof id === \"string\" ? id : null;\n}\n\nfunction hasMissingLocalItems(\n\tlocalItems: readonly VectorSceneItem[],\n\tincomingItems: readonly VectorSceneItem[],\n): boolean {\n\tconst incomingIds = new Set<string>();\n\tfor (const item of incomingItems) {\n\t\tconst id = getSceneItemId(item);\n\t\tif (id) incomingIds.add(id);\n\t}\n\tfor (const item of localItems) {\n\t\tconst id = getSceneItemId(item);\n\t\tif (id && !incomingIds.has(id)) return true;\n\t}\n\treturn false;\n}\n\nfunction getComparableRealtimeItem(item: VectorSceneItem): Record<string, unknown> {\n\tconst comparable = { ...item } as Record<string, unknown>;\n\tif (item.toolKind === \"image\") {\n\t\tfor (const key of CLIENT_ONLY_IMAGE_KEYS) {\n\t\t\tdelete comparable[key];\n\t\t}\n\t\tcomparable.childrenSvg = \"\";\n\t}\n\treturn comparable;\n}\n\nfunction serializeComparableRealtimeItem(item: VectorSceneItem): string {\n\treturn JSON.stringify(getComparableRealtimeItem(item));\n}\n\nfunction hasChangedLocalItems(\n\tlocalItems: readonly VectorSceneItem[],\n\tincomingItems: readonly VectorSceneItem[],\n): boolean {\n\tconst incomingItemsById = new Map<string, VectorSceneItem>();\n\tfor (const incomingItem of incomingItems) {\n\t\tconst id = getSceneItemId(incomingItem);\n\t\tif (id) incomingItemsById.set(id, incomingItem);\n\t}\n\tfor (const localItem of localItems) {\n\t\tconst id = getSceneItemId(localItem);\n\t\tconst incomingItem = id ? incomingItemsById.get(id) : null;\n\t\tif (!incomingItem) continue;\n\t\tif (\n\t\t\tserializeComparableRealtimeItem(localItem) !==\n\t\t\tserializeComparableRealtimeItem(incomingItem)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function shouldPreserveLocalRealtimeItems({\n\tlocalItems,\n\tincomingItems,\n\thasPendingLocalChanges,\n}: PreserveLocalRealtimeItemsInput): boolean {\n\tif (!hasPendingLocalChanges) return false;\n\treturn (\n\t\thasMissingLocalItems(localItems, incomingItems) ||\n\t\thasChangedLocalItems(localItems, incomingItems)\n\t);\n}\n\nexport function useRealtimeCanvasDocument(\n\toptions: UseRealtimeCanvasDocumentOptions,\n): UseRealtimeCanvasDocumentResult {\n\tconst {\n\t\tsession,\n\t\titems,\n\t\tonItemsChange,\n\t\tnormalizeItems,\n\t\thydrateItems,\n\t\tenabled = true,\n\t} = options;\n\tconst [loading, setLoading] = useState(false);\n\tconst lastAppliedRevisionRef = useRef<number | null>(null);\n\tconst inFlightRevisionRef = useRef<number | null>(null);\n\tconst latestItemsRef = useRef(items);\n\tconst hasLocalChangeInFlightRef = useRef(false);\n\t// Once we've ever propagated a non-empty items set to the consumer, treat\n\t// a subsequent inbound empty document as suspicious and skip it. This\n\t// guards against rare races (tab killed before localStorage debounce\n\t// flushed, Y.Doc reset, stale snapshot) that would otherwise wipe the\n\t// consumer's view to []. Genuine empty boards on first load still work\n\t// because hasEverPropagatedItemsRef starts false.\n\tconst hasEverPropagatedItemsRef = useRef(false);\n\tconst realtimeEnabled = enabled && session != null;\n\tconst documentRevision = session?.document?.revision ?? null;\n\tconst documentItems = session?.document?.items;\n\tconst documentUpdatedByClientId = session?.document?.updatedByClientId ?? null;\n\tconst connectionClientId = session?.connection.clientId ?? null;\n\tconst hasLocalOfflineDraft = session?.hasLocalOfflineDraft ?? false;\n\tconst hasPendingDocumentSync = session?.hasPendingDocumentSync ?? false;\n\n\tconst applyIncomingItems = useCallback(\n\t\tasync (nextItems: readonly VectorSceneItem[]) => {\n\t\t\tconst normalizedItems = normalizeItems\n\t\t\t\t? normalizeItems(nextItems)\n\t\t\t\t: [...nextItems];\n\t\t\tif (!hydrateItems) return normalizedItems;\n\t\t\treturn await hydrateItems(normalizedItems);\n\t\t},\n\t\t[hydrateItems, normalizeItems],\n\t);\n\n\tconst handleItemsChange = useCallback(\n\t\t(nextItems: VectorSceneItem[]) => {\n\t\t\tif (!enabled) {\n\t\t\t\tonItemsChange?.(normalizeItems ? normalizeItems(nextItems) : nextItems);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thasLocalChangeInFlightRef.current = true;\n\t\t\tconst normalizedItems = normalizeItems ? normalizeItems(nextItems) : nextItems;\n\t\t\tonItemsChange?.(normalizedItems);\n\t\t\tsession?.remoteAdapter.send?.(normalizedItems);\n\t\t},\n\t\t[enabled, normalizeItems, onItemsChange, session],\n\t);\n\n\tuseEffect(() => {\n\t\tlatestItemsRef.current = items;\n\t\tif (items.length > 0) {\n\t\t\thasEverPropagatedItemsRef.current = true;\n\t\t}\n\t}, [items]);\n\n\tuseEffect(() => {\n\t\tif (!hasLocalOfflineDraft && !hasPendingDocumentSync) {\n\t\t\thasLocalChangeInFlightRef.current = false;\n\t\t}\n\t}, [hasLocalOfflineDraft, hasPendingDocumentSync]);\n\n\tuseEffect(() => {\n\t\tif (!realtimeEnabled || !onItemsChange || !session?.document) return;\n\t\tif (documentUpdatedByClientId === connectionClientId) return;\n\t\tif (documentRevision == null) return;\n\t\tif (lastAppliedRevisionRef.current === documentRevision) return;\n\t\tif (inFlightRevisionRef.current === documentRevision) return;\n\t\tinFlightRevisionRef.current = documentRevision;\n\t\tlet cancelled = false;\n\t\tsetLoading(true);\n\t\tvoid applyIncomingItems(documentItems ?? [])\n\t\t\t.then((resolvedItems) => {\n\t\t\t\tif (cancelled) return;\n\t\t\t\tif (inFlightRevisionRef.current !== documentRevision) return;\n\t\t\t\tlastAppliedRevisionRef.current = documentRevision;\n\t\t\t\tconst localItems = latestItemsRef.current;\n\t\t\t\tconst hasLocalItems = localItems.length > 0;\n\t\t\t\tconst hasPendingLocalChanges =\n\t\t\t\t\thasLocalOfflineDraft ||\n\t\t\t\t\thasPendingDocumentSync ||\n\t\t\t\t\thasLocalChangeInFlightRef.current;\n\t\t\t\tif (\n\t\t\t\t\tresolvedItems.length === 0 &&\n\t\t\t\t\t(hasEverPropagatedItemsRef.current ||\n\t\t\t\t\t\thasLocalItems ||\n\t\t\t\t\t\thasPendingLocalChanges)\n\t\t\t\t) {\n\t\t\t\t\t// Defensive: a previously non-empty document is now empty.\n\t\t\t\t\t// Almost always a stale or buggy snapshot — skip rather\n\t\t\t\t\t// than wipe the consumer's view. The next snapshot will\n\t\t\t\t\t// reconcile if the emptiness was real.\n\t\t\t\t\tif (hasLocalItems) {\n\t\t\t\t\t\tconst normalizedLocalItems = normalizeItems\n\t\t\t\t\t\t\t? normalizeItems(localItems)\n\t\t\t\t\t\t\t: [...localItems];\n\t\t\t\t\t\tsession.remoteAdapter.send?.(normalizedLocalItems);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tshouldPreserveLocalRealtimeItems({\n\t\t\t\t\t\tlocalItems,\n\t\t\t\t\t\tincomingItems: resolvedItems,\n\t\t\t\t\t\thasPendingLocalChanges,\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\tconst normalizedLocalItems = normalizeItems\n\t\t\t\t\t\t? normalizeItems(localItems)\n\t\t\t\t\t\t: [...localItems];\n\t\t\t\t\tsession.remoteAdapter.send?.(normalizedLocalItems);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (resolvedItems.length > 0) {\n\t\t\t\t\thasEverPropagatedItemsRef.current = true;\n\t\t\t\t}\n\t\t\t\tonItemsChange(resolvedItems);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (inFlightRevisionRef.current === documentRevision) {\n\t\t\t\t\tinFlightRevisionRef.current = null;\n\t\t\t\t}\n\t\t\t\tif (cancelled) return;\n\t\t\t\tsetLoading(false);\n\t\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [\n\t\tapplyIncomingItems,\n\t\tconnectionClientId,\n\t\tdocumentItems,\n\t\tdocumentRevision,\n\t\tdocumentUpdatedByClientId,\n\t\thasLocalOfflineDraft,\n\t\thasPendingDocumentSync,\n\t\tnormalizeItems,\n\t\tonItemsChange,\n\t\trealtimeEnabled,\n\t\tsession?.remoteAdapter,\n\t\tsession?.document,\n\t]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\titems,\n\t\t\tonItemsChange: onItemsChange ? handleItemsChange : undefined,\n\t\t\tloading,\n\t\t\tsaving: session?.hasPendingDocumentSync ?? false,\n\t\t\thasLocalOfflineDraft: session?.hasLocalOfflineDraft ?? false,\n\t\t\tsyncState: session?.syncState ?? \"offline\",\n\t\t\tconflict: session?.conflict ?? null,\n\t\t\tresolveConflict: session?.resolveConflict ?? (() => {}),\n\t\t\tclearLocalDraft: session?.clearLocalDraft ?? (() => {}),\n\t\t\tflush: session?.flushDocumentSync ?? (async () => {}),\n\t\t}),\n\t\t[handleItemsChange, items, loading, onItemsChange, session],\n\t);\n}\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { RealtimeSessionPeer } from \"./protocol\";\nimport type { RealtimeViewportHandle } from \"./use-realtime-session\";\n\nexport type UseRealtimePeerFollowOptions = {\n\tviewportRef: RefObject<RealtimeViewportHandle | null>;\n\tsessionPeers: RealtimeSessionPeer[];\n\tfollowedPeerId: string | null | undefined;\n\tonFollowEnd?: () => void;\n};\n\ntype ViewportCameraSnapshot = {\n\tx: number;\n\ty: number;\n\tzoom: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n};\n\ntype AnimationRuntime = typeof globalThis & {\n\trequestAnimationFrame?: (callback: FrameRequestCallback) => number;\n\tcancelAnimationFrame?: (handle: number) => void;\n};\n\nconst viewportFollowSyncSnapshots = new WeakMap<\n\tRealtimeViewportHandle,\n\tViewportCameraSnapshot\n>();\n\nfunction requestRuntimeAnimationFrame(callback: FrameRequestCallback): number {\n\tconst runtime = globalThis as AnimationRuntime;\n\tif (typeof runtime.requestAnimationFrame === \"function\") {\n\t\treturn runtime.requestAnimationFrame(callback);\n\t}\n\treturn globalThis.setTimeout(() => callback(Date.now()), 16);\n}\n\nfunction cancelRuntimeAnimationFrame(handle: number): void {\n\tconst runtime = globalThis as AnimationRuntime;\n\tif (typeof runtime.cancelAnimationFrame === \"function\") {\n\t\truntime.cancelAnimationFrame(handle);\n\t\treturn;\n\t}\n\tglobalThis.clearTimeout(handle);\n}\n\nfunction getFollowedPeer(\n\tsessionPeers: RealtimeSessionPeer[],\n\tfollowedPeerId: string,\n): RealtimeSessionPeer | undefined {\n\treturn sessionPeers.find(\n\t\t(peerState) =>\n\t\t\tpeerState.peerId === followedPeerId || peerState.id === followedPeerId,\n\t);\n}\n\nfunction getCameraKey(peer: RealtimeSessionPeer): string | null {\n\tif (!peer.camera) return null;\n\treturn [\n\t\tpeer.peerId,\n\t\tpeer.camera.x,\n\t\tpeer.camera.y,\n\t\tpeer.camera.zoom,\n\t\tpeer.camera.viewportWidth,\n\t\tpeer.camera.viewportHeight,\n\t].join(\":\");\n}\n\nfunction getViewportSizeKey(viewport: RealtimeViewportHandle | null): string | null {\n\tif (!viewport) return null;\n\tconst viewportSize = viewport.getViewportSize();\n\treturn [viewportSize.width, viewportSize.height].join(\":\");\n}\n\nfunction getFollowedCameraPosition(\n\tviewport: RealtimeViewportHandle,\n\tpeer: RealtimeSessionPeer,\n): { x: number; y: number; zoom: number } | null {\n\tif (!peer.camera) return null;\n\tconst viewportSize = viewport.getViewportSize();\n\treturn {\n\t\tx: peer.camera.x + (viewportSize.width - peer.camera.viewportWidth) / 2,\n\t\ty: peer.camera.y + (viewportSize.height - peer.camera.viewportHeight) / 2,\n\t\tzoom: peer.camera.zoom,\n\t};\n}\n\nfunction applyPeerCamera(\n\tviewport: RealtimeViewportHandle,\n\tpeer: RealtimeSessionPeer,\n): boolean {\n\tconst camera = viewport.getCamera();\n\tconst nextCamera = getFollowedCameraPosition(viewport, peer);\n\tconst viewportSize = viewport.getViewportSize();\n\tif (!camera || !nextCamera) return false;\n\tif (\n\t\tcamera.x === nextCamera.x &&\n\t\tcamera.y === nextCamera.y &&\n\t\tcamera.zoom === nextCamera.zoom\n\t) {\n\t\treturn true;\n\t}\n\tmarkViewportFollowSync(viewport, {\n\t\tx: nextCamera.x,\n\t\ty: nextCamera.y,\n\t\tzoom: nextCamera.zoom,\n\t\tviewportWidth: viewportSize.width,\n\t\tviewportHeight: viewportSize.height,\n\t});\n\tcamera.x = nextCamera.x;\n\tcamera.y = nextCamera.y;\n\tcamera.zoom = nextCamera.zoom;\n\tviewport.requestRender();\n\treturn true;\n}\n\nexport function markViewportFollowSync(\n\tviewport: RealtimeViewportHandle,\n\tsnapshot: ViewportCameraSnapshot,\n): void {\n\tviewportFollowSyncSnapshots.set(viewport, snapshot);\n}\n\nexport function consumeViewportFollowSync(\n\tviewport: RealtimeViewportHandle,\n\tsnapshot: ViewportCameraSnapshot,\n): boolean {\n\tconst currentSnapshot = viewportFollowSyncSnapshots.get(viewport);\n\tif (\n\t\t!currentSnapshot ||\n\t\tcurrentSnapshot.x !== snapshot.x ||\n\t\tcurrentSnapshot.y !== snapshot.y ||\n\t\tcurrentSnapshot.zoom !== snapshot.zoom ||\n\t\tcurrentSnapshot.viewportWidth !== snapshot.viewportWidth ||\n\t\tcurrentSnapshot.viewportHeight !== snapshot.viewportHeight\n\t) {\n\t\treturn false;\n\t}\n\tviewportFollowSyncSnapshots.delete(viewport);\n\treturn true;\n}\n\nexport function useRealtimePeerFollow(options: UseRealtimePeerFollowOptions): void {\n\tconst { viewportRef, sessionPeers, followedPeerId, onFollowEnd } = options;\n\tconst endedPeerIdRef = useRef<string | null>(null);\n\tconst lastAppliedCameraKeyRef = useRef<string | null>(null);\n\tconst [, setViewportSizeVersion] = useState(0);\n\n\tuseEffect(() => {\n\t\tif (!followedPeerId) return;\n\t\tlet animationFrameId = 0;\n\t\tlet lastViewportSizeKey = getViewportSizeKey(viewportRef.current ?? null);\n\n\t\tconst checkViewportSize = () => {\n\t\t\tconst nextViewportSizeKey = getViewportSizeKey(viewportRef.current ?? null);\n\t\t\tif (nextViewportSizeKey !== lastViewportSizeKey) {\n\t\t\t\tlastViewportSizeKey = nextViewportSizeKey;\n\t\t\t\tsetViewportSizeVersion((value) => value + 1);\n\t\t\t}\n\t\t\tanimationFrameId = requestRuntimeAnimationFrame(checkViewportSize);\n\t\t};\n\n\t\tanimationFrameId = requestRuntimeAnimationFrame(checkViewportSize);\n\t\treturn () => {\n\t\t\tcancelRuntimeAnimationFrame(animationFrameId);\n\t\t};\n\t}, [followedPeerId, viewportRef]);\n\n\tuseEffect(() => {\n\t\tif (!followedPeerId) {\n\t\t\tendedPeerIdRef.current = null;\n\t\t\tlastAppliedCameraKeyRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst followedPeer = getFollowedPeer(sessionPeers, followedPeerId);\n\t\tif (!followedPeer) {\n\t\t\tlastAppliedCameraKeyRef.current = null;\n\t\t\tif (endedPeerIdRef.current === followedPeerId) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tendedPeerIdRef.current = followedPeerId;\n\t\t\tonFollowEnd?.();\n\t\t\treturn;\n\t\t}\n\t\tif (!followedPeer.camera) {\n\t\t\tendedPeerIdRef.current = null;\n\t\t\tlastAppliedCameraKeyRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tendedPeerIdRef.current = null;\n\t\tconst viewport = viewportRef.current;\n\t\tconst nextCameraKey = [\n\t\t\tgetCameraKey(followedPeer),\n\t\t\tgetViewportSizeKey(viewport ?? null),\n\t\t].join(\":\");\n\t\tif (nextCameraKey && nextCameraKey === lastAppliedCameraKeyRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tif (!viewport || !applyPeerCamera(viewport, followedPeer)) {\n\t\t\treturn;\n\t\t}\n\t\tlastAppliedCameraKeyRef.current = nextCameraKey;\n\t}, [followedPeerId, onFollowEnd, sessionPeers, viewportRef]);\n}\n","import * as Y from \"yjs\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n// Phase 1 design: Yjs is the local source of truth for items, but the wire\n// protocol remains items-array snapshots (so legacy boards and unchanged\n// server work). The CRDT semantics buy us per-field merge on the client side\n// and accurate distinction between \"deleted by another user\" vs \"added\n// locally and not yet synced\".\n//\n// Y.Doc shape:\n// doc.getArray<Y.Map>(\"items\") → ordered list of items\n// each Y.Map has the VectorSceneItem fields (id, toolKind, bounds, etc.)\n//\n// We never put blob handles or rasterized image refs into the Y.Doc — those\n// are local-only and would not survive sync. sanitizeRealtimeItem upstream\n// already strips them before items reach this layer for outbound.\n\nconst ITEMS_KEY = \"items\";\nconst CLIENT_ONLY_IMAGE_KEYS = new Set([\n\t\"imageBlobId\",\n\t\"imageThumbnailBlobId\",\n\t\"imageRasterHref\",\n\t\"imageThumbnailHref\",\n]);\n\n// Window during which a freshly server-added id is protected from being\n// deleted by a local-items update. Necessary because the React consumer that\n// drives applyLocalItemsToYDoc cannot have rendered the just-received server\n// item yet, so its \"current local view\" legitimately lacks it. Without this\n// guard, a user drawing at 60fps while another peer adds items causes those\n// inbound items to vanish from the Y.Doc the next time the consumer's\n// onItemsChange fires.\nconst SERVER_ADD_RACE_WINDOW_MS = 2000;\n\nexport type YjsBoardDoc = {\n\treadonly doc: Y.Doc;\n\treadonly yItems: Y.Array<Y.Map<unknown>>;\n\t/**\n\t * Set of item ids that the server has confirmed in its latest snapshot.\n\t * Items present in the Y.Doc whose id is NOT in this set are considered\n\t * locally-pending — they have not yet been seen by the server. When a\n\t * server snapshot arrives lacking an id that IS in this set, we know the\n\t * server deleted it (rather than simply not having seen our local copy).\n\t */\n\tlastServerConfirmedIds: Set<string>;\n\tlastServerConfirmedItemSerializations: Map<string, string>;\n\t/**\n\t * Map of id → timestamp (ms) recording when the server most recently\n\t * surfaced an item. Used to protect freshly added remote items from being\n\t * deleted by a stale local-items update during the React-render race\n\t * window. Entries older than SERVER_ADD_RACE_WINDOW_MS are eligible for\n\t * pruning during deletion checks.\n\t */\n\tserverItemSeenAt: Map<string, number>;\n};\n\nexport function createYjsBoardDoc(): YjsBoardDoc {\n\tconst doc = new Y.Doc();\n\tconst yItems = doc.getArray<Y.Map<unknown>>(ITEMS_KEY);\n\treturn {\n\t\tdoc,\n\t\tyItems,\n\t\tlastServerConfirmedIds: new Set(),\n\t\tlastServerConfirmedItemSerializations: new Map(),\n\t\tserverItemSeenAt: new Map(),\n\t};\n}\n\nfunction getItemId(item: VectorSceneItem | Y.Map<unknown>): string | null {\n\tif (item instanceof Y.Map) {\n\t\tconst id = item.get(\"id\");\n\t\treturn typeof id === \"string\" ? id : null;\n\t}\n\tconst id = (item as { id?: unknown }).id;\n\treturn typeof id === \"string\" ? id : null;\n}\n\nfunction vectorItemToYMap(item: VectorSceneItem): Y.Map<unknown> {\n\tconst yMap = new Y.Map<unknown>();\n\tfor (const [key, value] of Object.entries(normalizeRealtimeItem(item))) {\n\t\tif (value === undefined) continue;\n\t\tyMap.set(key, value);\n\t}\n\treturn yMap;\n}\n\nfunction yMapToVectorItem(yMap: Y.Map<unknown>): VectorSceneItem {\n\tconst obj: Record<string, unknown> = {};\n\tfor (const [key, value] of yMap.entries()) {\n\t\tobj[key] = value;\n\t}\n\treturn obj as VectorSceneItem;\n}\n\n/**\n * Project the current Y.Doc state to a plain items array for the React\n * consumer (canvu's VectorCanvas).\n */\nexport function readVectorItems(yItems: Y.Array<Y.Map<unknown>>): VectorSceneItem[] {\n\tconst result: VectorSceneItem[] = [];\n\tfor (let i = 0; i < yItems.length; i++) {\n\t\tconst yMap = yItems.get(i);\n\t\tif (yMap) result.push(yMapToVectorItem(yMap));\n\t}\n\treturn result;\n}\n\n/**\n * Build an index of the current Y.Doc items by id for fast lookups during\n * merge. Items without an id are skipped — they cannot be reconciled by id\n * and stay as-is.\n */\nfunction indexYItemsById(\n\tyItems: Y.Array<Y.Map<unknown>>,\n): Map<string, { yMap: Y.Map<unknown>; index: number }> {\n\tconst result = new Map<string, { yMap: Y.Map<unknown>; index: number }>();\n\tfor (let i = 0; i < yItems.length; i++) {\n\t\tconst yMap = yItems.get(i);\n\t\tif (!yMap) continue;\n\t\tconst id = getItemId(yMap);\n\t\tif (!id) continue;\n\t\tresult.set(id, { yMap, index: i });\n\t}\n\treturn result;\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n\tif (left === right) return true;\n\tif (typeof left !== typeof right) return false;\n\tif (left === null || right === null) return false;\n\tif (typeof left !== \"object\") return false;\n\ttry {\n\t\treturn JSON.stringify(left) === JSON.stringify(right);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction serializeItem(value: VectorSceneItem | Y.Map<unknown>): string {\n\tconst item = value instanceof Y.Map ? yMapToVectorItem(value) : value;\n\treturn JSON.stringify(normalizeRealtimeItem(item));\n}\n\n/**\n * Update a Y.Map in place to match a target VectorSceneItem, touching only\n * the fields that actually changed. This keeps Yjs ops minimal and avoids\n * triggering observers for no-op updates.\n */\nfunction updateYMapInPlace(yMap: Y.Map<unknown>, next: VectorSceneItem): void {\n\tconst normalizedNext = normalizeRealtimeItem(next);\n\tconst nextKeys = new Set<string>();\n\tfor (const [key, value] of Object.entries(normalizedNext)) {\n\t\tif (value === undefined) continue;\n\t\tnextKeys.add(key);\n\t\tconst current = yMap.get(key);\n\t\tif (!valuesEqual(current, value)) {\n\t\t\tyMap.set(key, value);\n\t\t}\n\t}\n\tfor (const key of Array.from(yMap.keys())) {\n\t\tif (!nextKeys.has(key)) yMap.delete(key);\n\t}\n}\n\nfunction normalizeRealtimeItem(item: VectorSceneItem): VectorSceneItem {\n\tif (item.toolKind !== \"image\") return item;\n\tconst normalized = Object.fromEntries(\n\t\tObject.entries(item).filter(([key]) => !CLIENT_ONLY_IMAGE_KEYS.has(key)),\n\t) as Record<string, unknown>;\n\tnormalized.childrenSvg = \"\";\n\treturn normalized as VectorSceneItem;\n}\n\nexport type ApplyLocalItemsOptions = {\n\t/**\n\t * Items provided by the local consumer (canvu's VectorCanvas onItemsChange).\n\t * The Y.Doc is mutated to match this set: new ids are added (in the order\n\t * they appear), changed ids have their Y.Map fields updated, and ids\n\t * missing from the new list are removed.\n\t *\n\t * All mutations happen inside a single Y transaction so observers see one\n\t * coherent change.\n\t */\n\titems: readonly VectorSceneItem[];\n\t/**\n\t * Optional origin tag for the transaction. Useful to distinguish local\n\t * edits from remote applies when observing the doc.\n\t */\n\torigin?: unknown;\n};\n\n/**\n * Apply a complete items array from the local consumer as a set of minimal\n * Yjs operations. Order of the next array becomes the order in the Y.Array.\n *\n * Returns the list of item ids that are newly introduced (not present before\n * this call), so the caller can track them as \"locally-pending until server\n * confirms\".\n */\nexport function applyLocalItemsToYDoc(\n\tboard: YjsBoardDoc,\n\toptions: ApplyLocalItemsOptions,\n): { addedIds: string[]; removedIds: string[] } {\n\tconst { items, origin } = options;\n\tconst addedIds: string[] = [];\n\tconst removedIds: string[] = [];\n\tconst now = Date.now();\n\tboard.doc.transact(() => {\n\t\tconst currentIndex = indexYItemsById(board.yItems);\n\t\tconst nextIds = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tconst id = getItemId(item);\n\t\t\tif (!id) continue;\n\t\t\tnextIds.add(id);\n\t\t}\n\t\t// Walk deletes in descending index order so removals don't shift the\n\t\t// indices of items still pending deletion.\n\t\tconst toDelete: Array<{ id: string; index: number }> = [];\n\t\tfor (const [id, entry] of currentIndex) {\n\t\t\tif (nextIds.has(id)) continue;\n\t\t\t// Race guard: an id that the server surfaced within the last race\n\t\t\t// window may simply not have been rendered by the React consumer\n\t\t\t// yet, so its absence from `items` is not a real user delete.\n\t\t\t// Preserve it; the next local update after the consumer re-renders\n\t\t\t// will include it (no-op) or genuinely omit it (after the window\n\t\t\t// elapses, deletion will then go through).\n\t\t\tconst serverSeenAt = board.serverItemSeenAt.get(id);\n\t\t\tif (serverSeenAt != null && now - serverSeenAt < SERVER_ADD_RACE_WINDOW_MS) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttoDelete.push({ id, index: entry.index });\n\t\t}\n\t\ttoDelete.sort((a, b) => b.index - a.index);\n\t\tfor (const { id, index } of toDelete) {\n\t\t\tboard.yItems.delete(index, 1);\n\t\t\tboard.serverItemSeenAt.delete(id);\n\t\t\tremovedIds.push(id);\n\t\t}\n\t\tconst refreshedIndex = indexYItemsById(board.yItems);\n\t\tfor (let nextOrder = 0; nextOrder < items.length; nextOrder++) {\n\t\t\tconst item = items[nextOrder];\n\t\t\tif (!item) continue;\n\t\t\tconst id = getItemId(item);\n\t\t\tif (!id) continue;\n\t\t\tconst existing = refreshedIndex.get(id);\n\t\t\tif (existing) {\n\t\t\t\tupdateYMapInPlace(existing.yMap, item);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst yMap = vectorItemToYMap(item);\n\t\t\tboard.yItems.push([yMap]);\n\t\t\taddedIds.push(id);\n\t\t}\n\t}, origin);\n\treturn { addedIds, removedIds };\n}\n\nexport type ApplyServerSnapshotOptions = {\n\t/**\n\t * Server-confirmed items snapshot. Ordering of the snapshot is treated as\n\t * authoritative for items the server knows about.\n\t */\n\titems: readonly VectorSceneItem[];\n\t/**\n\t * Optional origin tag for the transaction.\n\t */\n\torigin?: unknown;\n};\n\n/**\n * Reconcile a server snapshot into the Y.Doc, additively.\n *\n * Rules:\n * - id present in snapshot AND in Y.Doc → update Y.Map fields in place.\n * - id present in snapshot AND NOT in Y.Doc → add to Y.Doc.\n * - id present in Y.Doc, NOT in snapshot → **keep**. We intentionally do\n * not delete based on server absence. With a snapshot wire protocol and\n * a store-and-broadcast server that does not merge, we cannot tell\n * \"another peer deleted this id\" apart from \"another peer sent a stale\n * snapshot that didn't include this id yet\". Treating absence as delete\n * caused a cascading wipe: each peer's update removed the others'\n * unsynced items, peer A's next snapshot then removed peer B's items\n * again, until everything converged to empty.\n *\n * The cost of being conservative: deletes performed by other peers do\n * not propagate visually. Local user deletes still work via\n * applyLocalItemsToYDoc (their Y.Doc loses the item, the next flush\n * pushes the new state up). Fixing cross-peer deletes properly requires\n * an explicit delete signal on the wire — that is Phase 2 (ops-based\n * protocol with server-side merge).\n *\n * `board.lastServerConfirmedIds` is still updated to the snapshot id set so\n * the local delete path's race guard remains accurate.\n */\nexport function applyServerSnapshotToYDoc(\n\tboard: YjsBoardDoc,\n\toptions: ApplyServerSnapshotOptions,\n): void {\n\tconst { items: snapshotItems, origin } = options;\n\tconst now = Date.now();\n\tboard.doc.transact(() => {\n\t\tfor (const item of snapshotItems) {\n\t\t\tconst id = getItemId(item);\n\t\t\tif (!id) continue;\n\t\t\tconst existing = indexYItemsById(board.yItems).get(id);\n\t\t\tif (existing) {\n\t\t\t\tconst currentSerialized = serializeItem(existing.yMap);\n\t\t\t\tconst incomingSerialized = serializeItem(item);\n\t\t\t\tconst confirmedSerialized =\n\t\t\t\t\tboard.lastServerConfirmedItemSerializations.get(id);\n\t\t\t\tconst hasPendingLocalChange =\n\t\t\t\t\tconfirmedSerialized === undefined\n\t\t\t\t\t\t? currentSerialized !== incomingSerialized\n\t\t\t\t\t\t: currentSerialized !== confirmedSerialized &&\n\t\t\t\t\t\t\tcurrentSerialized !== incomingSerialized;\n\t\t\t\tif (hasPendingLocalChange) {\n\t\t\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tupdateYMapInPlace(existing.yMap, item);\n\t\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst yMap = vectorItemToYMap(item);\n\t\t\tboard.yItems.push([yMap]);\n\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t}\n\t}, origin);\n\n\tboard.lastServerConfirmedIds = new Set();\n\tboard.lastServerConfirmedItemSerializations = new Map();\n\tfor (const item of snapshotItems) {\n\t\tconst id = getItemId(item);\n\t\tif (id) {\n\t\t\tboard.lastServerConfirmedIds.add(id);\n\t\t\tboard.lastServerConfirmedItemSerializations.set(id, serializeItem(item));\n\t\t}\n\t}\n}\n\n/**\n * Replace the entire Y.Doc state with a snapshot, discarding any local\n * changes. Used on initial load when no local draft exists and we just want\n * the server's view.\n */\nexport function replaceYDocWithSnapshot(\n\tboard: YjsBoardDoc,\n\toptions: ApplyServerSnapshotOptions,\n): void {\n\tconst { items: snapshotItems, origin } = options;\n\tconst now = Date.now();\n\tboard.doc.transact(() => {\n\t\tif (board.yItems.length > 0) {\n\t\t\tboard.yItems.delete(0, board.yItems.length);\n\t\t}\n\t\tfor (const item of snapshotItems) {\n\t\t\tboard.yItems.push([vectorItemToYMap(item)]);\n\t\t}\n\t}, origin);\n\tboard.lastServerConfirmedIds = new Set();\n\tboard.lastServerConfirmedItemSerializations = new Map();\n\tboard.serverItemSeenAt = new Map();\n\tfor (const item of snapshotItems) {\n\t\tconst id = getItemId(item);\n\t\tif (id) {\n\t\t\tboard.lastServerConfirmedIds.add(id);\n\t\t\tboard.lastServerConfirmedItemSerializations.set(id, serializeItem(item));\n\t\t\tboard.serverItemSeenAt.set(id, now);\n\t\t}\n\t}\n}\n\n/**\n * Return ids of items currently in the Y.Doc that have not yet been\n * confirmed in a server snapshot. These are the user's local additions still\n * waiting for the server to round-trip.\n */\nexport function getLocallyPendingItemIds(board: YjsBoardDoc): Set<string> {\n\tconst pending = new Set<string>();\n\tfor (let i = 0; i < board.yItems.length; i++) {\n\t\tconst yMap = board.yItems.get(i);\n\t\tif (!yMap) continue;\n\t\tconst id = getItemId(yMap);\n\t\tif (!id) continue;\n\t\tconst confirmedSerialized = board.lastServerConfirmedItemSerializations.get(id);\n\t\tif (!confirmedSerialized || serializeItem(yMap) !== confirmedSerialized) {\n\t\t\tpending.add(id);\n\t\t}\n\t}\n\treturn pending;\n}\n\n/**\n * Encode the Y.Doc state for persistence (localStorage offline draft).\n * Returns a base64-ish string suitable for JSON storage.\n */\nexport function encodeYDocState(board: YjsBoardDoc): string {\n\tconst update = Y.encodeStateAsUpdate(board.doc);\n\tlet binary = \"\";\n\tfor (let i = 0; i < update.length; i++) {\n\t\tbinary += String.fromCharCode(update[i] as number);\n\t}\n\treturn btoa(binary);\n}\n\n/**\n * Decode and apply a previously-encoded Y.Doc state. Returns true if the\n * state was applied successfully.\n */\nexport function decodeYDocState(board: YjsBoardDoc, encoded: string): boolean {\n\ttry {\n\t\tconst binary = atob(encoded);\n\t\tconst update = new Uint8Array(binary.length);\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tupdate[i] = binary.charCodeAt(i);\n\t\t}\n\t\tY.applyUpdate(board.doc, update);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { VectorCanvasRemoteAdapter } from \"../react/persistence\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\tparseRealtimeServerMessage,\n\ttype RealtimeClientMessage,\n\ttype RealtimeConnectionInfo,\n\ttype RealtimeDocumentSnapshot,\n\ttype RealtimeSessionPeer,\n} from \"./protocol\";\nimport { consumeViewportFollowSync } from \"./use-realtime-peer-follow\";\nimport {\n\tapplyLocalItemsToYDoc,\n\tapplyServerSnapshotToYDoc,\n\tcreateYjsBoardDoc,\n\tdecodeYDocState,\n\tencodeYDocState,\n\tgetLocallyPendingItemIds,\n\treadVectorItems,\n\treplaceYDocWithSnapshot,\n\ttype YjsBoardDoc,\n} from \"./yjs-document\";\n\n// Origin tags for Y.Doc transactions. Used to distinguish local edits from\n// remote applies when observing the doc so we can avoid feedback loops.\nconst ORIGIN_LOCAL = Symbol(\"canvu/realtime/local\");\nconst ORIGIN_REMOTE = Symbol(\"canvu/realtime/remote\");\nconst ORIGIN_BOOTSTRAP = Symbol(\"canvu/realtime/bootstrap\");\n\ntype RealtimeSessionPeerInput = {\n\tid: string;\n\tdisplayName?: string;\n\tcolor?: string;\n\timage?: string;\n\tclientId?: string;\n};\n\nexport type UseRealtimeSessionOptions = {\n\turl: string;\n\troomId: string;\n\tpeer: RealtimeSessionPeerInput;\n\tenabled?: boolean;\n\tdraftStorage?: RealtimeDraftStorage | null;\n\treconnect?: boolean;\n\theartbeatMs?: number;\n\tmaxReconnectDelayMs?: number;\n\tinitialReconnectDelayMs?: number;\n\tconnectTimeoutMs?: number;\n\tonError?: (message: string) => void;\n};\n\nexport type RealtimeDraftStorage = {\n\tgetItem: (key: string) => string | null | Promise<string | null>;\n\tsetItem: (key: string, value: string) => void | Promise<void>;\n\tremoveItem: (key: string) => void | Promise<void>;\n};\n\nexport type RealtimeViewportCamera = {\n\tx: number;\n\ty: number;\n\tzoom: number;\n};\n\nexport type RealtimeViewportHandle = {\n\tgetCamera: () => RealtimeViewportCamera | null;\n\trequestRender: () => void;\n\tgetViewportSize: () => { width: number; height: number };\n};\n\nexport type RealtimePlacementPreview =\n\t| {\n\t\t\treadonly kind: \"rect\" | \"ellipse\" | \"architectural-cloud\" | \"marquee\";\n\t\t\treadonly rect: {\n\t\t\t\treadonly x: number;\n\t\t\t\treadonly y: number;\n\t\t\t\treadonly width: number;\n\t\t\t\treadonly height: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\treadonly kind: \"line\" | \"arrow\";\n\t\t\treadonly start: { readonly x: number; readonly y: number };\n\t\t\treadonly end: { readonly x: number; readonly y: number };\n\t }\n\t| {\n\t\t\treadonly kind: \"stroke\";\n\t\t\treadonly tool: \"draw\" | \"marker\" | \"laser\";\n\t\t\treadonly points: readonly { readonly x: number; readonly y: number }[];\n\t\t\treadonly style?: StrokeStyle;\n\t };\n\nexport type RealtimeViewportPresenceBindings = {\n\tremotePresence: RealtimeSessionPeer[];\n\tonWorldPointerMove: (world: { readonly x: number; readonly y: number }) => void;\n\tonWorldPointerLeave: () => void;\n\tonPlacementPreviewChange: (preview: RealtimePlacementPreview | null) => void;\n\tonCameraChange: () => void;\n};\n\ntype BindViewportPresenceOptions = {\n\tactiveTool?: string;\n\tviewportRef?: RefObject<RealtimeViewportHandle | null>;\n};\n\nexport type RealtimeSyncState =\n\t| \"connected\"\n\t| \"reconnecting\"\n\t| \"offline\"\n\t| \"conflicted\";\n\nexport type RealtimeDocumentConflict = {\n\treadonly serverRevision: number;\n\treadonly serverItems: VectorSceneItem[];\n\treadonly localItems: VectorSceneItem[];\n};\n\ntype RealtimeOfflineDraft = {\n\treadonly roomId: string;\n\treadonly baseRevision: number;\n\treadonly items: VectorSceneItem[];\n\treadonly updatedAt: number;\n\t/**\n\t * Optional encoded Y.Doc state. When present, applying the draft on\n\t * reconnect uses the binary state (CRDT-preserving). Older drafts may\n\t * only have `items` (legacy format) — in that case we bootstrap a fresh\n\t * Y.Doc from the items array.\n\t */\n\treadonly yDocState?: string;\n\t/**\n\t * Optional list of ids that were not yet server-confirmed when the draft\n\t * was written. Lets us continue treating them as locally-pending after\n\t * reload.\n\t */\n\treadonly pendingIds?: string[];\n};\n\nexport type UseRealtimeSessionResult = {\n\tconnection: RealtimeConnectionInfo;\n\tsessionPeers: RealtimeSessionPeer[];\n\tremotePresence: RealtimeSessionPeer[];\n\tremoteAdapter: VectorCanvasRemoteAdapter;\n\tdocument: RealtimeDocumentSnapshot | null;\n\thasLocalOfflineDraft: boolean;\n\thasPendingDocumentSync: boolean;\n\tsyncState: RealtimeSyncState;\n\tconflict: RealtimeDocumentConflict | null;\n\tbindViewportPresence: (\n\t\toptions?: BindViewportPresenceOptions,\n\t) => RealtimeViewportPresenceBindings;\n\tsyncViewportPresence: (options?: BindViewportPresenceOptions) => boolean;\n\tresolveConflict: (action: \"keep-local\" | \"use-server\") => void;\n\tclearLocalDraft: () => void;\n\tflushDocumentSync: () => Promise<void>;\n\tdisconnect: () => void;\n\treconnectNow: () => void;\n};\n\nconst DRAFT_STORAGE_PREFIX = \"canvu-realtime-draft:\";\nconst DOCUMENT_FLUSH_DEBOUNCE_MS = 120;\nconst DRAFT_PERSIST_DEBOUNCE_MS = 420;\nconst CONNECTION_MESSAGE_STATE_UPDATE_INTERVAL_MS = 1_000;\n\ntype IdleCallbackHandle = number | object;\ntype TimeoutHandle = ReturnType<typeof setTimeout>;\ntype IntervalHandle = ReturnType<typeof setInterval>;\ntype IdleRuntime = typeof globalThis & {\n\trequestIdleCallback?: (\n\t\tcallback: () => void,\n\t\toptions?: { timeout?: number },\n\t) => IdleCallbackHandle;\n\tcancelIdleCallback?: (handle: IdleCallbackHandle) => void;\n\tlocalStorage?: Storage;\n};\ntype SocketEventType = \"open\" | \"message\" | \"error\" | \"close\";\n\nfunction requestRuntimeIdleCallback(\n\tcallback: () => void,\n\ttimeout: number,\n): IdleCallbackHandle {\n\tconst runtime = globalThis as IdleRuntime;\n\tif (typeof runtime.requestIdleCallback === \"function\") {\n\t\treturn runtime.requestIdleCallback(callback, { timeout });\n\t}\n\treturn globalThis.setTimeout(callback, timeout);\n}\n\nexport function cancelRuntimeIdleCallback(handle: IdleCallbackHandle | null): void {\n\tif (handle == null) return;\n\tconst runtime = globalThis as IdleRuntime;\n\tif (typeof runtime.cancelIdleCallback === \"function\") {\n\t\truntime.cancelIdleCallback(handle);\n\t\treturn;\n\t}\n\tglobalThis.clearTimeout(handle as TimeoutHandle);\n}\n\nexport function createBrowserDraftStorage(): RealtimeDraftStorage | null {\n\tconst runtime = globalThis as IdleRuntime;\n\tconst storage = runtime.localStorage;\n\tif (!storage) return null;\n\treturn {\n\t\tgetItem: (key) => storage.getItem(key),\n\t\tsetItem: (key, value) => storage.setItem(key, value),\n\t\tremoveItem: (key) => storage.removeItem(key),\n\t};\n}\n\nfunction getSocketHandlerProperty(\n\ttype: SocketEventType,\n): \"onopen\" | \"onmessage\" | \"onerror\" | \"onclose\" {\n\tif (type === \"open\") return \"onopen\";\n\tif (type === \"message\") return \"onmessage\";\n\tif (type === \"error\") return \"onerror\";\n\treturn \"onclose\";\n}\n\nfunction addRealtimeSocketListener(\n\tsocket: WebSocket,\n\ttype: SocketEventType,\n\thandler: (event: Event | MessageEvent | CloseEvent) => void,\n): () => void {\n\tif (\n\t\ttypeof socket.addEventListener === \"function\" &&\n\t\ttypeof socket.removeEventListener === \"function\"\n\t) {\n\t\tconst listener = handler as EventListener;\n\t\tsocket.addEventListener(type, listener);\n\t\treturn () => socket.removeEventListener(type, listener);\n\t}\n\tconst property = getSocketHandlerProperty(type);\n\tconst handlerSocket = socket as WebSocket & {\n\t\tonopen: ((event: Event) => void) | null;\n\t\tonmessage: ((event: MessageEvent) => void) | null;\n\t\tonerror: ((event: Event) => void) | null;\n\t\tonclose: ((event: CloseEvent) => void) | null;\n\t};\n\tif (property === \"onopen\") {\n\t\tconst previous = handlerSocket.onopen;\n\t\thandlerSocket.onopen = (event) => handler(event);\n\t\treturn () => {\n\t\t\thandlerSocket.onopen = previous;\n\t\t};\n\t}\n\tif (property === \"onmessage\") {\n\t\tconst previous = handlerSocket.onmessage;\n\t\thandlerSocket.onmessage = (event) => handler(event);\n\t\treturn () => {\n\t\t\thandlerSocket.onmessage = previous;\n\t\t};\n\t}\n\tif (property === \"onerror\") {\n\t\tconst previous = handlerSocket.onerror;\n\t\thandlerSocket.onerror = (event) => handler(event);\n\t\treturn () => {\n\t\t\thandlerSocket.onerror = previous;\n\t\t};\n\t}\n\tconst previous = handlerSocket.onclose;\n\thandlerSocket.onclose = (event) => handler(event);\n\treturn () => {\n\t\thandlerSocket.onclose = previous;\n\t};\n}\n\nfunction createClientId(): string {\n\tif (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n\t\treturn crypto.randomUUID();\n\t}\n\treturn `client-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction normalizeSocketUrl(input: string): string {\n\tif (!input) return \"\";\n\tif (input.startsWith(\"ws://\") || input.startsWith(\"wss://\")) return input;\n\tif (input.startsWith(\"http://\")) return `ws://${input.slice(\"http://\".length)}`;\n\tif (input.startsWith(\"https://\")) return `wss://${input.slice(\"https://\".length)}`;\n\tif (input.startsWith(\"/\")) {\n\t\tconst location = globalThis.location;\n\t\tif (!location) return \"\";\n\t\tconst protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\treturn `${protocol}//${location.host}${input}`;\n\t}\n\treturn input;\n}\n\nfunction isValidSocketUrl(input: string): boolean {\n\tif (!input || input.includes(\"<\") || input.includes(\">\")) return false;\n\ttry {\n\t\tconst parsed = new URL(input);\n\t\treturn parsed.protocol === \"ws:\" || parsed.protocol === \"wss:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction sanitizeRealtimeItem(item: VectorSceneItem): VectorSceneItem {\n\tif (item.toolKind !== \"image\") return item;\n\treturn {\n\t\t...item,\n\t\timageBlobId: undefined,\n\t\timageThumbnailBlobId: undefined,\n\t\timageRasterHref: undefined,\n\t\timageThumbnailHref: undefined,\n\t\tchildrenSvg: \"\",\n\t};\n}\n\nfunction sanitizeRealtimeItems(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\treturn items.map(sanitizeRealtimeItem);\n}\n\nfunction sanitizeRealtimeSnapshot(\n\tsnapshot: RealtimeDocumentSnapshot,\n): RealtimeDocumentSnapshot {\n\treturn {\n\t\t...snapshot,\n\t\titems: sanitizeRealtimeItems(snapshot.items),\n\t};\n}\n\nfunction serializeItems(items: VectorSceneItem[]): string | null {\n\ttry {\n\t\treturn JSON.stringify(sanitizeRealtimeItems(items));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction sameSerializedItems(\n\tleft: VectorSceneItem[] | null | undefined,\n\tright: VectorSceneItem[] | null | undefined,\n): boolean {\n\tif (left === right) return true;\n\tif (!left || !right) return false;\n\tconst leftJson = serializeItems(left);\n\tconst rightJson = serializeItems(right);\n\treturn leftJson != null && leftJson === rightJson;\n}\n\nfunction nowMs(): number {\n\treturn Date.now();\n}\n\nexport function shouldUpdateRealtimeConnectionMessageState(input: {\n\treadonly lastStateUpdateAt: number | null;\n\treadonly receivedAt: number;\n}): boolean {\n\treturn (\n\t\tinput.lastStateUpdateAt == null ||\n\t\tinput.receivedAt - input.lastStateUpdateAt >=\n\t\t\tCONNECTION_MESSAGE_STATE_UPDATE_INTERVAL_MS\n\t);\n}\n\nfunction hasDurableDocumentPersistence(snapshot: RealtimeDocumentSnapshot): boolean {\n\treturn (\n\t\tsnapshot.persistedRevision == null ||\n\t\tsnapshot.persistedRevision >= snapshot.revision\n\t);\n}\n\nfunction draftStorageKey(roomId: string): string {\n\treturn `${DRAFT_STORAGE_PREFIX}${roomId}`;\n}\n\nfunction isRealtimeOfflineDraft(value: unknown): value is RealtimeOfflineDraft {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst record = value as Record<string, unknown>;\n\tif (\n\t\ttypeof record.roomId !== \"string\" ||\n\t\ttypeof record.baseRevision !== \"number\" ||\n\t\ttypeof record.updatedAt !== \"number\" ||\n\t\t!Array.isArray(record.items)\n\t) {\n\t\treturn false;\n\t}\n\tif (record.yDocState != null && typeof record.yDocState !== \"string\") {\n\t\treturn false;\n\t}\n\tif (record.pendingIds != null && !Array.isArray(record.pendingIds)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nasync function readRealtimeOfflineDraft(\n\troomId: string,\n\tstorage: RealtimeDraftStorage | null,\n): Promise<RealtimeOfflineDraft | null> {\n\tif (!storage || !roomId) return null;\n\ttry {\n\t\tconst raw = await storage.getItem(draftStorageKey(roomId));\n\t\tif (!raw) return null;\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (!isRealtimeOfflineDraft(parsed)) return null;\n\t\treturn {\n\t\t\t...parsed,\n\t\t\titems: sanitizeRealtimeItems(parsed.items),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeRealtimeOfflineDraft(\n\tdraft: RealtimeOfflineDraft | null,\n\tstorage: RealtimeDraftStorage | null,\n): Promise<void> {\n\tif (!storage) return;\n\tif (!draft) return;\n\ttry {\n\t\tawait storage.setItem(\n\t\t\tdraftStorageKey(draft.roomId),\n\t\t\tJSON.stringify({\n\t\t\t\t...draft,\n\t\t\t\titems: sanitizeRealtimeItems(draft.items),\n\t\t\t}),\n\t\t);\n\t} catch {}\n}\n\nasync function removeRealtimeOfflineDraft(\n\troomId: string,\n\tstorage: RealtimeDraftStorage | null,\n): Promise<void> {\n\tif (!storage || !roomId) return;\n\ttry {\n\t\tawait storage.removeItem(draftStorageKey(roomId));\n\t} catch {}\n}\n\nfunction getViewportCameraSnapshot(\n\tviewport: RealtimeViewportHandle | null | undefined,\n): RealtimeSessionPeer[\"camera\"] | null {\n\tif (!viewport) return null;\n\tconst camera = viewport.getCamera();\n\tif (!camera) return null;\n\tconst viewportSize = viewport.getViewportSize();\n\treturn {\n\t\tx: camera.x,\n\t\ty: camera.y,\n\t\tzoom: camera.zoom,\n\t\tviewportWidth: viewportSize.width,\n\t\tviewportHeight: viewportSize.height,\n\t};\n}\n\nfunction prepareRealtimeItems(\n\titems: readonly VectorSceneItem[],\n): { items: VectorSceneItem[]; serialized: string } | null {\n\ttry {\n\t\tconst sanitizedItems = sanitizeRealtimeItems(items);\n\t\treturn {\n\t\t\titems: sanitizedItems,\n\t\t\tserialized: JSON.stringify(sanitizedItems),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction getRealtimeItemId(item: VectorSceneItem): string | null {\n\tconst id = (item as { id?: unknown }).id;\n\treturn typeof id === \"string\" ? id : null;\n}\n\nfunction serializeRealtimeItem(item: VectorSceneItem): string | null {\n\ttry {\n\t\treturn JSON.stringify(sanitizeRealtimeItem(item));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction resolvePendingDraftItemIds(\n\tboard: YjsBoardDoc,\n\titems: readonly VectorSceneItem[],\n): string[] | undefined {\n\tconst pendingIds = new Set<string>();\n\tfor (const item of items) {\n\t\tconst id = getRealtimeItemId(item);\n\t\tif (!id) continue;\n\t\tconst confirmedSerialized = board.lastServerConfirmedItemSerializations.get(id);\n\t\tconst serialized = serializeRealtimeItem(item);\n\t\tif (!confirmedSerialized || !serialized || serialized !== confirmedSerialized) {\n\t\t\tpendingIds.add(id);\n\t\t}\n\t}\n\treturn pendingIds.size > 0 ? Array.from(pendingIds) : undefined;\n}\n\nfunction remoteMarkupStrokeFromPlacementPreview(\n\tpreview: RealtimePlacementPreview | null,\n): RealtimeSessionPeer[\"markupStroke\"] | null {\n\tif (!preview || preview.kind !== \"stroke\" || preview.points.length === 0) {\n\t\treturn null;\n\t}\n\tconst style = preview.style;\n\treturn {\n\t\tpoints: preview.points,\n\t\ttool: preview.tool,\n\t\t...(style?.strokeWidth != null ? { strokeWidth: style.strokeWidth } : {}),\n\t\t...(style?.stroke ? { stroke: style.stroke } : {}),\n\t\t...(style?.strokeOpacity != null ? { strokeOpacity: style.strokeOpacity } : {}),\n\t};\n}\n\nexport function useRealtimeSession(\n\toptions: UseRealtimeSessionOptions,\n): UseRealtimeSessionResult {\n\tconst {\n\t\turl,\n\t\troomId,\n\t\tpeer,\n\t\tenabled = true,\n\t\tdraftStorage = createBrowserDraftStorage(),\n\t\treconnect = true,\n\t\theartbeatMs = 10_000,\n\t\tmaxReconnectDelayMs = 12_000,\n\t\tinitialReconnectDelayMs = 800,\n\t\tconnectTimeoutMs = 10_000,\n\t\tonError,\n\t} = options;\n\n\tconst clientIdRef = useRef(peer.clientId ?? createClientId());\n\tconst wsRef = useRef<WebSocket | null>(null);\n\tconst reconnectTimerRef = useRef<TimeoutHandle | null>(null);\n\tconst heartbeatTimerRef = useRef<IntervalHandle | null>(null);\n\tconst connectTimeoutRef = useRef<TimeoutHandle | null>(null);\n\tconst documentFlushTimerRef = useRef<TimeoutHandle | null>(null);\n\tconst documentFlushIdleRef = useRef<IdleCallbackHandle | null>(null);\n\tconst draftPersistTimerRef = useRef<TimeoutHandle | null>(null);\n\tconst draftPersistIdleRef = useRef<IdleCallbackHandle | null>(null);\n\tconst draftStorageRef = useRef<RealtimeDraftStorage | null>(draftStorage);\n\tdraftStorageRef.current = draftStorage;\n\tconst manualDisconnectRef = useRef(false);\n\tconst retryCountRef = useRef(0);\n\tconst currentRevisionRef = useRef(0);\n\tconst outboundInFlightRef = useRef<{\n\t\tbaseRevision: number;\n\t\titems: VectorSceneItem[];\n\t\tserialized: string | null;\n\t} | null>(null);\n\tconst queuedDirtyRef = useRef(false);\n\t// Latest items snapshot the consumer wants to push, captured by\n\t// queueDocumentSend at potentially 60fps. The expensive merge into the\n\t// Y.Doc, projection, encoding and React state updates are all deferred\n\t// to flushQueuedDocument so the input thread on iPad isn't saturated\n\t// during continuous drawing.\n\tconst pendingLocalItemsRef = useRef<VectorSceneItem[] | null>(null);\n\tconst subscriberRefs = useRef(new Set<(items: VectorSceneItem[]) => void>());\n\tconst boardRef = useRef<YjsBoardDoc | null>(null);\n\tif (boardRef.current == null) {\n\t\tboardRef.current = createYjsBoardDoc();\n\t}\n\tconst lastCursorRef = useRef<{ x: number; y: number } | null>(null);\n\tconst lastMarkupStrokeRef = useRef<\n\t\tRealtimeSessionPeer[\"markupStroke\"] | null | undefined\n\t>(null);\n\tconst lastCameraRef = useRef<RealtimeSessionPeer[\"camera\"] | null | undefined>(\n\t\tnull,\n\t);\n\tconst lastActiveToolRef = useRef<string | undefined>(undefined);\n\tconst latestDocumentRef = useRef<RealtimeDocumentSnapshot | null>(null);\n\tconst connectionStateRef = useRef<RealtimeConnectionInfo[\"state\"]>(\n\t\tenabled ? \"connecting\" : \"offline\",\n\t);\n\tconst lastConnectionMessageStateUpdateAtRef = useRef<number | null>(null);\n\tconst localDraftRef = useRef<RealtimeOfflineDraft | null>(null);\n\tconst conflictRef = useRef<RealtimeDocumentConflict | null>(null);\n\tconst onErrorRef = useRef(onError);\n\tonErrorRef.current = onError;\n\n\tconst [connectSequence, setConnectSequence] = useState(0);\n\tconst [connection, setConnection] = useState<RealtimeConnectionInfo>({\n\t\tstate: enabled ? \"connecting\" : \"offline\",\n\t\tconnected: false,\n\t\troomId,\n\t\tclientId: null,\n\t\tretryCount: 0,\n\t\tlastConnectedAt: null,\n\t\tlastMessageAt: null,\n\t\tlastPongAt: null,\n\t\tlastError: null,\n\t});\n\tconst [sessionPeers, setSessionPeers] = useState<RealtimeSessionPeer[]>([]);\n\tconst [document, setDocument] = useState<RealtimeDocumentSnapshot | null>(null);\n\tconst [hasLocalOfflineDraft, setHasLocalOfflineDraft] = useState(false);\n\tconst [hasPendingDocumentSync, setHasPendingDocumentSync] = useState(false);\n\tconst [conflict, setConflict] = useState<RealtimeDocumentConflict | null>(null);\n\tconnectionStateRef.current = connection.state;\n\n\tconst syncState = useMemo<RealtimeSyncState>(() => {\n\t\tif (conflict != null) return \"conflicted\";\n\t\tif (connection.connected) return \"connected\";\n\t\tif (connection.state === \"reconnecting\" || connection.state === \"connecting\") {\n\t\t\treturn \"reconnecting\";\n\t\t}\n\t\treturn \"offline\";\n\t}, [conflict, connection.connected, connection.state]);\n\n\tconst clearReconnectTimer = useCallback(() => {\n\t\tif (reconnectTimerRef.current != null) {\n\t\t\tglobalThis.clearTimeout(reconnectTimerRef.current);\n\t\t\treconnectTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst clearHeartbeatTimer = useCallback(() => {\n\t\tif (heartbeatTimerRef.current != null) {\n\t\t\tglobalThis.clearInterval(heartbeatTimerRef.current);\n\t\t\theartbeatTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst clearConnectTimeout = useCallback(() => {\n\t\tif (connectTimeoutRef.current != null) {\n\t\t\tglobalThis.clearTimeout(connectTimeoutRef.current);\n\t\t\tconnectTimeoutRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst clearDocumentFlushSchedule = useCallback(() => {\n\t\tif (documentFlushTimerRef.current != null) {\n\t\t\tglobalThis.clearTimeout(documentFlushTimerRef.current);\n\t\t\tdocumentFlushTimerRef.current = null;\n\t\t}\n\t\tcancelRuntimeIdleCallback(documentFlushIdleRef.current);\n\t\tdocumentFlushIdleRef.current = null;\n\t}, []);\n\n\tconst clearDraftPersistSchedule = useCallback(() => {\n\t\tif (draftPersistTimerRef.current != null) {\n\t\t\tglobalThis.clearTimeout(draftPersistTimerRef.current);\n\t\t\tdraftPersistTimerRef.current = null;\n\t\t}\n\t\tcancelRuntimeIdleCallback(draftPersistIdleRef.current);\n\t\tdraftPersistIdleRef.current = null;\n\t}, []);\n\n\tconst updateConnection = useCallback(\n\t\t(\n\t\t\tpatch:\n\t\t\t\t| Partial<RealtimeConnectionInfo>\n\t\t\t\t| ((prev: RealtimeConnectionInfo) => RealtimeConnectionInfo),\n\t\t) => {\n\t\t\tsetConnection((prev) => {\n\t\t\t\tif (typeof patch === \"function\") return patch(prev);\n\t\t\t\treturn { ...prev, ...patch };\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst notifySubscribers = useCallback((items: VectorSceneItem[]) => {\n\t\tfor (const subscriber of subscriberRefs.current) {\n\t\t\tsubscriber(items);\n\t\t}\n\t}, []);\n\n\t// applyDocument merges a snapshot into the local Y.Doc. When `replace` is\n\t// true (used for the very first bootstrap when we have no local items), the\n\t// Y.Doc is reset to exactly the snapshot. Otherwise applyServerSnapshotToYDoc\n\t// runs the smart merge that preserves locally-pending items and respects\n\t// server-side deletes.\n\tconst applyDocument = useCallback(\n\t\t(\n\t\t\tsnapshot: RealtimeDocumentSnapshot,\n\t\t\toptions?: { suppressSubscriberNotify?: boolean; replace?: boolean },\n\t\t) => {\n\t\t\tconst currentSnapshot = latestDocumentRef.current;\n\t\t\tif (\n\t\t\t\tcurrentSnapshot &&\n\t\t\t\tcurrentSnapshot.revision === snapshot.revision &&\n\t\t\t\tcurrentSnapshot.updatedByClientId === snapshot.updatedByClientId &&\n\t\t\t\tcurrentSnapshot.persistedRevision === snapshot.persistedRevision &&\n\t\t\t\tsameSerializedItems(currentSnapshot.items, snapshot.items)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst board = boardRef.current;\n\t\t\tif (board) {\n\t\t\t\t// Drain any pending local items into the Y.Doc *before* applying\n\t\t\t\t// the server snapshot. queueDocumentSend only stashes the latest\n\t\t\t\t// items in pendingLocalItemsRef so the canvas hot path stays\n\t\t\t\t// cheap, but that means items the user just drew may not be in\n\t\t\t\t// the Y.Doc yet. If we merge the server snapshot first, the\n\t\t\t\t// projected items would be missing those local strokes and\n\t\t\t\t// trazo would receive a snapshot that wipes them from view\n\t\t\t\t// until the next flush round-trip echoes them back.\n\t\t\t\tif (!options?.replace) {\n\t\t\t\t\tconst pendingLocal = pendingLocalItemsRef.current;\n\t\t\t\t\tif (pendingLocal) {\n\t\t\t\t\t\tpendingLocalItemsRef.current = null;\n\t\t\t\t\t\tapplyLocalItemsToYDoc(board, {\n\t\t\t\t\t\t\titems: pendingLocal,\n\t\t\t\t\t\t\torigin: ORIGIN_LOCAL,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tqueuedDirtyRef.current = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (options?.replace) {\n\t\t\t\t\treplaceYDocWithSnapshot(board, {\n\t\t\t\t\t\titems: snapshot.items,\n\t\t\t\t\t\torigin: ORIGIN_REMOTE,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tapplyServerSnapshotToYDoc(board, {\n\t\t\t\t\t\titems: snapshot.items,\n\t\t\t\t\t\torigin: ORIGIN_REMOTE,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst mergedItems = board ? readVectorItems(board.yItems) : snapshot.items;\n\t\t\tconst mergedSnapshot: RealtimeDocumentSnapshot = {\n\t\t\t\t...snapshot,\n\t\t\t\titems: mergedItems,\n\t\t\t};\n\t\t\tcurrentRevisionRef.current = snapshot.revision;\n\t\t\tlatestDocumentRef.current = mergedSnapshot;\n\t\t\tsetDocument(mergedSnapshot);\n\t\t\tif (!options?.suppressSubscriberNotify) {\n\t\t\t\tnotifySubscribers(mergedItems);\n\t\t\t}\n\t\t},\n\t\t[notifySubscribers],\n\t);\n\n\tconst setConflictState = useCallback(\n\t\t(nextConflict: RealtimeDocumentConflict | null) => {\n\t\t\tconflictRef.current = nextConflict;\n\t\t\tsetConflict(nextConflict);\n\t\t},\n\t\t[],\n\t);\n\n\tconst setLocalDraft = useCallback(\n\t\t(nextDraft: RealtimeOfflineDraft | null) => {\n\t\t\tlocalDraftRef.current = nextDraft;\n\t\t\tsetHasLocalOfflineDraft(nextDraft != null);\n\t\t\tif (nextDraft) return;\n\t\t\tvoid removeRealtimeOfflineDraft(roomId, draftStorageRef.current);\n\t\t},\n\t\t[roomId],\n\t);\n\n\tconst persistLocalDraft = useCallback(() => {\n\t\tclearDraftPersistSchedule();\n\t\tif (!localDraftRef.current) {\n\t\t\tvoid removeRealtimeOfflineDraft(roomId, draftStorageRef.current);\n\t\t\treturn;\n\t\t}\n\t\t// Encode the Y.Doc state lazily, right before writing to localStorage,\n\t\t// so the expensive Y.encodeStateAsUpdate + base64 work stays out of\n\t\t// the per-flush hot path. flushQueuedDocument only updates the\n\t\t// in-memory draft (items + meta + pendingIds); the binary CRDT state\n\t\t// is materialised here on the debounced persistence schedule.\n\t\tconst board = boardRef.current;\n\t\tconst draft = localDraftRef.current;\n\t\tconst canEncodeYDocState =\n\t\t\tboard &&\n\t\t\tdraft.yDocState == null &&\n\t\t\tsameSerializedItems(readVectorItems(board.yItems), draft.items);\n\t\tconst draftToWrite = canEncodeYDocState\n\t\t\t? { ...draft, yDocState: encodeYDocState(board) }\n\t\t\t: draft;\n\t\tvoid writeRealtimeOfflineDraft(draftToWrite, draftStorageRef.current);\n\t}, [clearDraftPersistSchedule, roomId]);\n\n\tconst scheduleDraftPersistence = useCallback(() => {\n\t\tclearDraftPersistSchedule();\n\t\tdraftPersistTimerRef.current = globalThis.setTimeout(() => {\n\t\t\tdraftPersistTimerRef.current = null;\n\t\t\tdraftPersistIdleRef.current = requestRuntimeIdleCallback(() => {\n\t\t\t\tdraftPersistIdleRef.current = null;\n\t\t\t\tpersistLocalDraft();\n\t\t\t}, DRAFT_PERSIST_DEBOUNCE_MS);\n\t\t}, DRAFT_PERSIST_DEBOUNCE_MS);\n\t}, [clearDraftPersistSchedule, persistLocalDraft]);\n\n\tconst clearLocalDraft = useCallback(() => {\n\t\tsetLocalDraft(null);\n\t\tclearDraftPersistSchedule();\n\t}, [clearDraftPersistSchedule, setLocalDraft]);\n\n\tconst createSelfPeer = useCallback(\n\t\t(state: RealtimeConnectionInfo[\"state\"]): RealtimeSessionPeer => ({\n\t\t\tid: peer.id,\n\t\t\tclientId: clientIdRef.current,\n\t\t\tpeerId: peer.id,\n\t\t\troomId,\n\t\t\tjoinedAt: connection.lastConnectedAt ?? nowMs(),\n\t\t\tlastSeenAt: nowMs(),\n\t\t\tcursor: lastCursorRef.current,\n\t\t\tisSelf: true,\n\t\t\tconnectionState: state,\n\t\t\t...(peer.displayName ? { displayName: peer.displayName } : {}),\n\t\t\t...(peer.color ? { color: peer.color } : {}),\n\t\t\t...(peer.image ? { image: peer.image } : {}),\n\t\t\t...(lastMarkupStrokeRef.current !== undefined\n\t\t\t\t? { markupStroke: lastMarkupStrokeRef.current ?? null }\n\t\t\t\t: {}),\n\t\t\t...(lastCameraRef.current !== undefined\n\t\t\t\t? { camera: lastCameraRef.current ?? null }\n\t\t\t\t: {}),\n\t\t\t...(lastActiveToolRef.current\n\t\t\t\t? { activeTool: lastActiveToolRef.current }\n\t\t\t\t: {}),\n\t\t}),\n\t\t[\n\t\t\tconnection.lastConnectedAt,\n\t\t\tpeer.color,\n\t\t\tpeer.displayName,\n\t\t\tpeer.id,\n\t\t\tpeer.image,\n\t\t\troomId,\n\t\t],\n\t);\n\n\tconst collapsePeersToSelf = useCallback(\n\t\t(state: RealtimeConnectionInfo[\"state\"]) => {\n\t\t\tsetSessionPeers((prev) => {\n\t\t\t\tconst selfPeer = prev.find(\n\t\t\t\t\t(peerState) => peerState.clientId === clientIdRef.current,\n\t\t\t\t);\n\t\t\t\treturn [\n\t\t\t\t\tselfPeer\n\t\t\t\t\t\t? { ...selfPeer, isSelf: true, connectionState: state }\n\t\t\t\t\t\t: createSelfPeer(state),\n\t\t\t\t];\n\t\t\t});\n\t\t},\n\t\t[createSelfPeer],\n\t);\n\n\tconst applyPeers = useCallback((peers: RealtimeSessionPeer[]) => {\n\t\tconst selfClientId = clientIdRef.current;\n\t\tsetSessionPeers(\n\t\t\tpeers.map((peerState) =>\n\t\t\t\tpeerState.clientId === selfClientId\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...peerState,\n\t\t\t\t\t\t\tisSelf: true,\n\t\t\t\t\t\t\tconnectionState: connectionStateRef.current,\n\t\t\t\t\t\t}\n\t\t\t\t\t: peerState,\n\t\t\t),\n\t\t);\n\t}, []);\n\n\tconst buildClientMessage = useCallback(\n\t\t(message: RealtimeClientMessage): string => JSON.stringify(message),\n\t\t[],\n\t);\n\n\tconst sendRaw = useCallback(\n\t\t(message: RealtimeClientMessage): boolean => {\n\t\t\tconst ws = wsRef.current;\n\t\t\tconst WebSocketConstructor = globalThis.WebSocket;\n\t\t\tif (!ws || !WebSocketConstructor) return false;\n\t\t\tif (ws.readyState !== WebSocketConstructor.OPEN) return false;\n\t\t\tws.send(buildClientMessage(message));\n\t\t\treturn true;\n\t\t},\n\t\t[buildClientMessage],\n\t);\n\n\tconst flushQueuedDocument = useCallback(() => {\n\t\tclearDocumentFlushSchedule();\n\t\tconst board = boardRef.current;\n\t\tif (!board) return;\n\t\tif (!queuedDirtyRef.current && pendingLocalItemsRef.current == null) return;\n\t\tif (outboundInFlightRef.current) return;\n\t\t// Heavy work deferred from queueDocumentSend: apply the latest local\n\t\t// items snapshot the consumer pushed (possibly accumulated over many\n\t\t// 60fps onItemsChange firings) into the Y.Doc once.\n\t\tconst pendingLocal = pendingLocalItemsRef.current;\n\t\tif (pendingLocal) {\n\t\t\tpendingLocalItemsRef.current = null;\n\t\t\tapplyLocalItemsToYDoc(board, {\n\t\t\t\titems: pendingLocal,\n\t\t\t\torigin: ORIGIN_LOCAL,\n\t\t\t});\n\t\t}\n\t\tconst baseRevision = currentRevisionRef.current;\n\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\tconst preparedItems = prepareRealtimeItems(mergedItems);\n\t\tif (!preparedItems) return;\n\t\tqueuedDirtyRef.current = false;\n\t\toutboundInFlightRef.current = {\n\t\t\tbaseRevision,\n\t\t\titems: preparedItems.items,\n\t\t\tserialized: preparedItems.serialized,\n\t\t};\n\t\tconst didSend = sendRawRef.current({\n\t\t\ttype: \"document:update\",\n\t\t\troomId,\n\t\t\tclientId: clientIdRef.current,\n\t\t\tbaseRevision,\n\t\t\titems: preparedItems.items,\n\t\t});\n\t\t// Refresh the offline draft with the post-merge state. Doing this\n\t\t// here (~8x/sec at flush rate) instead of on every queueDocumentSend\n\t\t// avoids encoding the full Y.Doc and triggering React state churn at\n\t\t// 60fps during drawing.\n\t\tconst pendingIds = getLocallyPendingItemIds(board);\n\t\tif (pendingIds.size > 0) {\n\t\t\t// Don't encode the Y.Doc here — persistLocalDraft materialises it\n\t\t\t// lazily so this hot path stays cheap during 60fps drawing.\n\t\t\tsetLocalDraftRef.current({\n\t\t\t\troomId,\n\t\t\t\tbaseRevision,\n\t\t\t\titems: mergedItems,\n\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\tpendingIds: Array.from(pendingIds),\n\t\t\t});\n\t\t\tscheduleDraftPersistenceRef.current?.();\n\t\t}\n\t\tif (!didSend) {\n\t\t\tqueuedDirtyRef.current = true;\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tsetHasPendingDocumentSync(true);\n\t\t}\n\t}, [clearDocumentFlushSchedule, roomId]);\n\n\tconst scheduleDocumentFlush = useCallback(() => {\n\t\tclearDocumentFlushSchedule();\n\t\tdocumentFlushTimerRef.current = globalThis.setTimeout(() => {\n\t\t\tdocumentFlushTimerRef.current = null;\n\t\t\tdocumentFlushIdleRef.current = requestRuntimeIdleCallback(() => {\n\t\t\t\tdocumentFlushIdleRef.current = null;\n\t\t\t\tflushQueuedDocument();\n\t\t\t}, DOCUMENT_FLUSH_DEBOUNCE_MS);\n\t\t}, DOCUMENT_FLUSH_DEBOUNCE_MS);\n\t}, [clearDocumentFlushSchedule, flushQueuedDocument]);\n\n\t// queueDocumentSend is on the canvas hot path — invoked at up to 60fps\n\t// during continuous drawing. Keep it O(1): just stash the latest items\n\t// snapshot and schedule a flush. All Y.Doc mutations, projection,\n\t// encoding and React state updates are amortised across the flush\n\t// window (DOCUMENT_FLUSH_DEBOUNCE_MS) inside flushQueuedDocument.\n\tconst queueDocumentSend = useCallback(\n\t\t(items: VectorSceneItem[]) => {\n\t\t\tpendingLocalItemsRef.current = items;\n\t\t\tqueuedDirtyRef.current = true;\n\t\t\tsetHasPendingDocumentSync(true);\n\t\t\tsetHasLocalOfflineDraft(true);\n\t\t\tconst board = boardRef.current;\n\t\t\tconst draftItems = sanitizeRealtimeItems(items);\n\t\t\tsetLocalDraftRef.current({\n\t\t\t\troomId,\n\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\titems: draftItems,\n\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\tpendingIds: board\n\t\t\t\t\t? resolvePendingDraftItemIds(board, draftItems)\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tscheduleDraftPersistenceRef.current?.();\n\t\t\tscheduleDocumentFlushRef.current();\n\t\t},\n\t\t[roomId],\n\t);\n\n\t// Bootstrap the Y.Doc from a persisted draft. When the draft has a binary\n\t// yDocState (new format), we decode it directly to preserve CRDT history\n\t// and pending-id tracking. For legacy drafts (items only), we replace the\n\t// Y.Doc with the items array and conservatively mark every item as still\n\t// \"pending server confirmation\" — the next server snapshot will reconcile.\n\tconst applyDraftSnapshot = useCallback(\n\t\t(\n\t\t\tdraft: RealtimeOfflineDraft,\n\t\t\toptions?: { suppressSubscriberNotify?: boolean },\n\t\t) => {\n\t\t\tconst board = boardRef.current;\n\t\t\tif (board) {\n\t\t\t\tlet restoredFromBinary = false;\n\t\t\t\tif (draft.yDocState) {\n\t\t\t\t\tif (board.yItems.length > 0) {\n\t\t\t\t\t\tboard.doc.transact(() => {\n\t\t\t\t\t\t\tboard.yItems.delete(0, board.yItems.length);\n\t\t\t\t\t\t}, ORIGIN_BOOTSTRAP);\n\t\t\t\t\t}\n\t\t\t\t\trestoredFromBinary = decodeYDocState(board, draft.yDocState);\n\t\t\t\t\tif (restoredFromBinary) {\n\t\t\t\t\t\tconst allIds = new Set<string>();\n\t\t\t\t\t\tconst allItems = readVectorItems(board.yItems);\n\t\t\t\t\t\tfor (let i = 0; i < board.yItems.length; i++) {\n\t\t\t\t\t\t\tconst yMap = board.yItems.get(i);\n\t\t\t\t\t\t\tif (!yMap) continue;\n\t\t\t\t\t\t\tconst id = yMap.get(\"id\");\n\t\t\t\t\t\t\tif (typeof id === \"string\") allIds.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst pendingIds = new Set(draft.pendingIds ?? []);\n\t\t\t\t\t\tboard.lastServerConfirmedIds = new Set();\n\t\t\t\t\t\tboard.lastServerConfirmedItemSerializations = new Map();\n\t\t\t\t\t\tfor (const id of allIds) {\n\t\t\t\t\t\t\tif (!pendingIds.has(id)) {\n\t\t\t\t\t\t\t\tboard.lastServerConfirmedIds.add(id);\n\t\t\t\t\t\t\t\tconst item = allItems.find((candidate) => candidate.id === id);\n\t\t\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\t\t\tboard.lastServerConfirmedItemSerializations.set(\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(item),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!restoredFromBinary) {\n\t\t\t\t\treplaceYDocWithSnapshot(board, {\n\t\t\t\t\t\titems: draft.items,\n\t\t\t\t\t\torigin: ORIGIN_BOOTSTRAP,\n\t\t\t\t\t});\n\t\t\t\t\t// Legacy draft: no record of which ids were already confirmed by the\n\t\t\t\t\t// server. Mark all as pending so the next server snapshot can\n\t\t\t\t\t// reconcile correctly (additive merge will preserve them, and any\n\t\t\t\t\t// server-deleted ids will simply not be in lastServerConfirmedIds\n\t\t\t\t\t// to be re-added).\n\t\t\t\t\tboard.lastServerConfirmedIds = new Set();\n\t\t\t\t\tboard.lastServerConfirmedItemSerializations = new Map();\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst items = board ? readVectorItems(board.yItems) : draft.items;\n\t\t\tconst snapshot: RealtimeDocumentSnapshot = {\n\t\t\t\trevision: draft.baseRevision,\n\t\t\t\titems,\n\t\t\t\tupdatedAt: draft.updatedAt,\n\t\t\t\tupdatedByClientId: clientIdRef.current,\n\t\t\t};\n\t\t\tcurrentRevisionRef.current = snapshot.revision;\n\t\t\tlatestDocumentRef.current = snapshot;\n\t\t\tsetDocument(snapshot);\n\t\t\tif (!options?.suppressSubscriberNotify) {\n\t\t\t\tnotifySubscribers(items);\n\t\t\t}\n\t\t},\n\t\t[notifySubscribers],\n\t);\n\n\t// With Yjs as the source of truth, conflicts no longer exist as a concept.\n\t// Every server snapshot is merged into the Y.Doc; locally-added items that\n\t// the server has not yet seen are preserved, and items the server deleted\n\t// (i.e. id was in the previous server snapshot but is absent now) are\n\t// removed. The legacy \"keep-local vs use-server\" choice is gone.\n\t//\n\t// Returns true when the local Y.Doc still has pending items the server\n\t// hasn't seen after the merge (so the caller knows to re-schedule a flush).\n\tconst resolveAuthoritativeDocument = useCallback(\n\t\t(\n\t\t\tserverDocument: RealtimeDocumentSnapshot,\n\t\t\toptions?: { suppressSubscriberNotify?: boolean },\n\t\t): boolean => {\n\t\t\tconst board = boardRef.current;\n\t\t\tconst hadLocalContent =\n\t\t\t\tlocalDraftRef.current != null || (board != null && board.yItems.length > 0);\n\n\t\t\tapplyDocument(serverDocument, {\n\t\t\t\t...options,\n\t\t\t\treplace: !hadLocalContent,\n\t\t\t});\n\n\t\t\tif (!board) {\n\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\tclearLocalDraftRef.current();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst pendingIds = getLocallyPendingItemIds(board);\n\t\t\tif (pendingIds.size === 0) {\n\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\tqueuedDirtyRef.current = false;\n\t\t\t\tif (hasDurableDocumentPersistence(serverDocument)) {\n\t\t\t\t\tclearLocalDraftRef.current();\n\t\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\t\t\tsetLocalDraft({\n\t\t\t\t\troomId,\n\t\t\t\t\tbaseRevision: serverDocument.revision,\n\t\t\t\t\titems: mergedItems,\n\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\tpendingIds: [],\n\t\t\t\t});\n\t\t\t\tsetHasPendingDocumentSync(true);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\t\tsetLocalDraft({\n\t\t\t\troomId,\n\t\t\t\tbaseRevision: serverDocument.revision,\n\t\t\t\titems: mergedItems,\n\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\tpendingIds: Array.from(pendingIds),\n\t\t\t});\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tqueuedDirtyRef.current = true;\n\t\t\tsetHasPendingDocumentSync(true);\n\t\t\tscheduleDocumentFlush();\n\t\t\treturn true;\n\t\t},\n\t\t[applyDocument, roomId, scheduleDocumentFlush, setLocalDraft],\n\t);\n\n\tconst sendPresenceUpdate = useCallback(() => {\n\t\tsendRaw({\n\t\t\ttype: \"presence:update\",\n\t\t\troomId,\n\t\t\tclientId: clientIdRef.current,\n\t\t\tpresence: {\n\t\t\t\tcursor: lastCursorRef.current,\n\t\t\t\tmarkupStroke: lastMarkupStrokeRef.current ?? null,\n\t\t\t\tcamera: lastCameraRef.current ?? null,\n\t\t\t\t...(lastActiveToolRef.current\n\t\t\t\t\t? { activeTool: lastActiveToolRef.current }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t});\n\t}, [roomId, sendRaw]);\n\n\tconst scheduleReconnect = useCallback(() => {\n\t\tif (!reconnect || manualDisconnectRef.current) return;\n\t\tclearReconnectTimer();\n\t\tretryCountRef.current += 1;\n\t\tconst delay = Math.min(\n\t\t\tmaxReconnectDelayMs,\n\t\t\tinitialReconnectDelayMs * 2 ** Math.max(0, retryCountRef.current - 1),\n\t\t);\n\t\tupdateConnection((prev) => ({\n\t\t\t...prev,\n\t\t\tstate: \"reconnecting\",\n\t\t\tconnected: false,\n\t\t\tretryCount: retryCountRef.current,\n\t\t}));\n\t\treconnectTimerRef.current = globalThis.setTimeout(() => {\n\t\t\tsetConnectSequence((value) => value + 1);\n\t\t}, delay);\n\t}, [\n\t\tclearReconnectTimer,\n\t\tinitialReconnectDelayMs,\n\t\tmaxReconnectDelayMs,\n\t\treconnect,\n\t\tupdateConnection,\n\t]);\n\n\t// Kept for API back-compat with consumers that still call resolveConflict.\n\t// Yjs handles merge automatically inside resolveAuthoritativeDocument, so\n\t// `conflict` is always null and this becomes a no-op. We accept the action\n\t// argument silently so callers don't break.\n\tconst resolveConflict = useCallback((_action: \"keep-local\" | \"use-server\") => {\n\t\tvoid _action;\n\t}, []);\n\n\tconst setConflictStateRef = useRef(setConflictState);\n\tsetConflictStateRef.current = setConflictState;\n\tconst updateConnectionRef = useRef(updateConnection);\n\tupdateConnectionRef.current = updateConnection;\n\tconst applyDocumentRef = useRef(applyDocument);\n\tapplyDocumentRef.current = applyDocument;\n\tconst clearLocalDraftRef = useRef(clearLocalDraft);\n\tclearLocalDraftRef.current = clearLocalDraft;\n\tconst collapsePeersToSelfRef = useRef(collapsePeersToSelf);\n\tcollapsePeersToSelfRef.current = collapsePeersToSelf;\n\tconst applyPeersRef = useRef(applyPeers);\n\tapplyPeersRef.current = applyPeers;\n\tconst resolveAuthoritativeDocumentRef = useRef(resolveAuthoritativeDocument);\n\tresolveAuthoritativeDocumentRef.current = resolveAuthoritativeDocument;\n\tconst scheduleDocumentFlushRef = useRef(scheduleDocumentFlush);\n\tscheduleDocumentFlushRef.current = scheduleDocumentFlush;\n\tconst scheduleReconnectRef = useRef(scheduleReconnect);\n\tscheduleReconnectRef.current = scheduleReconnect;\n\tconst sendRawRef = useRef(sendRaw);\n\tsendRawRef.current = sendRaw;\n\tconst setLocalDraftRef = useRef(setLocalDraft);\n\tsetLocalDraftRef.current = setLocalDraft;\n\tconst scheduleDraftPersistenceRef = useRef(scheduleDraftPersistence);\n\tscheduleDraftPersistenceRef.current = scheduleDraftPersistence;\n\tconst persistLocalDraftRef = useRef(persistLocalDraft);\n\tpersistLocalDraftRef.current = persistLocalDraft;\n\n\tuseEffect(() => {\n\t\tconst runtimeWindow = globalThis.window;\n\t\tconst runtimeDocument = runtimeWindow?.document;\n\t\tif (!runtimeWindow || !runtimeDocument) return;\n\t\tconst persistDraft = () => {\n\t\t\tpersistLocalDraftRef.current();\n\t\t};\n\t\tconst handleVisibilityChange = () => {\n\t\t\tif (runtimeDocument.visibilityState === \"hidden\") persistDraft();\n\t\t};\n\t\truntimeWindow.addEventListener(\"pagehide\", persistDraft);\n\t\truntimeDocument.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\t\treturn () => {\n\t\t\truntimeWindow.removeEventListener(\"pagehide\", persistDraft);\n\t\t\truntimeDocument.removeEventListener(\n\t\t\t\t\"visibilitychange\",\n\t\t\t\thandleVisibilityChange,\n\t\t\t);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tif (boardRef.current) {\n\t\t\tboardRef.current.doc.destroy();\n\t\t}\n\t\tboardRef.current = createYjsBoardDoc();\n\t\tif (!roomId) {\n\t\t\tclearDocumentFlushSchedule();\n\t\t\tclearDraftPersistSchedule();\n\t\t\tlocalDraftRef.current = null;\n\t\t\tsetHasLocalOfflineDraft(false);\n\t\t\tsetHasPendingDocumentSync(false);\n\t\t\tsetConflictState(null);\n\t\t\tqueuedDirtyRef.current = false;\n\t\t\tpendingLocalItemsRef.current = null;\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tlatestDocumentRef.current = null;\n\t\t\tsetDocument(null);\n\t\t\tcurrentRevisionRef.current = 0;\n\t\t\treturn;\n\t\t}\n\t\tsetConflictState(null);\n\t\tpendingLocalItemsRef.current = null;\n\t\toutboundInFlightRef.current = null;\n\t\tvoid readRealtimeOfflineDraft(roomId, draftStorageRef.current).then(\n\t\t\t(localDraft) => {\n\t\t\t\tif (cancelled) return;\n\t\t\t\tsetLocalDraft(localDraft);\n\t\t\t\tsetHasPendingDocumentSync(localDraft != null);\n\t\t\t\tqueuedDirtyRef.current = localDraft != null;\n\t\t\t\tif (localDraft) {\n\t\t\t\t\tapplyDraftSnapshot(localDraft, {\n\t\t\t\t\t\tsuppressSubscriberNotify: sameSerializedItems(\n\t\t\t\t\t\t\tlatestDocumentRef.current?.items,\n\t\t\t\t\t\t\tlocalDraft.items,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatestDocumentRef.current = null;\n\t\t\t\tsetDocument(null);\n\t\t\t\tcurrentRevisionRef.current = 0;\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [\n\t\tapplyDraftSnapshot,\n\t\tclearDocumentFlushSchedule,\n\t\tclearDraftPersistSchedule,\n\t\troomId,\n\t\tsetConflictState,\n\t\tsetLocalDraft,\n\t]);\n\n\tuseEffect(() => {\n\t\tvoid connectSequence;\n\t\tif (!enabled) {\n\t\t\tmanualDisconnectRef.current = true;\n\t\t\tlastConnectionMessageStateUpdateAtRef.current = null;\n\t\t\tclearReconnectTimer();\n\t\t\tclearHeartbeatTimer();\n\t\t\tclearConnectTimeout();\n\t\t\tclearDocumentFlushSchedule();\n\t\t\twsRef.current?.close();\n\t\t\twsRef.current = null;\n\t\t\tqueuedDirtyRef.current = localDraftRef.current != null;\n\t\t\toutboundInFlightRef.current = null;\n\t\t\tsetHasPendingDocumentSync(localDraftRef.current != null);\n\t\t\tcollapsePeersToSelfRef.current(\"offline\");\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"offline\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tclientId: null,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tmanualDisconnectRef.current = false;\n\t\tconst socketUrl = normalizeSocketUrl(url);\n\t\tif (!socketUrl) {\n\t\t\tcollapsePeersToSelfRef.current(\"offline\");\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"offline\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tlastError: null,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\t\tif (!isValidSocketUrl(socketUrl)) {\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"error\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tlastError: \"URL de websocket invalida.\",\n\t\t\t}));\n\t\t\tonErrorRef.current?.(\"URL de websocket invalida.\");\n\t\t\treturn;\n\t\t}\n\t\tconst WebSocketConstructor = globalThis.WebSocket;\n\t\tif (!WebSocketConstructor) {\n\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tstate: \"error\",\n\t\t\t\tconnected: false,\n\t\t\t\troomId,\n\t\t\t\tlastError: \"WebSocket nao esta disponivel neste runtime.\",\n\t\t\t}));\n\t\t\tonErrorRef.current?.(\"WebSocket nao esta disponivel neste runtime.\");\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tlastConnectionMessageStateUpdateAtRef.current = null;\n\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t...prev,\n\t\t\tstate: retryCountRef.current > 0 ? \"reconnecting\" : \"connecting\",\n\t\t\tconnected: false,\n\t\t\troomId,\n\t\t\tlastError: null,\n\t\t}));\n\n\t\tconst socket = new WebSocketConstructor(socketUrl);\n\t\twsRef.current = socket;\n\t\tclearConnectTimeout();\n\t\tconnectTimeoutRef.current = globalThis.setTimeout(() => {\n\t\t\tif (socket.readyState === WebSocketConstructor.CONNECTING) {\n\t\t\t\tsocket.close();\n\t\t\t}\n\t\t}, connectTimeoutMs);\n\n\t\tconst removeSocketListeners = [\n\t\t\taddRealtimeSocketListener(socket, \"open\", () => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tclearConnectTimeout();\n\t\t\t\tsendRawRef.current({\n\t\t\t\t\ttype: \"session:join\",\n\t\t\t\t\troomId,\n\t\t\t\t\tpeer: {\n\t\t\t\t\t\tclientId: clientIdRef.current,\n\t\t\t\t\t\tpeerId: peer.id,\n\t\t\t\t\t\t...(peer.displayName ? { displayName: peer.displayName } : {}),\n\t\t\t\t\t\t...(peer.color ? { color: peer.color } : {}),\n\t\t\t\t\t\t...(peer.image ? { image: peer.image } : {}),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tclearHeartbeatTimer();\n\t\t\t\theartbeatTimerRef.current = globalThis.setInterval(() => {\n\t\t\t\t\tsendRawRef.current({\n\t\t\t\t\t\ttype: \"session:ping\",\n\t\t\t\t\t\troomId,\n\t\t\t\t\t\tclientId: clientIdRef.current,\n\t\t\t\t\t\tsentAt: nowMs(),\n\t\t\t\t\t});\n\t\t\t\t}, heartbeatMs);\n\t\t\t}),\n\n\t\t\taddRealtimeSocketListener(socket, \"message\", (event) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tif (!(\"data\" in event)) return;\n\t\t\t\tlet payload: unknown = event.data;\n\t\t\t\tif (typeof payload === \"string\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpayload = JSON.parse(payload);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst parsed = parseRealtimeServerMessage(payload);\n\t\t\t\tif (!parsed) return;\n\t\t\t\tconst receivedAt = nowMs();\n\t\t\t\tif (\n\t\t\t\t\tshouldUpdateRealtimeConnectionMessageState({\n\t\t\t\t\t\tlastStateUpdateAt: lastConnectionMessageStateUpdateAtRef.current,\n\t\t\t\t\t\treceivedAt,\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\tlastConnectionMessageStateUpdateAtRef.current = receivedAt;\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlastMessageAt: receivedAt,\n\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:welcome\") {\n\t\t\t\t\tretryCountRef.current = 0;\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tstate: \"connected\",\n\t\t\t\t\t\tconnected: true,\n\t\t\t\t\t\tclientId: parsed.clientId,\n\t\t\t\t\t\tretryCount: 0,\n\t\t\t\t\t\tlastConnectedAt: receivedAt,\n\t\t\t\t\t\tlastError: null,\n\t\t\t\t\t}));\n\t\t\t\t\tapplyPeersRef.current(parsed.peers);\n\t\t\t\t\tconst handledByDraft = resolveAuthoritativeDocumentRef.current(\n\t\t\t\t\t\tsanitizeRealtimeSnapshot(parsed.document),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsuppressSubscriberNotify:\n\t\t\t\t\t\t\t\tlocalDraftRef.current != null &&\n\t\t\t\t\t\t\t\tsameSerializedItems(\n\t\t\t\t\t\t\t\t\tlatestDocumentRef.current?.items,\n\t\t\t\t\t\t\t\t\tlocalDraftRef.current.items,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (!handledByDraft) {\n\t\t\t\t\t\tqueuedDirtyRef.current = false;\n\t\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\t\t}\n\t\t\t\t\tscheduleDocumentFlushRef.current();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"presence:sync\") {\n\t\t\t\t\tapplyPeersRef.current(parsed.peers);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:peer-joined\") {\n\t\t\t\t\tsetSessionPeers((prev) => {\n\t\t\t\t\t\tconst next = prev.filter(\n\t\t\t\t\t\t\t(peerState) => peerState.clientId !== parsed.peer.clientId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnext.push(\n\t\t\t\t\t\t\tparsed.peer.clientId === clientIdRef.current\n\t\t\t\t\t\t\t\t? { ...parsed.peer, isSelf: true }\n\t\t\t\t\t\t\t\t: parsed.peer,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:peer-left\") {\n\t\t\t\t\tsetSessionPeers((prev) =>\n\t\t\t\t\t\tprev.filter((peerState) => peerState.clientId !== parsed.clientId),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:pong\") {\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlastPongAt: parsed.serverTime,\n\t\t\t\t\t}));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"session:error\") {\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tstate: prev.connected ? prev.state : \"error\",\n\t\t\t\t\t\tlastError: parsed.message,\n\t\t\t\t\t}));\n\t\t\t\t\tonErrorRef.current?.(parsed.message);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"document:sync\") {\n\t\t\t\t\tconst selfClientId = clientIdRef.current;\n\t\t\t\t\tconst inFlight = outboundInFlightRef.current;\n\t\t\t\t\tconst isSelfAck = parsed.document.updatedByClientId === selfClientId;\n\t\t\t\t\tif (!isSelfAck) {\n\t\t\t\t\t\t// Update from another peer. Clear in-flight (server moved on, our\n\t\t\t\t\t\t// pending send will be re-flushed against the new revision) and\n\t\t\t\t\t\t// run the smart merge.\n\t\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\t\tresolveAuthoritativeDocumentRef.current(\n\t\t\t\t\t\t\tsanitizeRealtimeSnapshot(parsed.document),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Our own update was acked. Apply the canonical server view (with\n\t\t\t\t\t// any normalisation the server might have done) into the Y.Doc as\n\t\t\t\t\t// a smart merge — if we already drew more strokes during the round\n\t\t\t\t\t// trip, they survive as locally-pending.\n\t\t\t\t\tconst shouldSuppress =\n\t\t\t\t\t\tinFlight != null &&\n\t\t\t\t\t\tsameSerializedItems(inFlight.items, parsed.document.items);\n\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\tapplyDocumentRef.current(sanitizeRealtimeSnapshot(parsed.document), {\n\t\t\t\t\t\tsuppressSubscriberNotify: shouldSuppress,\n\t\t\t\t\t});\n\t\t\t\t\tconst board = boardRef.current;\n\t\t\t\t\tconst stillPending = board\n\t\t\t\t\t\t? getLocallyPendingItemIds(board).size > 0\n\t\t\t\t\t\t: false;\n\t\t\t\t\tif (stillPending) {\n\t\t\t\t\t\tconst mergedItems = board ? readVectorItems(board.yItems) : [];\n\t\t\t\t\t\tsetLocalDraftRef.current({\n\t\t\t\t\t\t\troomId,\n\t\t\t\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\t\t\t\titems: mergedItems,\n\t\t\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\t\t\tpendingIds: board\n\t\t\t\t\t\t\t\t? Array.from(getLocallyPendingItemIds(board))\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tqueuedDirtyRef.current = true;\n\t\t\t\t\t\tsetHasPendingDocumentSync(true);\n\t\t\t\t\t\tscheduleDocumentFlushRef.current();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueuedDirtyRef.current = false;\n\t\t\t\t\t\tif (hasDurableDocumentPersistence(parsed.document)) {\n\t\t\t\t\t\t\tclearLocalDraftRef.current();\n\t\t\t\t\t\t\tsetHasPendingDocumentSync(false);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst mergedItems = board ? readVectorItems(board.yItems) : [];\n\t\t\t\t\t\t\tsetLocalDraftRef.current({\n\t\t\t\t\t\t\t\troomId,\n\t\t\t\t\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\t\t\t\t\titems: mergedItems,\n\t\t\t\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\t\t\t\tpendingIds: [],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetHasPendingDocumentSync(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetConflictStateRef.current(null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.type === \"document:resync-required\") {\n\t\t\t\t\toutboundInFlightRef.current = null;\n\t\t\t\t\tqueuedDirtyRef.current = localDraftRef.current != null;\n\t\t\t\t\tsetHasPendingDocumentSync(queuedDirtyRef.current);\n\t\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tlastError: parsed.reason,\n\t\t\t\t\t}));\n\t\t\t\t\tresolveAuthoritativeDocumentRef.current(\n\t\t\t\t\t\tsanitizeRealtimeSnapshot(parsed.document),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}),\n\n\t\t\taddRealtimeSocketListener(socket, \"error\", () => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tstate: prev.connected ? prev.state : \"error\",\n\t\t\t\t\tlastError: \"Falha de conexão websocket.\",\n\t\t\t\t}));\n\t\t\t}),\n\n\t\t\taddRealtimeSocketListener(socket, \"close\", () => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tclearHeartbeatTimer();\n\t\t\t\tclearConnectTimeout();\n\t\t\t\twsRef.current = null;\n\t\t\t\tcollapsePeersToSelfRef.current(\n\t\t\t\t\tmanualDisconnectRef.current || !enabled ? \"offline\" : \"reconnecting\",\n\t\t\t\t);\n\t\t\t\tupdateConnectionRef.current((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tconnected: false,\n\t\t\t\t\tclientId: prev.clientId,\n\t\t\t\t\tstate: manualDisconnectRef.current || !enabled ? \"offline\" : prev.state,\n\t\t\t\t}));\n\t\t\t\tif (!manualDisconnectRef.current && enabled) {\n\t\t\t\t\tscheduleReconnectRef.current();\n\t\t\t\t}\n\t\t\t}),\n\t\t];\n\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tfor (const removeSocketListener of removeSocketListeners) {\n\t\t\t\tremoveSocketListener();\n\t\t\t}\n\t\t\tclearReconnectTimer();\n\t\t\tclearHeartbeatTimer();\n\t\t\tclearConnectTimeout();\n\t\t\tclearDocumentFlushSchedule();\n\t\t\tsocket.close();\n\t\t};\n\t}, [\n\t\tclearConnectTimeout,\n\t\tclearDocumentFlushSchedule,\n\t\tclearHeartbeatTimer,\n\t\tclearReconnectTimer,\n\t\tconnectSequence,\n\t\tconnectTimeoutMs,\n\t\tenabled,\n\t\theartbeatMs,\n\t\tpeer.color,\n\t\tpeer.displayName,\n\t\tpeer.id,\n\t\tpeer.image,\n\t\troomId,\n\t\turl,\n\t]);\n\n\tuseEffect(() => {\n\t\tsetSessionPeers((prev) =>\n\t\t\tprev.map((peerState) =>\n\t\t\t\tpeerState.clientId === clientIdRef.current\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...peerState,\n\t\t\t\t\t\t\tisSelf: true,\n\t\t\t\t\t\t\tconnectionState: connection.state,\n\t\t\t\t\t\t}\n\t\t\t\t\t: peerState,\n\t\t\t),\n\t\t);\n\t}, [connection.state]);\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tclearDocumentFlushSchedule();\n\t\t\tclearDraftPersistSchedule();\n\t\t\tif (boardRef.current) {\n\t\t\t\tboardRef.current.doc.destroy();\n\t\t\t\tboardRef.current = null;\n\t\t\t}\n\t\t},\n\t\t[clearDocumentFlushSchedule, clearDraftPersistSchedule],\n\t);\n\n\tconst flushDocumentSync = useCallback(async () => {\n\t\t// Manual flush (saveCurrentCanvas in trazo): drain pendingLocalItemsRef\n\t\t// into the Y.Doc and update the draft synchronously before persisting,\n\t\t// so the localStorage snapshot reflects the latest local changes even\n\t\t// when called while a previous send is still in-flight.\n\t\tconst board = boardRef.current;\n\t\tconst pendingLocal = pendingLocalItemsRef.current;\n\t\tif (board && pendingLocal) {\n\t\t\tpendingLocalItemsRef.current = null;\n\t\t\tapplyLocalItemsToYDoc(board, {\n\t\t\t\titems: pendingLocal,\n\t\t\t\torigin: ORIGIN_LOCAL,\n\t\t\t});\n\t\t\tconst mergedItems = readVectorItems(board.yItems);\n\t\t\tconst pendingIds = getLocallyPendingItemIds(board);\n\t\t\tif (pendingIds.size > 0) {\n\t\t\t\tsetLocalDraftRef.current({\n\t\t\t\t\troomId,\n\t\t\t\t\tbaseRevision: currentRevisionRef.current,\n\t\t\t\t\titems: mergedItems,\n\t\t\t\t\tupdatedAt: nowMs(),\n\t\t\t\t\tpendingIds: Array.from(pendingIds),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tpersistLocalDraft();\n\t\tif (!connection.connected) return;\n\t\tflushQueuedDocument();\n\t}, [connection.connected, flushQueuedDocument, persistLocalDraft, roomId]);\n\n\tconst remoteAdapter = useMemo<VectorCanvasRemoteAdapter>(\n\t\t() => ({\n\t\t\tsubscribe(onItems) {\n\t\t\t\tsubscriberRefs.current.add(onItems);\n\t\t\t\tif (latestDocumentRef.current) {\n\t\t\t\t\tonItems(latestDocumentRef.current.items);\n\t\t\t\t}\n\t\t\t\treturn () => {\n\t\t\t\t\tsubscriberRefs.current.delete(onItems);\n\t\t\t\t};\n\t\t\t},\n\t\t\tsend(items) {\n\t\t\t\tqueueDocumentSend(items);\n\t\t\t},\n\t\t\tflush() {\n\t\t\t\treturn flushDocumentSync();\n\t\t\t},\n\t\t}),\n\t\t[flushDocumentSync, queueDocumentSend],\n\t);\n\n\tconst disconnect = useCallback(() => {\n\t\tmanualDisconnectRef.current = true;\n\t\tclearReconnectTimer();\n\t\tclearHeartbeatTimer();\n\t\tclearConnectTimeout();\n\t\tsendRaw({\n\t\t\ttype: \"session:leave\",\n\t\t\troomId,\n\t\t\tclientId: clientIdRef.current,\n\t\t});\n\t\twsRef.current?.close();\n\t\twsRef.current = null;\n\t\tcollapsePeersToSelf(\"offline\");\n\t\tupdateConnection((prev) => ({\n\t\t\t...prev,\n\t\t\tstate: \"offline\",\n\t\t\tconnected: false,\n\t\t}));\n\t}, [\n\t\tclearConnectTimeout,\n\t\tclearHeartbeatTimer,\n\t\tclearReconnectTimer,\n\t\tcollapsePeersToSelf,\n\t\troomId,\n\t\tsendRaw,\n\t\tupdateConnection,\n\t]);\n\n\tconst reconnectNow = useCallback(() => {\n\t\tdisconnect();\n\t\tmanualDisconnectRef.current = false;\n\t\tretryCountRef.current = 0;\n\t\tsetConnectSequence((value) => value + 1);\n\t}, [disconnect]);\n\n\tconst remotePresence = useMemo(\n\t\t() => sessionPeers.filter((peerState) => !peerState.isSelf),\n\t\t[sessionPeers],\n\t);\n\n\tconst syncViewportPresence = useCallback(\n\t\t(bindingOptions?: BindViewportPresenceOptions) => {\n\t\t\tconst viewport = bindingOptions?.viewportRef?.current;\n\t\t\tconst cameraSnapshot = getViewportCameraSnapshot(viewport);\n\t\t\tif (!cameraSnapshot) return false;\n\t\t\tlastCameraRef.current = cameraSnapshot;\n\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\tsendPresenceUpdate();\n\t\t\treturn true;\n\t\t},\n\t\t[sendPresenceUpdate],\n\t);\n\n\tconst bindViewportPresence = useCallback(\n\t\t(\n\t\t\tbindingOptions?: BindViewportPresenceOptions,\n\t\t): RealtimeViewportPresenceBindings => ({\n\t\t\tremotePresence,\n\t\t\tonWorldPointerMove(world) {\n\t\t\t\tlastCursorRef.current = world;\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t\tonWorldPointerLeave() {\n\t\t\t\tlastCursorRef.current = null;\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t\tonPlacementPreviewChange(preview: RealtimePlacementPreview | null) {\n\t\t\t\tlastMarkupStrokeRef.current =\n\t\t\t\t\tremoteMarkupStrokeFromPlacementPreview(preview);\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t\tonCameraChange() {\n\t\t\t\tconst viewport = bindingOptions?.viewportRef?.current;\n\t\t\t\tconst cameraSnapshot = getViewportCameraSnapshot(viewport);\n\t\t\t\tif (!cameraSnapshot) return;\n\t\t\t\tif (viewport && consumeViewportFollowSync(viewport, cameraSnapshot)) {\n\t\t\t\t\tlastCameraRef.current = cameraSnapshot;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlastCameraRef.current = cameraSnapshot;\n\t\t\t\tlastActiveToolRef.current = bindingOptions?.activeTool;\n\t\t\t\tsendPresenceUpdate();\n\t\t\t},\n\t\t}),\n\t\t[remotePresence, sendPresenceUpdate],\n\t);\n\n\treturn {\n\t\tconnection,\n\t\tsessionPeers,\n\t\tremotePresence,\n\t\tremoteAdapter,\n\t\tdocument,\n\t\thasLocalOfflineDraft,\n\t\thasPendingDocumentSync,\n\t\tsyncState,\n\t\tconflict,\n\t\tbindViewportPresence,\n\t\tsyncViewportPresence,\n\t\tresolveConflict,\n\t\tclearLocalDraft,\n\t\tflushDocumentSync,\n\t\tdisconnect,\n\t\treconnectNow,\n\t};\n}\n"]}