y-mxgraph 0.1.4 → 0.1.5
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.
- package/README.md +4 -0
- package/README.zh-CN.md +5 -1
- package/binding/index.d.ts +7 -0
- package/binding/index.d.ts.map +1 -1
- package/binding/patch.d.ts.map +1 -1
- package/models/mxCell.d.ts.map +1 -1
- package/models/mxfile.d.ts.map +1 -1
- package/package.json +1 -1
- package/y-mxgraph.cjs.js +62 -24
- package/y-mxgraph.cjs.js.map +1 -1
- package/y-mxgraph.es.js +62 -24
- package/y-mxgraph.es.js.map +1 -1
- package/y-mxgraph.iife.js +62 -24
- package/y-mxgraph.iife.js.map +1 -1
- package/y-mxgraph.umd.js +62 -24
- package/y-mxgraph.umd.js.map +1 -1
package/y-mxgraph.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"y-mxgraph.es.js","sources":["../src/helper/xml.ts","../src/models/mxCell.ts","../src/models/mxGraphModel.ts","../src/models/diagram.ts","../src/models/mxfile.ts","../src/binding/patch.ts","../src/transformer/index.ts","../src/helper/origin.ts","../src/binding/undoManager.ts","../src/helper/awarenessStateValue.ts","../src/helper/random.ts","../src/helper/cursor.ts","../src/binding/collaborator/cursor.ts","../src/helper/getId.ts","../src/binding/collaborator/selection.ts","../src/binding/collaborator/index.ts","../src/binding/index.ts"],"sourcesContent":["import { xml2js, js2xml, type ElementCompact } from \"xml-js\";\n\nfunction deepProcess(node: unknown): void {\n if (node == null) return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n deepProcess(item);\n }\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n const obj = node as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (key === \"_attributes\") continue;\n\n let value = obj[key];\n const keyLower = key.toLowerCase();\n\n if (\n (keyLower === \"diagram\" || keyLower === \"mxcell\") &&\n value !== undefined &&\n !Array.isArray(value)\n ) {\n obj[key] = [value];\n value = obj[key];\n }\n\n if (Array.isArray(value)) {\n for (const v of value) deepProcess(v);\n } else if (value && typeof value === \"object\") {\n deepProcess(value);\n }\n }\n}\n\nexport function parse(xml: string) {\n const result = xml2js(xml, { compact: true }) as Record<string, unknown>;\n deepProcess(result);\n return result;\n}\n\nexport function serializer(obj: ElementCompact, spaces = 2) {\n return js2xml(obj, {\n compact: true,\n spaces,\n });\n}\n","import * as Y from \"yjs\";\nimport { xml2js, js2xml } from \"xml-js\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxCell\";\n\nconst mxGeometryKey = \"mxGeometry\";\nconst mxGeometryAttributeKey = \"geometry\";\n\nexport interface MxCellModel extends ElementCompact {\n [mxGeometryKey]?: ElementCompact;\n}\n\nexport function parse(object: MxCellModel): Y.XmlElement {\n const xmlElement = new Y.XmlElement(\"mxCell\");\n\n for (const attribute of Object.keys(object._attributes || {})) {\n xmlElement.setAttribute(\n attribute,\n `${object._attributes?.[attribute] || \"\"}`\n );\n }\n\n if (object[mxGeometryKey]) {\n const geometry = object[mxGeometryKey];\n const geometryString = js2xml(geometry, {\n compact: true,\n });\n xmlElement.setAttribute(mxGeometryAttributeKey, geometryString);\n delete object[mxGeometryKey];\n }\n\n return xmlElement;\n}\n\nexport function serialize(xmlElement: Y.XmlElement) {\n const attributes = {\n ...xmlElement.getAttributes(),\n };\n\n let mxGeometry: ElementCompact | null = null;\n\n if (mxGeometryAttributeKey in attributes) {\n const mxGeometryString = attributes[mxGeometryAttributeKey];\n try {\n const parsed = xml2js(mxGeometryString!, { compact: true }) as Record<string, ElementCompact>;\n mxGeometry = parsed[mxGeometryKey] ?? null;\n if (mxGeometry && mxGeometry._attributes) {\n mxGeometry._attributes[\"as\"] = \"geometry\";\n }\n } catch (e) {\n console.warn(\"[y-mxgraph] Failed to parse mxGeometry:\", e);\n }\n delete attributes[mxGeometryAttributeKey];\n }\n\n const obj: Record<string, unknown> = {\n _attributes: attributes,\n };\n\n if (mxGeometry) {\n obj[mxGeometryKey] = mxGeometry;\n }\n\n return obj;\n}\n","import * as Y from \"yjs\";\n\nimport {\n key as mxCellKey,\n parse as parseMxCell,\n serialize as serializeMxCell,\n type MxCellModel,\n} from \"./mxCell\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxGraphModel\";\nexport const mxCellOrderKey = mxCellKey + \"Order\";\n\nexport interface MxGraphModel extends ElementCompact {\n root: {\n mxCell: MxCellModel[];\n };\n}\n\nexport type YMxGraphModel = Y.Map<unknown>;\n\nexport function parse(object: MxGraphModel, doc?: Y.Doc) {\n const mxCells = (object.root[mxCellKey] || []).map((cell: MxCellModel) => {\n return {\n value: parseMxCell(cell),\n id: (cell._attributes?.id || \"\") as string,\n };\n });\n\n const mxGraphElement = doc?.getMap(key) || new Y.Map();\n\n const cells = new Y.Map<Y.XmlElement>();\n const cellsOrder = new Y.Array<string>();\n\n mxCells.forEach((cell) => {\n cells.set(cell.id, cell.value);\n });\n\n cellsOrder.push(mxCells.map((cell) => cell.id));\n\n mxGraphElement.set(mxCellKey, cells);\n mxGraphElement.set(mxCellOrderKey, cellsOrder);\n\n return mxGraphElement as YMxGraphModel;\n}\n\nexport function serialize(map: YMxGraphModel) {\n const cells = map.get(mxCellKey) as unknown as Y.Map<Y.XmlElement>;\n const cellsOrder = map.get(mxCellOrderKey) as unknown as Y.Array<string>;\n return {\n _attributes: {},\n root: {\n [mxCellKey]: cellsOrder\n .toArray()\n .map((id) => serializeMxCell(cells.get(id) as Y.XmlElement)),\n },\n };\n}\n","import * as Y from \"yjs\";\nimport {\n parse as parseMxGraphModel,\n serialize as serializeMxGraphModel,\n key as mxGraphModelKey,\n type MxGraphModel,\n type YMxGraphModel,\n} from \"./mxGraphModel\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"diagram\";\n\nexport interface Diagram extends ElementCompact {\n mxGraphModel: MxGraphModel;\n}\n\nexport type YDiagram = Y.Map<unknown>;\n\nexport function parse(object: Diagram): YDiagram {\n const yDiagramElement = new Y.Map();\n yDiagramElement.set(\"name\", `${object._attributes?.name || \"\"}`);\n yDiagramElement.set(\"id\", `${object._attributes?.id || \"\"}`);\n\n const mxGraphModel = parseMxGraphModel(object[mxGraphModelKey]);\n\n yDiagramElement.set(mxGraphModelKey, mxGraphModel);\n return yDiagramElement as YDiagram;\n}\n\nexport function serialize(yDiagram: YDiagram) {\n const mxGraphModel = yDiagram.get(mxGraphModelKey) as unknown as\n | YMxGraphModel\n | undefined;\n\n return {\n _attributes: {\n name: yDiagram.get(\"name\") as unknown as string,\n id: yDiagram.get(\"id\") as unknown as string,\n },\n [mxGraphModelKey]: mxGraphModel\n ? serializeMxGraphModel(mxGraphModel)\n : undefined,\n };\n}\n","import * as Y from \"yjs\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n} from \"./diagram\";\nimport type { Diagram, YDiagram } from \"./diagram\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxfile\";\nexport const diagramOrderKey = diagramKey + \"Order\";\n\nexport type YMxFile = Y.Map<unknown>;\n\nexport interface MxFile extends ElementCompact {\n diagram: Diagram[];\n}\n\nexport function parse(object: MxFile, doc: Y.Doc) {\n const mxfile = doc.getMap(key);\n mxfile.set(\"pages\", (object._attributes?.pages || \"1\") + \"\");\n\n const diagramList = object.diagram.map((diagram) => ({\n value: parseDiagram(diagram),\n id: (diagram._attributes?.id || \"\") as string,\n }));\n const diagramMap = new Y.Map<YDiagram>();\n const diagramOrder = new Y.Array<string>();\n diagramList.forEach((diagram) => {\n diagramMap.set(diagram.id, diagram.value);\n });\n diagramOrder.push(diagramList.map((diagram) => diagram.id));\n\n mxfile.set(diagramKey, diagramMap);\n mxfile.set(diagramOrderKey, diagramOrder);\n return mxfile;\n}\n\nexport function serializer(yMxFile: YMxFile): ElementCompact {\n const diagrams = yMxFile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const diagramOrder = yMxFile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n\n const obj: Record<string, unknown> = {\n _attributes: {\n pages: (yMxFile.get(\"pages\") as string) || \"1\",\n },\n [diagramKey]: diagramOrder\n .map((id) => diagrams.get(id) as unknown as YDiagram)\n .map((diagramElement) => serializeDiagram(diagramElement)),\n };\n\n return obj as ElementCompact;\n}\n","import { parse, serializer as xmlSerializer } from \"../helper/xml\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n type YDiagram,\n} from \"../models/diagram\";\nimport {\n key as mxfileKey,\n type YMxFile,\n diagramOrderKey,\n} from \"../models/mxfile\";\nimport {\n mxCellOrderKey,\n key as mxGraphModelKey,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\nimport { key as mxCellKey } from \"../models/mxCell\";\nimport * as Y from \"yjs\";\n\nconst DIFF_INSERT = \"i\";\nconst DIFF_REMOVE = \"r\";\nconst DIFF_UPDATE = \"u\";\n\ntype DocSnapshot = {\n diagramOrder: string[] | null;\n cellsOrder: Map<string, string[]>;\n cellAttrs: Map<string, Map<string, Record<string, string>>>;\n};\nconst docSnapshots = new WeakMap<Y.Doc, DocSnapshot>();\n\nfunction insertAfterUnique(\n orderArr: Y.Array<string>,\n id: string,\n previous: string | null | undefined,\n fallbackToEnd = false,\n) {\n const currentIds = orderArr.toArray();\n let anchorPos = previous ? currentIds.indexOf(previous) : -1;\n if (anchorPos === -1 && fallbackToEnd) anchorPos = currentIds.length - 1;\n let targetIndex = anchorPos + 1;\n\n const existingIndex = currentIds.indexOf(id);\n if (existingIndex === -1) {\n orderArr.insert(targetIndex, [id]);\n return;\n }\n\n if (existingIndex === targetIndex) return;\n\n if (existingIndex < targetIndex) targetIndex -= 1;\n orderArr.delete(existingIndex, 1);\n orderArr.insert(targetIndex, [id]);\n}\n\nfunction ensureUniqueOrder(orderArr: Y.Array<string>) {\n const arr = orderArr.toArray();\n const seen = new Set<string>();\n const dupIdx: number[] = [];\n for (let i = 0; i < arr.length; i++) {\n const id = arr[i];\n if (!id) continue;\n if (seen.has(id)) dupIdx.push(i);\n else seen.add(id);\n }\n if (dupIdx.length) {\n dupIdx.sort((a, b) => b - a).forEach((idx) => orderArr.delete(idx, 1));\n }\n}\n\nexport interface DiagramInsert {\n data: string;\n id: string;\n previous: string;\n}\n\nexport interface FilePatch {\n [DIFF_REMOVE]?: string[];\n [DIFF_INSERT]?: DiagramInsert[];\n [DIFF_UPDATE]?: {\n [key: string]: {\n name?: string;\n previous?: string;\n cells?: {\n [DIFF_REMOVE]?: string[];\n [DIFF_INSERT]?: Record<string, string>[];\n [DIFF_UPDATE]?: {\n [key: string]: Record<string, string>;\n };\n };\n };\n };\n}\n\nexport function applyFilePatch(\n doc: Y.Doc,\n patch: FilePatch,\n options?: { origin?: unknown },\n) {\n doc.transact(() => {\n const mxfile = doc.getMap(mxfileKey) as YMxFile;\n if (patch[DIFF_REMOVE]) {\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n ensureUniqueOrder(orderArr);\n const orderList = orderArr.toArray();\n\n const removeIds = patch[DIFF_REMOVE];\n if (removeIds && removeIds.length) {\n const indexList = removeIds\n .map((id) => orderList.indexOf(id))\n .filter((i) => i !== -1)\n .sort((a, b) => b - a);\n\n indexList.forEach((idx) => orderArr.delete(idx, 1));\n removeIds.forEach((id) => diagramsMap.delete(id));\n }\n }\n\n if (patch[DIFF_INSERT]) {\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n ensureUniqueOrder(orderArr);\n const existingIds = orderArr.toArray();\n const existingIndex = new Map<string, number>();\n existingIds.forEach((id, idx) => existingIndex.set(id, idx));\n\n const inserts = patch[DIFF_INSERT].map((item, order) => {\n const object = parse(item.data) as Record<string, unknown>;\n const diagramObj = Array.isArray(object?.diagram)\n ? (object.diagram as unknown[])[0]\n : object?.diagram;\n const diagramElement = parseDiagram(\n diagramObj as import(\"../models/diagram\").Diagram,\n );\n return {\n id: item.id,\n previous: item.previous || \"\",\n diagramElement,\n order,\n };\n });\n\n const byId = new Map(inserts.map((i) => [i.id, i] as const));\n const computeAnchor = (node: {\n id: string;\n previous: string;\n }): {\n anchorId: string;\n depth: number;\n } => {\n let depth = 1;\n let anchorId = \"\";\n let prevId = node.previous;\n const seen = new Set<string>([node.id]);\n while (prevId) {\n if (seen.has(prevId)) {\n depth = 1;\n anchorId = \"\";\n break;\n }\n seen.add(prevId);\n\n const prevNode = byId.get(prevId);\n if (prevNode) {\n depth += 1;\n prevId = prevNode.previous;\n continue;\n }\n\n if (existingIndex.has(prevId)) {\n anchorId = prevId;\n } else {\n anchorId = \"\";\n }\n break;\n }\n return { anchorId, depth };\n };\n\n const enriched = inserts.map((i) => ({ ...i, ...computeAnchor(i) }));\n\n enriched.sort((a, b) => {\n const aIdx = a.anchorId ? existingIndex.get(a.anchorId)! : -1;\n const bIdx = b.anchorId ? existingIndex.get(b.anchorId)! : -1;\n if (aIdx !== bIdx) return aIdx - bIdx;\n if (a.depth !== b.depth) return b.depth - a.depth;\n return b.order - a.order;\n });\n\n for (const item of enriched) {\n diagramsMap.set(item.id, item.diagramElement);\n insertAfterUnique(orderArr, item.id, item.anchorId || null);\n }\n }\n\n if (patch[DIFF_UPDATE]) {\n Object.keys(patch[DIFF_UPDATE]).forEach((id) => {\n const diagramsMap = mxfile.get(\n diagramKey,\n ) as unknown as Y.Map<YDiagram>;\n const diagram = diagramsMap.get(id) as YDiagram | undefined;\n if (diagram) {\n const update = patch[DIFF_UPDATE]![id];\n if (\"name\" in update) {\n (diagram as unknown as Y.Map<unknown>).set(\n \"name\",\n update.name || \"\",\n );\n }\n\n if (update.cells) {\n const yMxGraphModel = diagram.get(mxGraphModelKey) as\n | YMxGraphModel\n | undefined;\n if (!yMxGraphModel) return;\n const cellsMap = yMxGraphModel.get(mxCellKey) as\n | Y.Map<Y.XmlElement>\n | undefined;\n const orderArr = yMxGraphModel.get(mxCellOrderKey) as\n | Y.Array<string>\n | undefined;\n if (!cellsMap || !orderArr) return;\n ensureUniqueOrder(orderArr as Y.Array<string>);\n\n if (update.cells[DIFF_REMOVE] && update.cells[DIFF_REMOVE].length) {\n const orderIds = orderArr.toArray();\n const removeIndexList = update.cells[DIFF_REMOVE].map((cid) =>\n orderIds.indexOf(cid),\n )\n .filter((i) => i !== -1)\n .sort((a, b) => b - a);\n removeIndexList.forEach((idx) => orderArr.delete(idx, 1));\n update.cells[DIFF_REMOVE].forEach((cid) => cellsMap.delete(cid));\n }\n\n if (update.cells[DIFF_INSERT] && update.cells[DIFF_INSERT].length) {\n for (const item of update.cells[DIFF_INSERT]) {\n const id = item[\"id\"] as string | undefined;\n if (!id) continue;\n const xmlElement = new Y.XmlElement(\"mxCell\");\n Object.keys(item).forEach((key) => {\n if (key === \"previous\") return;\n xmlElement.setAttribute(key, item[key]);\n });\n cellsMap.set(id, xmlElement);\n const previous = item[\"previous\"] as string | undefined;\n const parent = item[\"parent\"] as string | undefined;\n let anchorId: string | null | undefined = null;\n let fallbackToEnd = true;\n if (typeof previous !== \"undefined\") {\n if (previous === \"\") {\n if (parent) {\n anchorId = parent;\n fallbackToEnd = true;\n } else {\n anchorId = null;\n fallbackToEnd = false;\n }\n } else {\n anchorId = previous;\n fallbackToEnd = true;\n }\n } else if (parent) {\n anchorId = parent;\n fallbackToEnd = true;\n }\n\n insertAfterUnique(\n orderArr as Y.Array<string>,\n id,\n anchorId,\n fallbackToEnd,\n );\n }\n }\n\n if (update.cells[DIFF_UPDATE]) {\n Object.keys(update.cells[DIFF_UPDATE]).forEach((cid) => {\n const updateObj = update.cells![DIFF_UPDATE]![cid];\n const cell = cellsMap.get(cid) as Y.XmlElement | undefined;\n if (cell) {\n Object.keys(updateObj).forEach((k) => {\n if (k === \"previous\") return;\n cell.setAttribute(k, updateObj[k]);\n });\n }\n });\n\n Object.keys(update.cells[DIFF_UPDATE]).forEach((cellId) => {\n const updateObj = update.cells![DIFF_UPDATE]![cellId];\n const hasPrev = \"previous\" in updateObj;\n const hasParent = \"parent\" in updateObj;\n if (!hasPrev && !hasParent) return;\n\n const prevVal = hasPrev\n ? (updateObj.previous as string)\n : undefined;\n const parentVal = hasParent\n ? (updateObj.parent as string)\n : undefined;\n\n let anchorId: string | null | undefined = null;\n let fallbackToEnd = true;\n\n if (hasPrev) {\n if (prevVal === \"\") {\n if (parentVal) {\n anchorId = parentVal;\n fallbackToEnd = true;\n } else {\n anchorId = null;\n fallbackToEnd = false;\n }\n } else {\n anchorId = prevVal;\n fallbackToEnd = true;\n }\n } else if (parentVal) {\n anchorId = parentVal;\n fallbackToEnd = true;\n }\n\n const currentIds = orderArr.toArray();\n const currentIndex = currentIds.indexOf(cellId);\n\n if (currentIndex === -1) {\n let newCell = cellsMap.get(cellId) as\n | Y.XmlElement\n | undefined;\n if (!newCell) {\n newCell = new Y.XmlElement(\"mxCell\");\n newCell.setAttribute(\"id\", cellId);\n Object.keys(updateObj).forEach((k) => {\n if (k === \"previous\") return;\n newCell!.setAttribute(k, updateObj[k] as string);\n });\n cellsMap.set(cellId, newCell);\n }\n insertAfterUnique(\n orderArr as Y.Array<string>,\n cellId,\n anchorId,\n fallbackToEnd,\n );\n return;\n }\n\n insertAfterUnique(\n orderArr as Y.Array<string>,\n cellId,\n anchorId,\n fallbackToEnd,\n );\n });\n }\n }\n\n if (\"previous\" in update) {\n const previous = update.previous || null;\n const orderArr = mxfile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n ensureUniqueOrder(orderArr);\n insertAfterUnique(orderArr, id, previous, false);\n }\n }\n });\n }\n }, options?.origin);\n}\n\nexport function initDocSnapshot(doc: Y.Doc, resetSnapshot = false) {\n try {\n const mxfile = doc.getMap(mxfileKey) as YMxFile;\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(diagramOrderKey) as unknown as Y.Array<string>;\n // resetSnapshot=true 时把 diagramOrder 设为空数组,\n // 使第一次 generatePatch 把所有现有 diagram/cells 都识别为 insert\n const diagramOrder = resetSnapshot\n ? []\n : orderArr\n ? orderArr.toArray().slice()\n : [];\n\n const snap: DocSnapshot = {\n diagramOrder,\n cellsOrder: new Map<string, string[]>(),\n cellAttrs: new Map<string, Map<string, Record<string, string>>>(),\n };\n\n const diagrams: YDiagram[] = diagramOrder\n .map((id) => diagramsMap.get(id) as YDiagram | undefined)\n .filter((d): d is YDiagram => !!d);\n for (const d of diagrams) {\n const did = (d.get(\"id\") as unknown as string) || \"\";\n if (!did) continue;\n const gm = d.get(mxGraphModelKey) as YMxGraphModel | undefined;\n if (gm) {\n const order = gm.get(mxCellOrderKey) as Y.Array<string> | undefined;\n const ids = order ? order.toArray().slice() : [];\n snap.cellsOrder.set(did, ids);\n const cellsMap = gm.get(mxCellKey) as Y.Map<Y.XmlElement> | undefined;\n const attrMap = new Map<string, Record<string, string>>();\n if (cellsMap) {\n for (const cid of ids) {\n const el = cellsMap.get(cid) as Y.XmlElement | undefined;\n if (el) {\n attrMap.set(\n cid,\n (el.getAttributes() as Record<string, string>) || {},\n );\n }\n }\n }\n snap.cellAttrs.set(did, attrMap);\n } else {\n snap.cellsOrder.set(did, []);\n snap.cellAttrs.set(did, new Map());\n }\n }\n\n docSnapshots.set(doc, snap);\n } catch (e) {\n console.warn(\"[y-mxgraph] initDocSnapshot failed:\", e);\n }\n}\n\nexport function generatePatch(\n events: Y.YEvent<\n Y.XmlElement | Y.Array<string> | Y.Map<Y.XmlElement> | YMxFile | YDiagram\n >[],\n explicitDoc?: Y.Doc,\n): FilePatch {\n const patch: FilePatch = {};\n\n const doc =\n explicitDoc ??\n (events[0] as unknown as { transaction?: { doc?: Y.Doc } } | undefined)\n ?.transaction?.doc;\n if (!doc) return patch;\n if (!explicitDoc && (!events || events.length === 0)) return patch;\n const mxfile = doc.getMap(mxfileKey) as YMxFile;\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(diagramOrderKey) as unknown as Y.Array<string>;\n\n let snap = docSnapshots.get(doc);\n if (!snap) {\n snap = {\n diagramOrder: null,\n cellsOrder: new Map<string, string[]>(),\n cellAttrs: new Map<string, Map<string, Record<string, string>>>(),\n };\n docSnapshots.set(doc, snap);\n }\n const prevDiagramOrder = snap.diagramOrder;\n const prevCellsOrder = snap.cellsOrder;\n const prevCellsAttrs = snap.cellAttrs;\n\n const ensureUpdate = (diagramId: string) => {\n patch[DIFF_UPDATE] = patch[DIFF_UPDATE] || {};\n patch[DIFF_UPDATE]![diagramId] = patch[DIFF_UPDATE]![diagramId] || {};\n return patch[DIFF_UPDATE]![diagramId]!;\n };\n const ensureCellSection = (diagramId: string) => {\n const u = ensureUpdate(diagramId);\n u.cells = u.cells || {};\n return u.cells!;\n };\n\n const currDiagramOrder = orderArr.toArray();\n const diagramsList = currDiagramOrder\n .map((id) => diagramsMap.get(id) as YDiagram | undefined)\n .filter((d): d is YDiagram => !!d);\n const currCellsOrder = new Map<string, string[]>();\n const cellAttrMap = new Map<string, Map<string, Record<string, string>>>();\n\n for (const d of diagramsList) {\n const did = (d.get(\"id\") as unknown as string) || \"\";\n const attrs = new Map<string, Record<string, string>>();\n const gm = d.get(mxGraphModelKey) as YMxGraphModel | undefined;\n if (gm) {\n const cellsMap = gm.get(mxCellKey) as Y.Map<Y.XmlElement> | undefined;\n const orderArr = gm.get(mxCellOrderKey) as Y.Array<string> | undefined;\n if (cellsMap && orderArr) {\n const ids = orderArr.toArray();\n currCellsOrder.set(did, ids);\n for (const cid of ids) {\n const c = cellsMap.get(cid) as Y.XmlElement | undefined;\n if (c)\n attrs.set(cid, (c.getAttributes() as Record<string, string>) || {});\n }\n } else {\n currCellsOrder.set(did, []);\n }\n } else {\n currCellsOrder.set(did, []);\n }\n cellAttrMap.set(did, attrs);\n }\n\n const insertedDiagramIdGlobal = new Set<string>();\n const insertedCellIdGlobal = new Set<string>();\n\n if (prevDiagramOrder) {\n const prevSet = new Set(prevDiagramOrder);\n const currSet = new Set(currDiagramOrder);\n\n const removed = prevDiagramOrder.filter(\n (id: string) => !currSet.has(id) && id,\n );\n if (removed.length) patch[DIFF_REMOVE] = removed;\n const removedDiagramSet = new Set(removed);\n\n const inserted = currDiagramOrder.filter(\n (id: string) => !prevSet.has(id) && id,\n );\n if (inserted.length) {\n patch[DIFF_INSERT] = patch[DIFF_INSERT] || [];\n for (const id of inserted) {\n const index = currDiagramOrder.indexOf(id);\n const previous = index <= 0 ? \"\" : currDiagramOrder[index - 1];\n const yDiagram = diagramsMap.get(id) as YDiagram | undefined;\n if (!yDiagram) continue;\n const data = xmlSerializer({ diagram: serializeDiagram(yDiagram) });\n patch[DIFF_INSERT]!.push({ id, previous, data });\n insertedDiagramIdGlobal.add(id);\n }\n }\n\n const prevNeighbor = (order: string[], id: string) => {\n const i = order.indexOf(id);\n return i <= 0 ? \"\" : order[i - 1];\n };\n const common = currDiagramOrder.filter((id) => prevSet.has(id) && id);\n for (const id of common) {\n const prevP = prevNeighbor(prevDiagramOrder, id);\n const currP = prevNeighbor(currDiagramOrder, id);\n if (prevP !== currP) {\n if (prevP && removedDiagramSet.has(prevP)) continue;\n const u = ensureUpdate(id);\n u.previous = currP;\n }\n }\n }\n\n const allDiagramIds = new Set<string>([\n ...(prevDiagramOrder || []),\n ...currDiagramOrder,\n ]);\n for (const did of allDiagramIds) {\n if (!did) continue;\n const prevCells = prevCellsOrder.get(did) || [];\n const currCells = currCellsOrder.get(did) || [];\n if (!prevCells.length && !currCells.length) continue;\n\n const prevSet = new Set(prevCells);\n const currSet = new Set(currCells);\n\n const removed = prevCells.filter((cid: string) => !currSet.has(cid) && cid);\n if (removed.length) {\n const cells = ensureCellSection(did);\n cells[DIFF_REMOVE] = (cells[DIFF_REMOVE] || []).concat(removed);\n }\n const removedCellSet = new Set(removed);\n\n const inserted = currCells.filter(\n (cid: string) => !prevSet.has(cid) && cid,\n );\n if (inserted.length) {\n const cells = ensureCellSection(did);\n cells[DIFF_INSERT] = cells[DIFF_INSERT] || [];\n const attrsMap = cellAttrMap.get(did) || new Map();\n for (const cid of inserted) {\n const attrs = attrsMap.get(cid) || {};\n const index = currCells.indexOf(cid);\n const previous = index <= 0 ? \"\" : currCells[index - 1];\n cells[DIFF_INSERT]!.push({\n ...(attrs as Record<string, string>),\n previous,\n });\n insertedCellIdGlobal.add(cid);\n }\n }\n\n const prevNeighbor = (order: string[], id: string) => {\n const i = order.indexOf(id);\n return i <= 0 ? \"\" : order[i - 1];\n };\n const commonCells = currCells.filter((cid) => prevSet.has(cid) && cid);\n for (const cid of commonCells) {\n const prevP = prevNeighbor(prevCells, cid);\n const currP = prevNeighbor(currCells, cid);\n if (prevP !== currP) {\n if (prevP && removedCellSet.has(prevP)) continue;\n const cells = ensureCellSection(did);\n cells[DIFF_UPDATE] = cells[DIFF_UPDATE] || {};\n const cellUpdate = (cells[DIFF_UPDATE]![cid] =\n cells[DIFF_UPDATE]![cid] || {});\n (cellUpdate as Record<string, unknown>).previous = currP;\n }\n }\n }\n\n {\n const diagramSet = new Set<Y.Map<unknown>>(\n diagramsList as unknown as Y.Map<unknown>[],\n );\n for (const ev of events) {\n const target = (ev as unknown as { target?: unknown }).target;\n if (!(target instanceof Y.Map)) continue;\n if (!diagramSet.has(target)) continue;\n const changed: Set<string> =\n (ev as unknown as { keysChanged?: Set<string> }).keysChanged ||\n new Set();\n if (!changed || !changed.has(\"name\")) continue;\n const did = (target.get(\"id\") as unknown as string) || \"\";\n if (!did || insertedDiagramIdGlobal.has(did)) continue;\n const u = ensureUpdate(did);\n u.name = (target.get(\"name\") as unknown as string) || \"\";\n }\n }\n\n if (!prevDiagramOrder) {\n for (const d of diagramsList) {\n const did = (d.get(\"id\") as unknown as string) || \"\";\n if (!did) continue;\n const u = ensureUpdate(did);\n u.name = (d.get(\"name\") as unknown as string) || \"\";\n }\n }\n\n for (const ev of events) {\n const target = (ev as unknown as { target?: unknown }).target;\n if (!(target instanceof Y.XmlElement)) continue;\n const el = target as Y.XmlElement;\n if (el.nodeName !== \"mxCell\") continue;\n\n const changed: Set<string> =\n (ev as unknown as { attributesChanged?: Set<string> })\n .attributesChanged ||\n (ev as unknown as { keysChanged?: Set<string> }).keysChanged ||\n new Set();\n if (!changed || (changed as Set<string>).size === 0) continue;\n\n const cellId = el.getAttribute(\"id\");\n if (!cellId || insertedCellIdGlobal.has(cellId)) continue;\n\n const idsEntries = Array.from(currCellsOrder.entries());\n let diagramId = \"\";\n for (const [did, ids] of idsEntries) {\n if (ids.includes(cellId)) {\n diagramId = did;\n break;\n }\n }\n if (!diagramId) continue;\n\n const cellsPatch = ensureCellSection(diagramId);\n cellsPatch[DIFF_UPDATE] = cellsPatch[DIFF_UPDATE] || {};\n const cellUpdate = (cellsPatch[DIFF_UPDATE]![cellId] =\n cellsPatch[DIFF_UPDATE]![cellId] || {});\n for (const key of Array.from(changed)) {\n cellUpdate[key] = el.getAttribute(key) || \"\";\n }\n }\n\n if (prevDiagramOrder) {\n for (const [did, currAttrsMap] of cellAttrMap.entries()) {\n const prevAttrsMap =\n prevCellsAttrs.get(did) || new Map<string, Record<string, string>>();\n const cellsPatch = ensureCellSection(did);\n cellsPatch[DIFF_UPDATE] = cellsPatch[DIFF_UPDATE] || {};\n const updateBucket = cellsPatch[DIFF_UPDATE]!;\n\n const currCells = currAttrsMap.keys();\n for (const cid of currCells) {\n if (insertedCellIdGlobal.has(cid)) continue;\n const prevAttrs = prevAttrsMap.get(cid) || {};\n const currAttrs = currAttrsMap.get(cid) || {};\n const keys = new Set<string>([\n ...Object.keys(prevAttrs),\n ...Object.keys(currAttrs),\n ]);\n const cellUpdate = (updateBucket[cid] = updateBucket[cid] || {});\n let changed = false;\n for (const k of keys) {\n const pv = prevAttrs[k] ?? \"\";\n const cv = currAttrs[k] ?? \"\";\n if (pv !== cv) {\n cellUpdate[k] = cv;\n changed = true;\n }\n }\n if (!changed) {\n if (Object.keys(cellUpdate).length === 0) {\n delete updateBucket[cid];\n }\n }\n }\n }\n }\n\n snap.diagramOrder = currDiagramOrder.slice();\n const newCellsOrder = new Map<string, string[]>();\n const newCellsAttrs = new Map<string, Map<string, Record<string, string>>>();\n for (const [did, arr] of currCellsOrder.entries()) {\n newCellsOrder.set(did, arr.slice());\n }\n for (const [did, attrsMap] of cellAttrMap.entries()) {\n const copy = new Map<string, Record<string, string>>();\n for (const [cid, attrs] of attrsMap.entries()) {\n copy.set(cid, { ...attrs });\n }\n newCellsAttrs.set(did, copy);\n }\n snap.cellsOrder = newCellsOrder;\n snap.cellAttrs = newCellsAttrs;\n docSnapshots.set(doc, snap);\n\n return patch;\n}\n","import * as Y from \"yjs\";\nimport { parse, serializer } from \"../helper/xml\";\nimport {\n parse as parseMxFile,\n key as mxfileKey,\n serializer as serializerMxFile,\n type YMxFile,\n} from \"../models/mxfile\";\nimport {\n parse as parseMxGraphModel,\n key as mxGraphModelKey,\n serialize as serializerMxGraphModel,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\n\nexport function xml2doc(xml: string, doc: Y.Doc): Y.Doc {\n const object = parse(xml);\n\n const mxfile = (object as Record<string, unknown>).mxfile;\n const mxGraphModel = (object as Record<string, unknown>).mxGraphModel;\n if (mxfile) {\n doc.transact(() => {\n parseMxFile(mxfile as import(\"../models/mxfile\").MxFile, doc);\n });\n } else if (mxGraphModel) {\n doc.transact(() => {\n parseMxGraphModel(mxGraphModel as import(\"../models/mxGraphModel\").MxGraphModel, doc);\n });\n } else {\n throw new Error(\"不支持的文件格式\");\n }\n\n return doc;\n}\n\nexport function doc2xml(doc: Y.Doc, spaces = 0): string {\n if (doc.share.has(mxfileKey)) {\n return serializer(\n {\n [mxfileKey]: serializerMxFile(\n doc.share.get(mxfileKey) as unknown as YMxFile,\n ),\n },\n spaces,\n );\n } else if (doc.share.has(mxGraphModelKey)) {\n return serializer(\n {\n [mxGraphModelKey]: serializerMxGraphModel(\n doc.share.get(mxGraphModelKey) as unknown as YMxGraphModel,\n ),\n },\n spaces,\n );\n }\n\n return \"\";\n}\n","/**\n * 本地修改事务的 origin 标记,供 UndoManager.trackedOrigins 使用。\n * 对外导出,外部创建 Y.UndoManager 时可将其加入 trackedOrigins,\n * 以确保只追踪 binding 内部产生的本地变更。\n */\nexport const LOCAL_ORIGIN: object = {};\n","/**\n * 绑定 Y.UndoManager 到 draw.io 的 editor.undoManager,提供 mxUndoManager 兼容层。\n * 仅在外部传入 undoManager 时调用。\n */\nimport * as Y from \"yjs\";\nimport { LOCAL_ORIGIN } from \"../helper/origin\";\nimport type { DrawioFile } from \"../types/drawio\";\n\ntype ListenerFn = (sender: unknown, evt?: unknown) => void;\n\nfunction createMxEventObject(name: string, props?: Record<string, unknown>) {\n const _props = props || {};\n return {\n name,\n getName: () => name,\n getProperty: (k: string) => _props[k],\n };\n}\n\nexport function bindUndoManager(doc: Y.Doc, file: DrawioFile, yUndo: Y.UndoManager) {\n const editor = file.getUi().editor;\n const originUndoManager = editor.undoManager;\n\n let lastTxnLocalOrigin = false;\n const beforeTxnHandler = (t: Y.Transaction) => {\n lastTxnLocalOrigin = !!(t.local || t.origin === LOCAL_ORIGIN);\n };\n const afterTxnHandler = (t: Y.Transaction) => {\n lastTxnLocalOrigin = !!(t.local || t.origin === LOCAL_ORIGIN);\n };\n doc.on(\"beforeTransaction\", beforeTxnHandler);\n doc.on(\"afterTransaction\", afterTxnHandler);\n\n const pairs: Array<[string, ListenerFn]> = [];\n const raw = Array.isArray(originUndoManager?.eventListeners)\n ? (originUndoManager.eventListeners as unknown[])\n : [];\n for (let i = 0; i + 1 < raw.length; i += 2) {\n const key = String(raw[i]);\n const fn = raw[i + 1] as ListenerFn;\n pairs.push([key, fn]);\n }\n\n const mxLike: Record<string, unknown> & {\n eventListeners: Array<string | ListenerFn>;\n history: unknown[];\n indexOfNextAdd: number;\n _y: Y.UndoManager;\n addListener(name: string, fn: ListenerFn): void;\n fireEvent(evt: unknown): void;\n clear(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n undo(): void;\n redo(): void;\n undoableEditHappened(_edit: unknown): void;\n } = {\n eventListeners: [] as Array<string | ListenerFn>,\n history: [] as unknown[],\n indexOfNextAdd: 0,\n _y: yUndo,\n\n addListener(name: string, fn: ListenerFn) {\n this.eventListeners.push(name, fn);\n },\n\n fireEvent(evt: unknown) {\n const eventName: string =\n (evt as { name?: string } | undefined)?.name ||\n ((evt as { getName?: () => string } | undefined)?.getName?.() ?? \"\");\n for (let i = 0; i + 1 < this.eventListeners.length; i += 2) {\n const key = this.eventListeners[i];\n const listener = this.eventListeners[i + 1] as ListenerFn;\n if (key === eventName) {\n try {\n listener(this, evt);\n } catch (e) {\n console.warn(\"[y-mxgraph] undoManager event listener error:\", e);\n }\n }\n }\n },\n\n clear() {\n if (typeof this._y.clear === \"function\") {\n this._y.clear();\n } else {\n while (this._y.canUndo && this._y.canUndo()) this._y.undo();\n while (this._y.canRedo && this._y.canRedo()) this._y.redo();\n }\n this.history = [];\n this.indexOfNextAdd = 0;\n this.fireEvent(createMxEventObject(\"clear\"));\n },\n\n canUndo(): boolean {\n return typeof this._y.canUndo === \"function\" && this._y.canUndo();\n },\n\n canRedo(): boolean {\n return typeof this._y.canRedo === \"function\" && this._y.canRedo();\n },\n\n undo() {\n this._y.undo();\n },\n\n redo() {\n this._y.redo();\n },\n\n undoableEditHappened() {\n // no-op: 让 yjs 基于事务决定是否入栈\n },\n };\n\n type YUndoEventName = \"stack-item-added\" | \"stack-cleared\" | \"stack-item-popped\" | \"stack-item-updated\";\n const bridgeHandlers: Array<[YUndoEventName, () => void]> = [];\n const bridge = (mxEventName: \"add\" | \"clear\", yEventName: YUndoEventName) => {\n const handler = () => {\n if (mxEventName !== \"clear\" && !lastTxnLocalOrigin) {\n return;\n }\n switch (mxEventName) {\n case \"add\": {\n if (mxLike.indexOfNextAdd < mxLike.history.length) {\n mxLike.history.splice(\n mxLike.indexOfNextAdd,\n mxLike.history.length - mxLike.indexOfNextAdd,\n );\n }\n mxLike.history.push({});\n mxLike.indexOfNextAdd = mxLike.history.length;\n break;\n }\n case \"clear\": {\n mxLike.history = [];\n mxLike.indexOfNextAdd = 0;\n break;\n }\n }\n\n const evt = createMxEventObject(mxEventName, { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n };\n yUndo.on(yEventName, handler);\n bridgeHandlers.push([yEventName, handler]);\n };\n\n bridge(\"add\", \"stack-item-added\");\n bridge(\"clear\", \"stack-cleared\");\n\n const poppedHandler = (e: { type?: string; reason?: string; kind?: string }) => {\n const t = e && (e.type || e.reason || e.kind);\n if (t === \"undo\") {\n if (mxLike.indexOfNextAdd > 0) mxLike.indexOfNextAdd--;\n const evt = createMxEventObject(\"undo\", { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n } else if (t === \"redo\") {\n if (mxLike.indexOfNextAdd < mxLike.history.length)\n mxLike.indexOfNextAdd++;\n const evt = createMxEventObject(\"redo\", { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n }\n };\n yUndo.on(\"stack-item-popped\", poppedHandler);\n\n const updatedHandler = () => {\n const evt = createMxEventObject(\"redo\", { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n };\n yUndo.on(\"stack-item-updated\", updatedHandler);\n\n pairs.forEach(([key, fn]) => {\n const k = key.toLowerCase();\n if (k === \"add\" || k === \"clear\" || k === \"undo\" || k === \"redo\") {\n mxLike.addListener(k, fn);\n }\n });\n\n editor.undoManager = mxLike;\n\n editor.undoListener = function () {\n // no-op in yjs mode\n };\n\n const destroy = () => {\n doc.off(\"beforeTransaction\", beforeTxnHandler);\n doc.off(\"afterTransaction\", afterTxnHandler);\n bridgeHandlers.forEach(([event, handler]) => {\n yUndo.off(event, handler);\n });\n yUndo.off(\"stack-item-popped\", poppedHandler);\n yUndo.off(\"stack-item-updated\", updatedHandler);\n // 恢复原始 undoManager\n editor.undoManager = originUndoManager;\n editor.undoListener = originUndoManager?.undoListener;\n };\n\n return destroy;\n}\n","import { type Awareness } from \"y-protocols/awareness\";\n\nexport function getAwarenessStateValue<T>(\n awareness: Awareness,\n key: string,\n clientId?: string | number\n): T | null {\n const states = awareness.getStates();\n const id = clientId != null ? Number(clientId) : awareness.clientID;\n const clientState = states.get(id as number);\n if (!clientState) return null;\n if (!key) return clientState as T;\n return getByPath(clientState, key) as T | null;\n}\n\nfunction getByPath(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const part of parts) {\n if (cur == null) return null;\n const key: string | number =\n Array.isArray(cur) && /^\\d+$/.test(part) ? Number(part) : part;\n cur = (cur as Record<string, unknown>)?.[key];\n }\n return cur;\n}\n\nexport function setAwarenessStateValue(\n awareness: Awareness,\n key: string,\n value: unknown,\n clientId?: string | number\n): boolean {\n const id = clientId != null ? Number(clientId) : awareness.clientID;\n if (id !== awareness.clientID) return false;\n if (!key) {\n awareness.setLocalState(value as Record<string, unknown>);\n return true;\n }\n const current = (awareness.getLocalState() || {}) as Record<string, unknown>;\n const next = setByPath(current, key, value);\n awareness.setLocalState(next);\n return true;\n}\n\nfunction setByPath(obj: unknown, path: string, value: unknown): Record<string, unknown> {\n const parts = path.split(\".\");\n const root = Array.isArray(obj) ? obj.slice() : { ...(obj as Record<string, unknown>) };\n let cur: Record<string | number, unknown> = root as Record<string | number, unknown>;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isIndex = /^\\d+$/.test(part);\n const key: string | number = isIndex ? Number(part) : part;\n const isLast = i === parts.length - 1;\n if (isLast) {\n cur[key] = value;\n } else {\n let next = cur[key];\n const nextIsIndex = /^\\d+$/.test(parts[i + 1]);\n if (next == null) {\n next = nextIsIndex ? [] : {};\n } else {\n next = Array.isArray(next) ? next.slice() : { ...(next as Record<string, unknown>) };\n }\n cur[key] = next;\n cur = next as Record<string | number, unknown>;\n }\n }\n return root as Record<string, unknown>;\n}\n","export function generateColor(seed?: string | number) {\n const hash = hashString(String(seed || Math.random()));\n const h = hash % 360;\n const s = 65 + ((hash >>> 8) % 20);\n const l = 55 + ((hash >>> 16) % 10);\n return hslToHex(h, s, l);\n}\n\nexport function generateRandomName(): string {\n const len = 6;\n const alphabet = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let id = \"\";\n if (\n typeof crypto !== \"undefined\" &&\n typeof (crypto as Crypto).getRandomValues === \"function\"\n ) {\n const bytes = new Uint8Array(len);\n (crypto as Crypto).getRandomValues(bytes);\n for (let i = 0; i < len; i++) {\n id += alphabet[bytes[i] % alphabet.length];\n }\n } else {\n for (let i = 0; i < len; i++) {\n id += alphabet[Math.floor(Math.random() * alphabet.length)];\n }\n }\n return id;\n}\n\nexport function generateRandomId(): string {\n return generateRandomName();\n}\n\nfunction hashString(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n return hash >>> 0;\n}\n\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = h / 60;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n let r1 = 0,\n g1 = 0,\n b1 = 0;\n if (hp >= 0 && hp < 1) [r1, g1, b1] = [c, x, 0];\n else if (hp >= 1 && hp < 2) [r1, g1, b1] = [x, c, 0];\n else if (hp >= 2 && hp < 3) [r1, g1, b1] = [0, c, x];\n else if (hp >= 3 && hp < 4) [r1, g1, b1] = [0, x, c];\n else if (hp >= 4 && hp < 5) [r1, g1, b1] = [x, 0, c];\n else [r1, g1, b1] = [c, 0, x];\n const m = l - c / 2;\n const r = Math.round((r1 + m) * 255);\n const g = Math.round((g1 + m) * 255);\n const b = Math.round((b1 + m) * 255);\n return \"#\" + [r, g, b].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","export function createCursorImage(color: string) {\n const w = 8;\n const h = 12;\n const path =\n '<path d=\"M 4 0 L 8 12 L 4 10 L 0 12 Z\" stroke=\"' +\n color +\n '\" fill=\"' +\n color +\n '\"/>';\n const svg =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n w +\n 'px\" height=\"' +\n h +\n 'px\" viewBox=\"0 0 ' +\n w +\n \" \" +\n h +\n '\" version=\"1.1\">' +\n path +\n \"</svg>\";\n const bytes = new Uint8Array(svg.length);\n for (let i = 0; i < svg.length; i++) {\n bytes[i] = svg.charCodeAt(i);\n }\n const encoded = btoa(String.fromCharCode.apply(null, bytes as unknown as number[]));\n return \"data:image/svg+xml;base64,\" + encoded;\n}\n","import { throttle } from \"lodash-es\";\nimport { colord } from \"colord\";\nimport { createCursorImage } from \"../../helper/cursor\";\n\nimport { type Awareness } from \"y-protocols/awareness\";\nimport { type RemoteCursor } from \"./index\";\nimport type { DrawioFile, MxGraph } from \"../../types/drawio\";\n\nexport const CacheKey = \"__remoteCursor__\";\n\nfunction createCursorEl(color: string, username: string) {\n const cursor = document.createElement(\"div\");\n cursor.style.position = \"absolute\";\n cursor.style.opacity = \"0.9\";\n cursor.style.transition = \"all 0.3s ease-in-out\";\n\n const img = document.createElement(\"img\");\n img.style.transform = \"rotate(-45deg) translateX(-14px)\";\n img.setAttribute(\"src\", createCursorImage(color));\n img.style.width = \"10px\";\n img.style.transition = \"all 0.3s ease-in-out\";\n cursor.appendChild(img);\n\n const name = document.createElement(\"div\");\n name.style.backgroundColor = color;\n name.style.color = colord(color).isDark() ? \"#fff\" : \"#000\";\n name.style.fontSize = \"9pt\";\n name.style.padding = \"3px 7px\";\n name.style.marginTop = \"8px\";\n name.style.borderRadius = \"10px\";\n name.style.maxWidth = \"100px\";\n name.style.overflow = \"hidden\";\n name.style.textOverflow = \"ellipsis\";\n name.style.whiteSpace = \"nowrap\";\n\n name.innerText = username;\n cursor.appendChild(name);\n return cursor;\n}\n\nexport function bindCursor(\n file: DrawioFile,\n options: {\n awareness: Awareness;\n graph?: MxGraph;\n mouseMoveThrottle?: number;\n },\n) {\n const graph = options.graph || file.getUi().editor.graph;\n const awareness = options.awareness;\n const mouseMoveThrottle = options.mouseMoveThrottle ?? 100;\n\n const listener = {\n startX: 0,\n startY: 0,\n scrollLeft: 0,\n scrollTop: 0,\n mouseDown: function () {},\n mouseUp: function () {},\n mouseMove: throttle(function (\n _sender: unknown,\n event: { graphX: number; graphY: number; evt: MouseEvent },\n ) {\n const containerRect = graph.container.getBoundingClientRect();\n const { translate, scale } = graph.view;\n\n const x = Math.round(\n (event.evt.clientX - containerRect.x + graph.container.scrollLeft) /\n scale -\n translate.x,\n );\n const y = Math.round(\n (event.evt.clientY - containerRect.y + graph.container.scrollTop) /\n scale -\n translate.y,\n );\n\n awareness.setLocalStateField(\"cursor\", {\n x,\n y,\n pageId: file.getUi().currentPage?.getId(),\n });\n }, mouseMoveThrottle),\n };\n\n graph.addMouseListener(listener);\n\n // 鼠标离开画布时隐藏光标\n const handleMouseLeave = () => {\n awareness.setLocalStateField(\"cursor\", {\n x: 0,\n y: 0,\n pageId: file.getUi().currentPage?.getId(),\n hide: true,\n });\n };\n graph.container.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n graph.removeMouseListener(listener);\n graph.container.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n}\n\nexport function renderRemoteCursors(\n ui: { editor: { graph: MxGraph }; currentPage?: { getId(): string } | null; diagramContainer: HTMLElement },\n remotes: Map<number, RemoteCursor>,\n) {\n if (!(CacheKey in ui)) {\n (ui as Record<string, unknown>)[CacheKey] = new Map<number, HTMLDivElement>();\n }\n\n const cache = (ui as Record<string, unknown>)[CacheKey] as Map<number, HTMLDivElement>;\n const currentPageId = ui.currentPage?.getId();\n\n if (!currentPageId) {\n Array.from(cache.values()).forEach((el) => el.remove());\n cache.clear();\n return;\n }\n\n const currentPageRemotes: RemoteCursor[] = [];\n const otherPageRemotes: RemoteCursor[] = [];\n const leaveRemotesIds = new Set<number>();\n\n Array.from(cache.keys()).forEach((clientId) => {\n if (!remotes.has(clientId)) leaveRemotesIds.add(clientId);\n });\n\n Array.from(remotes.values()).forEach((remote) => {\n if (remote.cursorState?.pageId === currentPageId) {\n currentPageRemotes.push(remote);\n } else {\n otherPageRemotes.push(remote);\n }\n });\n\n leaveRemotesIds.forEach((clientId) => {\n const el = cache.get(clientId);\n cache.delete(clientId);\n if (!el) return;\n el.remove();\n });\n\n otherPageRemotes.forEach(({ clientId }) => {\n const el = cache.get(clientId);\n if (!el) return;\n el.remove();\n });\n\n if (!currentPageRemotes.length) return;\n\n const graph = ui.editor.graph;\n const { translate, scale } = graph.view;\n\n currentPageRemotes.forEach(\n ({ clientId, cursorState, userColor, userName }) => {\n if (!cursorState) return;\n let el = cache.get(clientId);\n\n // 隐藏状态:移除光标元素\n if (cursorState.hide) {\n if (el) {\n el.remove();\n cache.delete(clientId);\n }\n return;\n }\n\n if (!el) {\n el = createCursorEl(userColor, userName);\n ui.diagramContainer.appendChild(el);\n cache.set(clientId, el);\n }\n\n const x = (translate.x + cursorState.x) * scale + 8;\n const y = (translate.y + cursorState.y) * scale - 12;\n\n const cx = Math.max(\n graph.container.scrollLeft,\n Math.min(\n graph.container.scrollLeft +\n graph.container.clientWidth -\n el.clientWidth,\n x,\n ),\n );\n\n const cy = Math.max(\n graph.container.scrollTop - 22,\n Math.min(\n graph.container.scrollTop +\n graph.container.clientHeight -\n el.clientHeight,\n y,\n ),\n );\n el.style.left = cx + \"px\";\n el.style.top = cy + \"px\";\n el.style.display = \"\";\n },\n );\n}\n","export function getId(item: { id?: string | number }) {\n if (item.id) return item.id;\n return null;\n}\n","import { type Awareness } from \"y-protocols/awareness\";\nimport { getId } from \"../../helper/getId\";\nimport { type RemoteCursor } from \"./index\";\nimport type { DrawioFile, MxGraph } from \"../../types/drawio\";\n\nexport const SELECTION_OPACITY = 70;\nexport const CacheKey = \"__remoteSelection__\";\n\nexport function bindSelection(\n file: DrawioFile,\n options: { awareness: Awareness; graph?: MxGraph },\n) {\n const graph = options.graph || file.getUi().editor.graph;\n const awareness = options.awareness;\n\n const handler = function () {\n const pageId = file.getUi().currentPage?.getId();\n const cells = graph.getSelectionModel().cells as Record<string, unknown>;\n const ids = Object.keys(cells || {})\n .map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (key) => getId(cells[key] as any) as string,\n )\n .filter(Boolean);\n awareness.setLocalStateField(\"selection\", { ids, pageId });\n };\n\n const selectionModel = graph.getSelectionModel();\n selectionModel.addListener(\"change\", handler);\n\n return () => {\n selectionModel.removeListener(\"change\", handler);\n };\n}\n\nexport function renderRemoteSelections(\n ui: { editor: { graph: MxGraph }; currentPage?: { getId(): string } | null },\n remotes: Map<number, RemoteCursor>,\n) {\n if (!(CacheKey in ui)) {\n (ui as Record<string, unknown>)[CacheKey] = new Map<\n number,\n Map<string, { destroy: () => void }>\n >();\n }\n\n const cache = (ui as Record<string, unknown>)[CacheKey] as Map<\n number,\n Map<string, { destroy: () => void }>\n >;\n\n const currentPageId = ui.currentPage?.getId();\n\n if (!currentPageId) {\n cache.clear();\n return;\n }\n\n const currentPageRemotes: RemoteCursor[] = [];\n const otherPageRemotes: RemoteCursor[] = [];\n const leaveRemotesIds = new Set<number>();\n\n Array.from(cache.keys()).forEach((clientId) => {\n if (!remotes.has(clientId)) leaveRemotesIds.add(clientId);\n });\n\n Array.from(remotes.values()).forEach((remote) => {\n if (remote.selectionState?.pageId === currentPageId) {\n currentPageRemotes.push(remote);\n } else {\n otherPageRemotes.push(remote);\n }\n });\n\n leaveRemotesIds.forEach((clientId) => {\n const highlightCellMap = cache.get(clientId);\n cache.delete(clientId);\n if (!highlightCellMap) return;\n Array.from(highlightCellMap.values()).forEach((h) => h.destroy());\n highlightCellMap.clear();\n });\n\n otherPageRemotes.forEach(({ clientId }) => {\n const highlightCellMap = cache.get(clientId);\n if (!highlightCellMap) return;\n Array.from(highlightCellMap.values()).forEach((h) => h.destroy());\n highlightCellMap.clear();\n });\n\n if (!currentPageRemotes.length) return;\n\n const graph = ui.editor.graph;\n\n currentPageRemotes.forEach(({ clientId, selectionState, userColor }) => {\n let highlightCellMap = cache.get(clientId);\n if (!highlightCellMap) {\n highlightCellMap = new Map<string, { destroy: () => void }>();\n cache.set(clientId, highlightCellMap);\n }\n\n const currentIds = new Set<string>(selectionState?.ids ?? []);\n\n // 移除不再选中的高亮\n Array.from(highlightCellMap.keys()).forEach((id) => {\n if (!currentIds.has(id)) {\n highlightCellMap.get(id)?.destroy();\n highlightCellMap.delete(id);\n }\n });\n\n // 添加新选中的高亮\n currentIds.forEach((id) => {\n if (highlightCellMap.has(id)) return;\n const cell = graph.model.getCell(id);\n if (cell) {\n const highlightCell = graph.highlightCell(\n cell,\n userColor,\n 60000,\n SELECTION_OPACITY,\n 3,\n );\n highlightCellMap.set(id, highlightCell);\n }\n });\n });\n}\n","import { type Awareness } from \"y-protocols/awareness\";\nimport {\n getAwarenessStateValue,\n setAwarenessStateValue,\n} from \"../../helper/awarenessStateValue\";\nimport { generateColor, generateRandomName } from \"../../helper/random\";\nimport { bindCursor, renderRemoteCursors } from \"./cursor\";\nimport { bindSelection, renderRemoteSelections } from \"./selection\";\nimport type { DrawioFile, MxGraph } from \"../../types/drawio\";\n\nexport const DEFAULT_USER_NAME_KEY = \"user.name\";\nexport const DEFAULT_USER_COLOR_KEY = \"user.color\";\n\ntype CursorState = {\n x: number;\n y: number;\n pageId?: string | null;\n hide?: boolean;\n};\n\ntype SelectionState = {\n ids: string[];\n pageId?: string | null;\n};\n\nexport type RemoteCursor = {\n clientId: number;\n cursorState: CursorState | null;\n selectionState: SelectionState | null;\n userColor: string;\n userName: string;\n};\n\nexport function bindCollaborator(\n file: DrawioFile,\n options: {\n awareness: Awareness;\n graph?: MxGraph;\n cursor?: boolean | { userNameKey?: string; userColorKey?: string };\n mouseMoveThrottle?: number;\n },\n) {\n const graph = options.graph || file.getUi().editor.graph;\n const awareness = options.awareness;\n const mouseMoveThrottle = options.mouseMoveThrottle ?? 100;\n\n const cursorOption = options.cursor;\n const userNameKey =\n typeof cursorOption === \"object\" && cursorOption?.userNameKey\n ? cursorOption.userNameKey\n : DEFAULT_USER_NAME_KEY;\n const userColorKey =\n typeof cursorOption === \"object\" && cursorOption?.userColorKey\n ? cursorOption.userColorKey\n : DEFAULT_USER_COLOR_KEY;\n\n let userName = getAwarenessStateValue<string>(awareness, userNameKey);\n if (!userName) {\n userName = generateRandomName();\n setAwarenessStateValue(awareness, userNameKey, userName);\n }\n let userColor = getAwarenessStateValue<string>(awareness, userColorKey);\n if (!userColor) {\n userColor = generateColor(userName);\n setAwarenessStateValue(awareness, userColorKey, userColor);\n }\n\n const cleanupCursor = bindCursor(file, {\n awareness,\n graph,\n mouseMoveThrottle,\n });\n const cleanupSelection = bindSelection(file, {\n awareness,\n graph,\n });\n\n const showCursor = options.cursor ?? true;\n let cleanupAwareness: (() => void) | undefined;\n\n if (typeof showCursor === \"boolean\" && showCursor) {\n const awarenessHandler = (update: {\n added: number[];\n removed: number[];\n updated: number[];\n }) => {\n const states = awareness.getStates();\n const remotes = new Map<number, RemoteCursor>();\n\n const changedClientIds = new Set([...update.added, ...update.updated]);\n for (const [clientId] of states.entries()) {\n if (clientId === awareness.clientID) continue;\n if (!changedClientIds.has(clientId)) continue;\n\n const name =\n getAwarenessStateValue<string>(awareness, userNameKey, clientId) ||\n clientId + \"\";\n const color =\n getAwarenessStateValue<string>(awareness, userColorKey, clientId) ||\n \"#000000\";\n\n remotes.set(clientId, {\n clientId,\n cursorState: getAwarenessStateValue<CursorState>(\n awareness,\n \"cursor\",\n clientId,\n ),\n selectionState: getAwarenessStateValue<SelectionState>(\n awareness,\n \"selection\",\n clientId,\n ),\n userColor: color,\n userName: name,\n });\n }\n\n renderRemoteCursors(file.getUi(), remotes);\n renderRemoteSelections(file.getUi(), remotes);\n };\n awareness.on(\"update\", awarenessHandler);\n cleanupAwareness = () => awareness.off(\"update\", awarenessHandler);\n }\n\n return () => {\n cleanupCursor?.();\n cleanupSelection?.();\n cleanupAwareness?.();\n };\n}\n","import * as Y from \"yjs\";\nimport { type Awareness } from \"y-protocols/awareness\";\nimport { applyFilePatch, generatePatch, initDocSnapshot } from \"./patch\";\nimport { xml2doc } from \"../transformer\";\nimport { bindUndoManager } from \"./undoManager\";\nimport { bindCollaborator } from \"./collaborator\";\nimport { LOCAL_ORIGIN } from \"../helper/origin\";\nimport { key as mxfileKey, type YMxFile } from \"../models/mxfile\";\nimport type { DrawioFile, MxGraphModel } from \"../types/drawio\";\n\nexport interface BindDrawioFileOptions {\n doc: Y.Doc;\n awareness?: Awareness;\n undoManager?: Y.UndoManager;\n mouseMoveThrottle?: number;\n cursor?:\n | boolean\n | {\n userNameKey?: string;\n userColorKey?: string;\n };\n}\n\n/**\n * Y-MXGraph 绑定类,管理 draw.io 文件与 Y.Doc 的双向同步\n */\nexport class Binding {\n /** Y.Doc 实例,用于协同数据存储 */\n readonly doc: Y.Doc;\n /** mxGraph 的数据模型,用于监听本地变更 */\n private mxGraphModel: MxGraphModel;\n /** 本地变更抑制标志,防止循环同步 */\n private suppressLocalApply = false;\n /** mxGraph change 事件监听器 */\n private mxListener: () => void;\n /** Yjs 文档深度变更监听器 */\n private docObserver: (\n events: Y.YEvent<\n Y.XmlElement | Y.Array<string> | Y.Map<Y.XmlElement> | YMxFile\n >[],\n transaction: Y.Transaction,\n ) => void;\n /** 协作功能清理函数(awareness 光标/选区) */\n private cleanupCollaborator?: () => void;\n /** UndoManager 绑定清理函数 */\n private cleanupUndoManager?: () => void;\n\n constructor(file: DrawioFile, options: BindDrawioFileOptions) {\n const { doc, awareness, undoManager, mouseMoveThrottle, cursor } = options;\n\n this.doc = doc;\n\n const ui = file.getUi();\n const graph = ui.editor.graph;\n this.mxGraphModel = graph.model;\n\n const docHasData = doc.share.has(mxfileKey);\n if (!docHasData) {\n xml2doc(file.data, doc);\n }\n\n initDocSnapshot(doc, docHasData);\n\n // 本地变更监听\n this.mxListener = () => {\n if (this.suppressLocalApply) return;\n const patch = file.ui.diffPages(\n file.shadowPages,\n file.ui.pages,\n ) as import(\"./patch\").FilePatch;\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n applyFilePatch(doc, patch, { origin: LOCAL_ORIGIN });\n };\n this.mxGraphModel.addListener(\"change\", this.mxListener);\n\n // 远端变更监听\n this.docObserver = (\n events: Y.YEvent<\n Y.XmlElement | Y.Array<string> | Y.Map<Y.XmlElement> | YMxFile\n >[],\n transaction: Y.Transaction,\n ) => {\n if (transaction.local && transaction.origin === LOCAL_ORIGIN) {\n generatePatch(events);\n return;\n }\n const patch = generatePatch(events);\n this.suppressLocalApply = true;\n try {\n file.patch([patch]);\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n } finally {\n this.suppressLocalApply = false;\n }\n };\n doc.getMap(mxfileKey).observeDeep(this.docObserver);\n\n // doc 已有远端数据时(新客户端加入),立即把 doc 当前状态同步到 draw.io\n if (docHasData) {\n // 直接调用 generatePatch 传入空 events + 当前 doc\n // resetSnapshot=true 使 snapshot.prevDiagramOrder=[], 所有 diagram/cells 被识别为 insert\n const fullPatch = generatePatch([], doc);\n if (Object.keys(fullPatch).length > 0) {\n this.suppressLocalApply = true;\n try {\n file.patch([fullPatch]);\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n } finally {\n this.suppressLocalApply = false;\n }\n }\n }\n\n // 协作功能\n if (awareness) {\n this.cleanupCollaborator = bindCollaborator(file, {\n awareness,\n graph,\n cursor: cursor ?? true,\n mouseMoveThrottle,\n });\n }\n\n // UndoManager\n if (undoManager) {\n this.cleanupUndoManager = bindUndoManager(doc, file, undoManager);\n }\n }\n\n /**\n * 销毁绑定,解除所有监听器\n * @param deep - 是否深度清理(包括 awareness/undoManager),默认 false\n */\n destroy(deep = false): void {\n this.mxGraphModel.removeListener(\"change\", this.mxListener);\n this.doc.getMap(mxfileKey).unobserveDeep(this.docObserver);\n if (deep) {\n this.cleanupCollaborator?.();\n this.cleanupUndoManager?.();\n }\n }\n\n /**\n * 生成标准化的 mxfile XML 模板,用于确保多端协同的数据起点一致。\n *\n * draw.io 每次新建 diagram 时默认生成随机 id(如 `DEMOabHTdChjKBf1yHdD`)。\n * 如果各客户端初始化时的 diagram id 不同,Y.Doc 中的数据与本地 file.data 无法对齐,\n * 会导致:\n * - 后进房间的客户端出现「孤立 page」(来自本地 XML,未写入 Y.Doc)\n * - patch 的 diff 无法正确匹配 diagram/cell id,协同失效\n *\n * 因此业务方应在初始化 draw.io 文件时,先用此方法生成统一起点的 XML,\n * 再注入到 draw.io 的 currentFile 中(详见文档「接入注意事项」)。\n *\n * @param diagramId - diagram 的固定 id,默认 `diagram-0`\n * @returns 最小化的 mxfile XML 字符串\n */\n static generateFileTemplate(diagramId = \"diagram-0\"): string {\n return `<mxfile pages=\"1\">\n <diagram id=\"${diagramId}\">\n <mxGraphModel>\n <root>\n <mxCell id=\"0\" />\n <mxCell id=\"1\" parent=\"0\" />\n </root>\n </mxGraphModel>\n </diagram>\n</mxfile>`;\n }\n\n /**\n * 静态工厂方法,创建 Binding 实例\n * 与 `new Binding()` 等价\n */\n static create(file: DrawioFile, options: BindDrawioFileOptions): Binding {\n return new Binding(file, options);\n }\n}\n"],"names":["key","parse","serializer","serialize","mxCellKey","parseMxCell","serializeMxCell","parseMxGraphModel","mxGraphModelKey","serializeMxGraphModel","diagramKey","parseDiagram","_a","serializeDiagram","mxfileKey","id","orderArr","xmlSerializer","parseMxFile","serializerMxFile","serializerMxGraphModel","CacheKey"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"y-mxgraph.es.js","sources":["../src/helper/xml.ts","../src/models/mxCell.ts","../src/models/mxGraphModel.ts","../src/models/diagram.ts","../src/models/mxfile.ts","../src/binding/patch.ts","../src/transformer/index.ts","../src/helper/origin.ts","../src/binding/undoManager.ts","../src/helper/awarenessStateValue.ts","../src/helper/random.ts","../src/helper/cursor.ts","../src/binding/collaborator/cursor.ts","../src/helper/getId.ts","../src/binding/collaborator/selection.ts","../src/binding/collaborator/index.ts","../src/binding/index.ts"],"sourcesContent":["import { xml2js, js2xml, type ElementCompact } from \"xml-js\";\n\nfunction deepProcess(node: unknown): void {\n if (node == null) return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n deepProcess(item);\n }\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n const obj = node as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (key === \"_attributes\") continue;\n\n let value = obj[key];\n const keyLower = key.toLowerCase();\n\n if (\n (keyLower === \"diagram\" || keyLower === \"mxcell\") &&\n value !== undefined &&\n !Array.isArray(value)\n ) {\n obj[key] = [value];\n value = obj[key];\n }\n\n if (Array.isArray(value)) {\n for (const v of value) deepProcess(v);\n } else if (value && typeof value === \"object\") {\n deepProcess(value);\n }\n }\n}\n\nexport function parse(xml: string) {\n const result = xml2js(xml, { compact: true }) as Record<string, unknown>;\n deepProcess(result);\n return result;\n}\n\nexport function serializer(obj: ElementCompact, spaces = 2) {\n return js2xml(obj, {\n compact: true,\n spaces,\n });\n}\n","import * as Y from \"yjs\";\nimport { xml2js, js2xml } from \"xml-js\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxCell\";\n\nconst mxGeometryKey = \"mxGeometry\";\nconst mxGeometryAttributeKey = \"geometry\";\n\nexport interface MxCellModel extends ElementCompact {\n [mxGeometryKey]?: ElementCompact;\n}\n\nexport function parse(object: MxCellModel): Y.XmlElement {\n const xmlElement = new Y.XmlElement(\"mxCell\");\n\n for (const attribute of Object.keys(object._attributes || {})) {\n xmlElement.setAttribute(\n attribute,\n `${object._attributes?.[attribute] || \"\"}`\n );\n }\n\n if (object[mxGeometryKey]) {\n const geometry = object[mxGeometryKey];\n const geometryString = js2xml(geometry, {\n compact: true,\n });\n xmlElement.setAttribute(mxGeometryAttributeKey, geometryString);\n delete object[mxGeometryKey];\n }\n\n return xmlElement;\n}\n\nexport function serialize(xmlElement: Y.XmlElement) {\n const rawAttributes = {\n ...xmlElement.getAttributes(),\n };\n\n // 提取 mxGeometry(不需要转义,它本身就是 XML 字符串)\n let mxGeometry: ElementCompact | null = null;\n let mxGeometryString: string | undefined;\n\n if (mxGeometryAttributeKey in rawAttributes) {\n mxGeometryString = rawAttributes[mxGeometryAttributeKey];\n delete rawAttributes[mxGeometryAttributeKey];\n }\n\n // 转义其他属性值中的特殊字符\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(rawAttributes)) {\n if (typeof value === 'string') {\n attributes[key] = value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n } else if (value != null) {\n attributes[key] = String(value);\n }\n }\n\n // 解析 mxGeometry\n if (mxGeometryString) {\n try {\n const parsed = xml2js(mxGeometryString, { compact: true }) as Record<string, ElementCompact>;\n mxGeometry = parsed[mxGeometryKey] ?? null;\n if (mxGeometry && mxGeometry._attributes) {\n mxGeometry._attributes[\"as\"] = \"geometry\";\n }\n } catch (e) {\n console.warn(\"[y-mxgraph] Failed to parse mxGeometry:\", e);\n }\n }\n\n const obj: Record<string, unknown> = {\n _attributes: attributes,\n };\n\n if (mxGeometry) {\n obj[mxGeometryKey] = mxGeometry;\n }\n\n return obj;\n}\n","import * as Y from \"yjs\";\n\nimport {\n key as mxCellKey,\n parse as parseMxCell,\n serialize as serializeMxCell,\n type MxCellModel,\n} from \"./mxCell\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxGraphModel\";\nexport const mxCellOrderKey = mxCellKey + \"Order\";\n\nexport interface MxGraphModel extends ElementCompact {\n root: {\n mxCell: MxCellModel[];\n };\n}\n\nexport type YMxGraphModel = Y.Map<unknown>;\n\nexport function parse(object: MxGraphModel, doc?: Y.Doc) {\n const mxCells = (object.root[mxCellKey] || []).map((cell: MxCellModel) => {\n return {\n value: parseMxCell(cell),\n id: (cell._attributes?.id || \"\") as string,\n };\n });\n\n const mxGraphElement = doc?.getMap(key) || new Y.Map();\n\n const cells = new Y.Map<Y.XmlElement>();\n const cellsOrder = new Y.Array<string>();\n\n mxCells.forEach((cell) => {\n cells.set(cell.id, cell.value);\n });\n\n cellsOrder.push(mxCells.map((cell) => cell.id));\n\n mxGraphElement.set(mxCellKey, cells);\n mxGraphElement.set(mxCellOrderKey, cellsOrder);\n\n return mxGraphElement as YMxGraphModel;\n}\n\nexport function serialize(map: YMxGraphModel) {\n const cells = map.get(mxCellKey) as unknown as Y.Map<Y.XmlElement>;\n const cellsOrder = map.get(mxCellOrderKey) as unknown as Y.Array<string>;\n return {\n _attributes: {},\n root: {\n [mxCellKey]: cellsOrder\n .toArray()\n .map((id) => serializeMxCell(cells.get(id) as Y.XmlElement)),\n },\n };\n}\n","import * as Y from \"yjs\";\nimport {\n parse as parseMxGraphModel,\n serialize as serializeMxGraphModel,\n key as mxGraphModelKey,\n type MxGraphModel,\n type YMxGraphModel,\n} from \"./mxGraphModel\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"diagram\";\n\nexport interface Diagram extends ElementCompact {\n mxGraphModel: MxGraphModel;\n}\n\nexport type YDiagram = Y.Map<unknown>;\n\nexport function parse(object: Diagram): YDiagram {\n const yDiagramElement = new Y.Map();\n yDiagramElement.set(\"name\", `${object._attributes?.name || \"\"}`);\n yDiagramElement.set(\"id\", `${object._attributes?.id || \"\"}`);\n\n const mxGraphModel = parseMxGraphModel(object[mxGraphModelKey]);\n\n yDiagramElement.set(mxGraphModelKey, mxGraphModel);\n return yDiagramElement as YDiagram;\n}\n\nexport function serialize(yDiagram: YDiagram) {\n const mxGraphModel = yDiagram.get(mxGraphModelKey) as unknown as\n | YMxGraphModel\n | undefined;\n\n return {\n _attributes: {\n name: yDiagram.get(\"name\") as unknown as string,\n id: yDiagram.get(\"id\") as unknown as string,\n },\n [mxGraphModelKey]: mxGraphModel\n ? serializeMxGraphModel(mxGraphModel)\n : undefined,\n };\n}\n","import * as Y from \"yjs\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n} from \"./diagram\";\nimport type { Diagram, YDiagram } from \"./diagram\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxfile\";\nexport const diagramOrderKey = diagramKey + \"Order\";\n\nexport type YMxFile = Y.Map<unknown>;\n\nexport interface MxFile extends ElementCompact {\n diagram: Diagram[];\n}\n\nexport function parse(object: MxFile, doc: Y.Doc) {\n const mxfile = doc.getMap(key);\n mxfile.set(\"pages\", (object._attributes?.pages || \"1\") + \"\");\n\n const diagramList = object.diagram.map((diagram) => ({\n value: parseDiagram(diagram),\n id: (diagram._attributes?.id || \"\") as string,\n }));\n const diagramMap = new Y.Map<YDiagram>();\n const diagramOrder = new Y.Array<string>();\n diagramList.forEach((diagram) => {\n diagramMap.set(diagram.id, diagram.value);\n });\n diagramOrder.push(diagramList.map((diagram) => diagram.id));\n\n mxfile.set(diagramKey, diagramMap);\n mxfile.set(diagramOrderKey, diagramOrder);\n return mxfile;\n}\n\nexport function serializer(yMxFile: YMxFile): ElementCompact {\n const diagrams = yMxFile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const diagramOrder = yMxFile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n\n const orderIds = diagramOrder ? diagramOrder.toArray() : [];\n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const ids = orderIds.length > 0 ? orderIds : (diagrams ? Array.from(diagrams.keys()) : []);\n\n const obj: Record<string, unknown> = {\n _attributes: {\n pages: (yMxFile.get(\"pages\") as string) || \"1\",\n },\n [diagramKey]: ids\n .map((id) => diagrams.get(id) as unknown as YDiagram)\n .filter((d): d is YDiagram => !!d)\n .map((diagramElement) => serializeDiagram(diagramElement)),\n };\n\n return obj as ElementCompact;\n}\n","import { parse, serializer as xmlSerializer } from \"../helper/xml\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n type YDiagram,\n} from \"../models/diagram\";\nimport {\n key as mxfileKey,\n type YMxFile,\n diagramOrderKey,\n} from \"../models/mxfile\";\nimport {\n mxCellOrderKey,\n key as mxGraphModelKey,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\nimport { key as mxCellKey } from \"../models/mxCell\";\nimport * as Y from \"yjs\";\n\nconst DIFF_INSERT = \"i\";\nconst DIFF_REMOVE = \"r\";\nconst DIFF_UPDATE = \"u\";\n\ntype DocSnapshot = {\n diagramOrder: string[] | null;\n cellsOrder: Map<string, string[]>;\n cellAttrs: Map<string, Map<string, Record<string, string>>>;\n};\nconst docSnapshots = new WeakMap<Y.Doc, DocSnapshot>();\n\nfunction insertAfterUnique(\n orderArr: Y.Array<string>,\n id: string,\n previous: string | null | undefined,\n fallbackToEnd = false,\n) {\n const currentIds = orderArr.toArray();\n let anchorPos = previous ? currentIds.indexOf(previous) : -1;\n if (anchorPos === -1 && fallbackToEnd) anchorPos = currentIds.length - 1;\n let targetIndex = anchorPos + 1;\n\n const existingIndex = currentIds.indexOf(id);\n if (existingIndex === -1) {\n orderArr.insert(targetIndex, [id]);\n return;\n }\n\n if (existingIndex === targetIndex) return;\n\n if (existingIndex < targetIndex) targetIndex -= 1;\n orderArr.delete(existingIndex, 1);\n orderArr.insert(targetIndex, [id]);\n}\n\nfunction ensureUniqueOrder(orderArr: Y.Array<string>) {\n const arr = orderArr.toArray();\n const seen = new Set<string>();\n const dupIdx: number[] = [];\n for (let i = 0; i < arr.length; i++) {\n const id = arr[i];\n if (!id) continue;\n if (seen.has(id)) dupIdx.push(i);\n else seen.add(id);\n }\n if (dupIdx.length) {\n dupIdx.sort((a, b) => b - a).forEach((idx) => orderArr.delete(idx, 1));\n }\n}\n\nexport interface DiagramInsert {\n data: string;\n id: string;\n previous: string;\n}\n\nexport interface FilePatch {\n [DIFF_REMOVE]?: string[];\n [DIFF_INSERT]?: DiagramInsert[];\n [DIFF_UPDATE]?: {\n [key: string]: {\n name?: string;\n previous?: string;\n cells?: {\n [DIFF_REMOVE]?: string[];\n [DIFF_INSERT]?: Record<string, string>[];\n [DIFF_UPDATE]?: {\n [key: string]: Record<string, string>;\n };\n };\n };\n };\n}\n\nexport function applyFilePatch(\n doc: Y.Doc,\n patch: FilePatch,\n options?: { origin?: unknown },\n) {\n doc.transact(() => {\n const mxfile = doc.getMap(mxfileKey) as YMxFile;\n if (patch[DIFF_REMOVE]) {\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n ensureUniqueOrder(orderArr);\n const orderList = orderArr.toArray();\n\n const removeIds = patch[DIFF_REMOVE];\n if (removeIds && removeIds.length) {\n const indexList = removeIds\n .map((id) => orderList.indexOf(id))\n .filter((i) => i !== -1)\n .sort((a, b) => b - a);\n\n indexList.forEach((idx) => orderArr.delete(idx, 1));\n removeIds.forEach((id) => diagramsMap.delete(id));\n }\n }\n\n if (patch[DIFF_INSERT]) {\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n ensureUniqueOrder(orderArr);\n \n // 确保 diagramOrder 包含所有 diagram map 中的 IDs\n const currentOrder = orderArr.toArray();\n if (currentOrder.length === 0 && diagramsMap && diagramsMap.size > 0) {\n const allIds = Array.from(diagramsMap.keys());\n orderArr.push(allIds);\n }\n ensureUniqueOrder(orderArr);\n \n const existingIds = orderArr.toArray();\n const existingIndex = new Map<string, number>();\n existingIds.forEach((id, idx) => existingIndex.set(id, idx));\n\n const inserts = patch[DIFF_INSERT].map((item, order) => {\n const object = parse(item.data) as Record<string, unknown>;\n const diagramObj = Array.isArray(object?.diagram)\n ? (object.diagram as unknown[])[0]\n : object?.diagram;\n const diagramElement = parseDiagram(\n diagramObj as import(\"../models/diagram\").Diagram,\n );\n return {\n id: item.id,\n previous: item.previous || \"\",\n diagramElement,\n order,\n };\n });\n\n const byId = new Map(inserts.map((i) => [i.id, i] as const));\n const computeAnchor = (node: {\n id: string;\n previous: string;\n }): {\n anchorId: string;\n depth: number;\n } => {\n let depth = 1;\n let anchorId = \"\";\n let prevId = node.previous;\n const seen = new Set<string>([node.id]);\n while (prevId) {\n if (seen.has(prevId)) {\n depth = 1;\n anchorId = \"\";\n break;\n }\n seen.add(prevId);\n\n const prevNode = byId.get(prevId);\n if (prevNode) {\n depth += 1;\n prevId = prevNode.previous;\n continue;\n }\n\n if (existingIndex.has(prevId)) {\n anchorId = prevId;\n } else {\n anchorId = \"\";\n }\n break;\n }\n return { anchorId, depth };\n };\n\n const enriched = inserts.map((i) => ({ ...i, ...computeAnchor(i) }));\n\n enriched.sort((a, b) => {\n const aIdx = a.anchorId ? existingIndex.get(a.anchorId)! : -1;\n const bIdx = b.anchorId ? existingIndex.get(b.anchorId)! : -1;\n if (aIdx !== bIdx) return aIdx - bIdx;\n if (a.depth !== b.depth) return b.depth - a.depth;\n return b.order - a.order;\n });\n\n for (const item of enriched) {\n diagramsMap.set(item.id, item.diagramElement);\n insertAfterUnique(orderArr, item.id, item.anchorId || null);\n }\n }\n\n if (patch[DIFF_UPDATE]) {\n Object.keys(patch[DIFF_UPDATE]).forEach((id) => {\n const diagramsMap = mxfile.get(\n diagramKey,\n ) as unknown as Y.Map<YDiagram>;\n const diagram = diagramsMap.get(id) as YDiagram | undefined;\n if (diagram) {\n const update = patch[DIFF_UPDATE]![id];\n if (\"name\" in update) {\n (diagram as unknown as Y.Map<unknown>).set(\n \"name\",\n update.name || \"\",\n );\n }\n\n if (update.cells) {\n const yMxGraphModel = diagram.get(mxGraphModelKey) as\n | YMxGraphModel\n | undefined;\n if (!yMxGraphModel) return;\n const cellsMap = yMxGraphModel.get(mxCellKey) as\n | Y.Map<Y.XmlElement>\n | undefined;\n const orderArr = yMxGraphModel.get(mxCellOrderKey) as\n | Y.Array<string>\n | undefined;\n if (!cellsMap || !orderArr) return;\n ensureUniqueOrder(orderArr as Y.Array<string>);\n\n if (update.cells[DIFF_REMOVE] && update.cells[DIFF_REMOVE].length) {\n const orderIds = orderArr.toArray();\n const removeIndexList = update.cells[DIFF_REMOVE].map((cid) =>\n orderIds.indexOf(cid),\n )\n .filter((i) => i !== -1)\n .sort((a, b) => b - a);\n removeIndexList.forEach((idx) => orderArr.delete(idx, 1));\n update.cells[DIFF_REMOVE].forEach((cid) => cellsMap.delete(cid));\n }\n\n if (update.cells[DIFF_INSERT] && update.cells[DIFF_INSERT].length) {\n for (const item of update.cells[DIFF_INSERT]) {\n const id = item[\"id\"] as string | undefined;\n if (!id) continue;\n const xmlElement = new Y.XmlElement(\"mxCell\");\n Object.keys(item).forEach((key) => {\n if (key === \"previous\") return;\n xmlElement.setAttribute(key, item[key]);\n });\n cellsMap.set(id, xmlElement);\n const previous = item[\"previous\"] as string | undefined;\n const parent = item[\"parent\"] as string | undefined;\n let anchorId: string | null | undefined = null;\n let fallbackToEnd = true;\n if (typeof previous !== \"undefined\") {\n if (previous === \"\") {\n if (parent) {\n anchorId = parent;\n fallbackToEnd = true;\n } else {\n anchorId = null;\n fallbackToEnd = false;\n }\n } else {\n anchorId = previous;\n fallbackToEnd = true;\n }\n } else if (parent) {\n anchorId = parent;\n fallbackToEnd = true;\n }\n\n insertAfterUnique(\n orderArr as Y.Array<string>,\n id,\n anchorId,\n fallbackToEnd,\n );\n }\n }\n\n if (update.cells[DIFF_UPDATE]) {\n Object.keys(update.cells[DIFF_UPDATE]).forEach((cid) => {\n const updateObj = update.cells![DIFF_UPDATE]![cid];\n const cell = cellsMap.get(cid) as Y.XmlElement | undefined;\n if (cell) {\n Object.keys(updateObj).forEach((k) => {\n if (k === \"previous\") return;\n cell.setAttribute(k, updateObj[k]);\n });\n }\n });\n\n Object.keys(update.cells[DIFF_UPDATE]).forEach((cellId) => {\n const updateObj = update.cells![DIFF_UPDATE]![cellId];\n const hasPrev = \"previous\" in updateObj;\n const hasParent = \"parent\" in updateObj;\n if (!hasPrev && !hasParent) return;\n\n const prevVal = hasPrev\n ? (updateObj.previous as string)\n : undefined;\n const parentVal = hasParent\n ? (updateObj.parent as string)\n : undefined;\n\n let anchorId: string | null | undefined = null;\n let fallbackToEnd = true;\n\n if (hasPrev) {\n if (prevVal === \"\") {\n if (parentVal) {\n anchorId = parentVal;\n fallbackToEnd = true;\n } else {\n anchorId = null;\n fallbackToEnd = false;\n }\n } else {\n anchorId = prevVal;\n fallbackToEnd = true;\n }\n } else if (parentVal) {\n anchorId = parentVal;\n fallbackToEnd = true;\n }\n\n const currentIds = orderArr.toArray();\n const currentIndex = currentIds.indexOf(cellId);\n\n if (currentIndex === -1) {\n let newCell = cellsMap.get(cellId) as\n | Y.XmlElement\n | undefined;\n if (!newCell) {\n newCell = new Y.XmlElement(\"mxCell\");\n newCell.setAttribute(\"id\", cellId);\n Object.keys(updateObj).forEach((k) => {\n if (k === \"previous\") return;\n newCell!.setAttribute(k, updateObj[k] as string);\n });\n cellsMap.set(cellId, newCell);\n }\n insertAfterUnique(\n orderArr as Y.Array<string>,\n cellId,\n anchorId,\n fallbackToEnd,\n );\n return;\n }\n\n insertAfterUnique(\n orderArr as Y.Array<string>,\n cellId,\n anchorId,\n fallbackToEnd,\n );\n });\n }\n }\n\n if (\"previous\" in update) {\n const previous = update.previous || null;\n const orderArr = mxfile.get(\n diagramOrderKey,\n ) as unknown as Y.Array<string>;\n ensureUniqueOrder(orderArr);\n insertAfterUnique(orderArr, id, previous, false);\n }\n }\n });\n }\n }, options?.origin);\n}\n\nexport function initDocSnapshot(doc: Y.Doc, resetSnapshot = false) {\n try {\n const mxfile = doc.getMap(mxfileKey) as YMxFile;\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(diagramOrderKey) as unknown as Y.Array<string>;\n \n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const orderIds = orderArr ? orderArr.toArray() : [];\n const allDiagramIds = orderIds.length > 0 \n ? orderIds \n : (diagramsMap ? Array.from(diagramsMap.keys()) : []);\n \n // resetSnapshot=true 时把 diagramOrder 设为空数组,\n // 使第一次 generatePatch 把所有现有 diagram/cells 都识别为 insert\n const diagramOrder = resetSnapshot ? [] : allDiagramIds.slice();\n\n const snap: DocSnapshot = {\n diagramOrder,\n cellsOrder: new Map<string, string[]>(),\n cellAttrs: new Map<string, Map<string, Record<string, string>>>(),\n };\n\n const diagrams: YDiagram[] = diagramOrder\n .map((id) => diagramsMap.get(id) as YDiagram | undefined)\n .filter((d): d is YDiagram => !!d);\n for (const d of diagrams) {\n const did = (d.get(\"id\") as unknown as string) || \"\";\n if (!did) continue;\n const gm = d.get(mxGraphModelKey) as YMxGraphModel | undefined;\n if (gm) {\n const order = gm.get(mxCellOrderKey) as Y.Array<string> | undefined;\n const ids = order ? order.toArray().slice() : [];\n snap.cellsOrder.set(did, ids);\n const cellsMap = gm.get(mxCellKey) as Y.Map<Y.XmlElement> | undefined;\n const attrMap = new Map<string, Record<string, string>>();\n if (cellsMap) {\n for (const cid of ids) {\n const el = cellsMap.get(cid) as Y.XmlElement | undefined;\n if (el) {\n attrMap.set(\n cid,\n (el.getAttributes() as Record<string, string>) || {},\n );\n }\n }\n }\n snap.cellAttrs.set(did, attrMap);\n } else {\n snap.cellsOrder.set(did, []);\n snap.cellAttrs.set(did, new Map());\n }\n }\n\n docSnapshots.set(doc, snap);\n } catch (e) {\n console.warn(\"[y-mxgraph] initDocSnapshot failed:\", e);\n }\n}\n\nexport function generatePatch(\n events: Y.YEvent<\n Y.XmlElement | Y.Array<string> | Y.Map<Y.XmlElement> | YMxFile | YDiagram\n >[],\n explicitDoc?: Y.Doc,\n): FilePatch {\n const patch: FilePatch = {};\n\n const doc =\n explicitDoc ??\n (events[0] as unknown as { transaction?: { doc?: Y.Doc } } | undefined)\n ?.transaction?.doc;\n if (!doc) return patch;\n if (!explicitDoc && (!events || events.length === 0)) return patch;\n const mxfile = doc.getMap(mxfileKey) as YMxFile;\n const diagramsMap = mxfile.get(diagramKey) as unknown as Y.Map<YDiagram>;\n const orderArr = mxfile.get(diagramOrderKey) as unknown as Y.Array<string>;\n\n let snap = docSnapshots.get(doc);\n if (!snap) {\n snap = {\n diagramOrder: null,\n cellsOrder: new Map<string, string[]>(),\n cellAttrs: new Map<string, Map<string, Record<string, string>>>(),\n };\n docSnapshots.set(doc, snap);\n }\n const prevDiagramOrder = snap.diagramOrder;\n const prevCellsOrder = snap.cellsOrder;\n const prevCellsAttrs = snap.cellAttrs;\n\n const ensureUpdate = (diagramId: string) => {\n patch[DIFF_UPDATE] = patch[DIFF_UPDATE] || {};\n patch[DIFF_UPDATE]![diagramId] = patch[DIFF_UPDATE]![diagramId] || {};\n return patch[DIFF_UPDATE]![diagramId]!;\n };\n const ensureCellSection = (diagramId: string) => {\n const u = ensureUpdate(diagramId);\n u.cells = u.cells || {};\n return u.cells!;\n };\n\n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const orderIds = orderArr.toArray();\n const currDiagramOrder = orderIds.length > 0 \n ? orderIds \n : (diagramsMap ? Array.from(diagramsMap.keys()) : []);\n const diagramsList = currDiagramOrder\n .map((id) => diagramsMap.get(id) as YDiagram | undefined)\n .filter((d): d is YDiagram => !!d);\n const currCellsOrder = new Map<string, string[]>();\n const cellAttrMap = new Map<string, Map<string, Record<string, string>>>();\n\n for (const d of diagramsList) {\n const did = (d.get(\"id\") as unknown as string) || \"\";\n const attrs = new Map<string, Record<string, string>>();\n const gm = d.get(mxGraphModelKey) as YMxGraphModel | undefined;\n if (gm) {\n const cellsMap = gm.get(mxCellKey) as Y.Map<Y.XmlElement> | undefined;\n const orderArr = gm.get(mxCellOrderKey) as Y.Array<string> | undefined;\n if (cellsMap && orderArr) {\n const ids = orderArr.toArray();\n currCellsOrder.set(did, ids);\n for (const cid of ids) {\n const c = cellsMap.get(cid) as Y.XmlElement | undefined;\n if (c)\n attrs.set(cid, (c.getAttributes() as Record<string, string>) || {});\n }\n } else {\n currCellsOrder.set(did, []);\n }\n } else {\n currCellsOrder.set(did, []);\n }\n cellAttrMap.set(did, attrs);\n }\n\n const insertedDiagramIdGlobal = new Set<string>();\n const insertedCellIdGlobal = new Set<string>();\n\n if (prevDiagramOrder) {\n const prevSet = new Set(prevDiagramOrder);\n const currSet = new Set(currDiagramOrder);\n\n const removed = prevDiagramOrder.filter(\n (id: string) => !currSet.has(id) && id,\n );\n if (removed.length) patch[DIFF_REMOVE] = removed;\n const removedDiagramSet = new Set(removed);\n\n const inserted = currDiagramOrder.filter(\n (id: string) => !prevSet.has(id) && id,\n );\n if (inserted.length) {\n patch[DIFF_INSERT] = patch[DIFF_INSERT] || [];\n for (const id of inserted) {\n const index = currDiagramOrder.indexOf(id);\n const previous = index <= 0 ? \"\" : currDiagramOrder[index - 1];\n const yDiagram = diagramsMap.get(id) as YDiagram | undefined;\n if (!yDiagram) continue;\n const data = xmlSerializer({ diagram: serializeDiagram(yDiagram) });\n patch[DIFF_INSERT]!.push({ id, previous, data });\n insertedDiagramIdGlobal.add(id);\n }\n }\n\n const prevNeighbor = (order: string[], id: string) => {\n const i = order.indexOf(id);\n return i <= 0 ? \"\" : order[i - 1];\n };\n const common = currDiagramOrder.filter((id) => prevSet.has(id) && id);\n for (const id of common) {\n const prevP = prevNeighbor(prevDiagramOrder, id);\n const currP = prevNeighbor(currDiagramOrder, id);\n if (prevP !== currP) {\n if (prevP && removedDiagramSet.has(prevP)) continue;\n const u = ensureUpdate(id);\n u.previous = currP;\n }\n }\n }\n\n const allDiagramIds = new Set<string>([\n ...(prevDiagramOrder || []),\n ...currDiagramOrder,\n ]);\n for (const did of allDiagramIds) {\n if (!did) continue;\n const prevCells = prevCellsOrder.get(did) || [];\n const currCells = currCellsOrder.get(did) || [];\n if (!prevCells.length && !currCells.length) continue;\n\n const prevSet = new Set(prevCells);\n const currSet = new Set(currCells);\n\n const removed = prevCells.filter((cid: string) => !currSet.has(cid) && cid);\n if (removed.length) {\n const cells = ensureCellSection(did);\n cells[DIFF_REMOVE] = (cells[DIFF_REMOVE] || []).concat(removed);\n }\n const removedCellSet = new Set(removed);\n\n const inserted = currCells.filter(\n (cid: string) => !prevSet.has(cid) && cid,\n );\n if (inserted.length) {\n const cells = ensureCellSection(did);\n cells[DIFF_INSERT] = cells[DIFF_INSERT] || [];\n const attrsMap = cellAttrMap.get(did) || new Map();\n for (const cid of inserted) {\n const attrs = attrsMap.get(cid) || {};\n const index = currCells.indexOf(cid);\n const previous = index <= 0 ? \"\" : currCells[index - 1];\n cells[DIFF_INSERT]!.push({\n ...(attrs as Record<string, string>),\n previous,\n });\n insertedCellIdGlobal.add(cid);\n }\n }\n\n const prevNeighbor = (order: string[], id: string) => {\n const i = order.indexOf(id);\n return i <= 0 ? \"\" : order[i - 1];\n };\n const commonCells = currCells.filter((cid) => prevSet.has(cid) && cid);\n for (const cid of commonCells) {\n const prevP = prevNeighbor(prevCells, cid);\n const currP = prevNeighbor(currCells, cid);\n if (prevP !== currP) {\n if (prevP && removedCellSet.has(prevP)) continue;\n const cells = ensureCellSection(did);\n cells[DIFF_UPDATE] = cells[DIFF_UPDATE] || {};\n const cellUpdate = (cells[DIFF_UPDATE]![cid] =\n cells[DIFF_UPDATE]![cid] || {});\n (cellUpdate as Record<string, unknown>).previous = currP;\n }\n }\n }\n\n {\n const diagramSet = new Set<Y.Map<unknown>>(\n diagramsList as unknown as Y.Map<unknown>[],\n );\n for (const ev of events) {\n const target = (ev as unknown as { target?: unknown }).target;\n if (!(target instanceof Y.Map)) continue;\n if (!diagramSet.has(target)) continue;\n const changed: Set<string> =\n (ev as unknown as { keysChanged?: Set<string> }).keysChanged ||\n new Set();\n if (!changed || !changed.has(\"name\")) continue;\n const did = (target.get(\"id\") as unknown as string) || \"\";\n if (!did || insertedDiagramIdGlobal.has(did)) continue;\n const u = ensureUpdate(did);\n u.name = (target.get(\"name\") as unknown as string) || \"\";\n }\n }\n\n if (!prevDiagramOrder) {\n for (const d of diagramsList) {\n const did = (d.get(\"id\") as unknown as string) || \"\";\n if (!did) continue;\n const u = ensureUpdate(did);\n u.name = (d.get(\"name\") as unknown as string) || \"\";\n }\n }\n\n for (const ev of events) {\n const target = (ev as unknown as { target?: unknown }).target;\n if (!(target instanceof Y.XmlElement)) continue;\n const el = target as Y.XmlElement;\n if (el.nodeName !== \"mxCell\") continue;\n\n const changed: Set<string> =\n (ev as unknown as { attributesChanged?: Set<string> })\n .attributesChanged ||\n (ev as unknown as { keysChanged?: Set<string> }).keysChanged ||\n new Set();\n if (!changed || (changed as Set<string>).size === 0) continue;\n\n const cellId = el.getAttribute(\"id\");\n if (!cellId || insertedCellIdGlobal.has(cellId)) continue;\n\n const idsEntries = Array.from(currCellsOrder.entries());\n let diagramId = \"\";\n for (const [did, ids] of idsEntries) {\n if (ids.includes(cellId)) {\n diagramId = did;\n break;\n }\n }\n if (!diagramId) continue;\n\n const cellsPatch = ensureCellSection(diagramId);\n cellsPatch[DIFF_UPDATE] = cellsPatch[DIFF_UPDATE] || {};\n const cellUpdate = (cellsPatch[DIFF_UPDATE]![cellId] =\n cellsPatch[DIFF_UPDATE]![cellId] || {});\n for (const key of Array.from(changed)) {\n cellUpdate[key] = el.getAttribute(key) || \"\";\n }\n }\n\n if (prevDiagramOrder) {\n for (const [did, currAttrsMap] of cellAttrMap.entries()) {\n const prevAttrsMap =\n prevCellsAttrs.get(did) || new Map<string, Record<string, string>>();\n const cellsPatch = ensureCellSection(did);\n cellsPatch[DIFF_UPDATE] = cellsPatch[DIFF_UPDATE] || {};\n const updateBucket = cellsPatch[DIFF_UPDATE]!;\n\n const currCells = currAttrsMap.keys();\n for (const cid of currCells) {\n if (insertedCellIdGlobal.has(cid)) continue;\n const prevAttrs = prevAttrsMap.get(cid) || {};\n const currAttrs = currAttrsMap.get(cid) || {};\n const keys = new Set<string>([\n ...Object.keys(prevAttrs),\n ...Object.keys(currAttrs),\n ]);\n const cellUpdate = (updateBucket[cid] = updateBucket[cid] || {});\n let changed = false;\n for (const k of keys) {\n const pv = prevAttrs[k] ?? \"\";\n const cv = currAttrs[k] ?? \"\";\n if (pv !== cv) {\n cellUpdate[k] = cv;\n changed = true;\n }\n }\n if (!changed) {\n if (Object.keys(cellUpdate).length === 0) {\n delete updateBucket[cid];\n }\n }\n }\n }\n }\n\n snap.diagramOrder = currDiagramOrder.slice();\n const newCellsOrder = new Map<string, string[]>();\n const newCellsAttrs = new Map<string, Map<string, Record<string, string>>>();\n for (const [did, arr] of currCellsOrder.entries()) {\n newCellsOrder.set(did, arr.slice());\n }\n for (const [did, attrsMap] of cellAttrMap.entries()) {\n const copy = new Map<string, Record<string, string>>();\n for (const [cid, attrs] of attrsMap.entries()) {\n copy.set(cid, { ...attrs });\n }\n newCellsAttrs.set(did, copy);\n }\n snap.cellsOrder = newCellsOrder;\n snap.cellAttrs = newCellsAttrs;\n docSnapshots.set(doc, snap);\n\n return patch;\n}\n","import * as Y from \"yjs\";\nimport { parse, serializer } from \"../helper/xml\";\nimport {\n parse as parseMxFile,\n key as mxfileKey,\n serializer as serializerMxFile,\n type YMxFile,\n} from \"../models/mxfile\";\nimport {\n parse as parseMxGraphModel,\n key as mxGraphModelKey,\n serialize as serializerMxGraphModel,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\n\nexport function xml2doc(xml: string, doc: Y.Doc): Y.Doc {\n const object = parse(xml);\n\n const mxfile = (object as Record<string, unknown>).mxfile;\n const mxGraphModel = (object as Record<string, unknown>).mxGraphModel;\n if (mxfile) {\n doc.transact(() => {\n parseMxFile(mxfile as import(\"../models/mxfile\").MxFile, doc);\n });\n } else if (mxGraphModel) {\n doc.transact(() => {\n parseMxGraphModel(mxGraphModel as import(\"../models/mxGraphModel\").MxGraphModel, doc);\n });\n } else {\n throw new Error(\"不支持的文件格式\");\n }\n\n return doc;\n}\n\nexport function doc2xml(doc: Y.Doc, spaces = 0): string {\n if (doc.share.has(mxfileKey)) {\n return serializer(\n {\n [mxfileKey]: serializerMxFile(\n doc.share.get(mxfileKey) as unknown as YMxFile,\n ),\n },\n spaces,\n );\n } else if (doc.share.has(mxGraphModelKey)) {\n return serializer(\n {\n [mxGraphModelKey]: serializerMxGraphModel(\n doc.share.get(mxGraphModelKey) as unknown as YMxGraphModel,\n ),\n },\n spaces,\n );\n }\n\n return \"\";\n}\n","/**\n * 本地修改事务的 origin 标记,供 UndoManager.trackedOrigins 使用。\n * 对外导出,外部创建 Y.UndoManager 时可将其加入 trackedOrigins,\n * 以确保只追踪 binding 内部产生的本地变更。\n */\nexport const LOCAL_ORIGIN: object = {};\n","/**\n * 绑定 Y.UndoManager 到 draw.io 的 editor.undoManager,提供 mxUndoManager 兼容层。\n * 仅在外部传入 undoManager 时调用。\n */\nimport * as Y from \"yjs\";\nimport { LOCAL_ORIGIN } from \"../helper/origin\";\nimport type { DrawioFile } from \"../types/drawio\";\n\ntype ListenerFn = (sender: unknown, evt?: unknown) => void;\n\nfunction createMxEventObject(name: string, props?: Record<string, unknown>) {\n const _props = props || {};\n return {\n name,\n getName: () => name,\n getProperty: (k: string) => _props[k],\n };\n}\n\nexport function bindUndoManager(doc: Y.Doc, file: DrawioFile, yUndo: Y.UndoManager) {\n const editor = file.getUi().editor;\n const originUndoManager = editor.undoManager;\n\n let lastTxnLocalOrigin = false;\n const beforeTxnHandler = (t: Y.Transaction) => {\n lastTxnLocalOrigin = !!(t.local || t.origin === LOCAL_ORIGIN);\n };\n const afterTxnHandler = (t: Y.Transaction) => {\n lastTxnLocalOrigin = !!(t.local || t.origin === LOCAL_ORIGIN);\n };\n doc.on(\"beforeTransaction\", beforeTxnHandler);\n doc.on(\"afterTransaction\", afterTxnHandler);\n\n const pairs: Array<[string, ListenerFn]> = [];\n const raw = Array.isArray(originUndoManager?.eventListeners)\n ? (originUndoManager.eventListeners as unknown[])\n : [];\n for (let i = 0; i + 1 < raw.length; i += 2) {\n const key = String(raw[i]);\n const fn = raw[i + 1] as ListenerFn;\n pairs.push([key, fn]);\n }\n\n const mxLike: Record<string, unknown> & {\n eventListeners: Array<string | ListenerFn>;\n history: unknown[];\n indexOfNextAdd: number;\n _y: Y.UndoManager;\n addListener(name: string, fn: ListenerFn): void;\n fireEvent(evt: unknown): void;\n clear(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n undo(): void;\n redo(): void;\n undoableEditHappened(_edit: unknown): void;\n } = {\n eventListeners: [] as Array<string | ListenerFn>,\n history: [] as unknown[],\n indexOfNextAdd: 0,\n _y: yUndo,\n\n addListener(name: string, fn: ListenerFn) {\n this.eventListeners.push(name, fn);\n },\n\n fireEvent(evt: unknown) {\n const eventName: string =\n (evt as { name?: string } | undefined)?.name ||\n ((evt as { getName?: () => string } | undefined)?.getName?.() ?? \"\");\n for (let i = 0; i + 1 < this.eventListeners.length; i += 2) {\n const key = this.eventListeners[i];\n const listener = this.eventListeners[i + 1] as ListenerFn;\n if (key === eventName) {\n try {\n listener(this, evt);\n } catch (e) {\n console.warn(\"[y-mxgraph] undoManager event listener error:\", e);\n }\n }\n }\n },\n\n clear() {\n if (typeof this._y.clear === \"function\") {\n this._y.clear();\n } else {\n while (this._y.canUndo && this._y.canUndo()) this._y.undo();\n while (this._y.canRedo && this._y.canRedo()) this._y.redo();\n }\n this.history = [];\n this.indexOfNextAdd = 0;\n this.fireEvent(createMxEventObject(\"clear\"));\n },\n\n canUndo(): boolean {\n return typeof this._y.canUndo === \"function\" && this._y.canUndo();\n },\n\n canRedo(): boolean {\n return typeof this._y.canRedo === \"function\" && this._y.canRedo();\n },\n\n undo() {\n this._y.undo();\n },\n\n redo() {\n this._y.redo();\n },\n\n undoableEditHappened() {\n // no-op: 让 yjs 基于事务决定是否入栈\n },\n };\n\n type YUndoEventName = \"stack-item-added\" | \"stack-cleared\" | \"stack-item-popped\" | \"stack-item-updated\";\n const bridgeHandlers: Array<[YUndoEventName, () => void]> = [];\n const bridge = (mxEventName: \"add\" | \"clear\", yEventName: YUndoEventName) => {\n const handler = () => {\n if (mxEventName !== \"clear\" && !lastTxnLocalOrigin) {\n return;\n }\n switch (mxEventName) {\n case \"add\": {\n if (mxLike.indexOfNextAdd < mxLike.history.length) {\n mxLike.history.splice(\n mxLike.indexOfNextAdd,\n mxLike.history.length - mxLike.indexOfNextAdd,\n );\n }\n mxLike.history.push({});\n mxLike.indexOfNextAdd = mxLike.history.length;\n break;\n }\n case \"clear\": {\n mxLike.history = [];\n mxLike.indexOfNextAdd = 0;\n break;\n }\n }\n\n const evt = createMxEventObject(mxEventName, { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n };\n yUndo.on(yEventName, handler);\n bridgeHandlers.push([yEventName, handler]);\n };\n\n bridge(\"add\", \"stack-item-added\");\n bridge(\"clear\", \"stack-cleared\");\n\n const poppedHandler = (e: { type?: string; reason?: string; kind?: string }) => {\n const t = e && (e.type || e.reason || e.kind);\n if (t === \"undo\") {\n if (mxLike.indexOfNextAdd > 0) mxLike.indexOfNextAdd--;\n const evt = createMxEventObject(\"undo\", { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n } else if (t === \"redo\") {\n if (mxLike.indexOfNextAdd < mxLike.history.length)\n mxLike.indexOfNextAdd++;\n const evt = createMxEventObject(\"redo\", { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n }\n };\n yUndo.on(\"stack-item-popped\", poppedHandler);\n\n const updatedHandler = () => {\n const evt = createMxEventObject(\"redo\", { edit: { changes: [] } });\n mxLike.fireEvent(evt);\n };\n yUndo.on(\"stack-item-updated\", updatedHandler);\n\n pairs.forEach(([key, fn]) => {\n const k = key.toLowerCase();\n if (k === \"add\" || k === \"clear\" || k === \"undo\" || k === \"redo\") {\n mxLike.addListener(k, fn);\n }\n });\n\n editor.undoManager = mxLike;\n\n editor.undoListener = function () {\n // no-op in yjs mode\n };\n\n const destroy = () => {\n doc.off(\"beforeTransaction\", beforeTxnHandler);\n doc.off(\"afterTransaction\", afterTxnHandler);\n bridgeHandlers.forEach(([event, handler]) => {\n yUndo.off(event, handler);\n });\n yUndo.off(\"stack-item-popped\", poppedHandler);\n yUndo.off(\"stack-item-updated\", updatedHandler);\n // 恢复原始 undoManager\n editor.undoManager = originUndoManager;\n editor.undoListener = originUndoManager?.undoListener;\n };\n\n return destroy;\n}\n","import { type Awareness } from \"y-protocols/awareness\";\n\nexport function getAwarenessStateValue<T>(\n awareness: Awareness,\n key: string,\n clientId?: string | number\n): T | null {\n const states = awareness.getStates();\n const id = clientId != null ? Number(clientId) : awareness.clientID;\n const clientState = states.get(id as number);\n if (!clientState) return null;\n if (!key) return clientState as T;\n return getByPath(clientState, key) as T | null;\n}\n\nfunction getByPath(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const part of parts) {\n if (cur == null) return null;\n const key: string | number =\n Array.isArray(cur) && /^\\d+$/.test(part) ? Number(part) : part;\n cur = (cur as Record<string, unknown>)?.[key];\n }\n return cur;\n}\n\nexport function setAwarenessStateValue(\n awareness: Awareness,\n key: string,\n value: unknown,\n clientId?: string | number\n): boolean {\n const id = clientId != null ? Number(clientId) : awareness.clientID;\n if (id !== awareness.clientID) return false;\n if (!key) {\n awareness.setLocalState(value as Record<string, unknown>);\n return true;\n }\n const current = (awareness.getLocalState() || {}) as Record<string, unknown>;\n const next = setByPath(current, key, value);\n awareness.setLocalState(next);\n return true;\n}\n\nfunction setByPath(obj: unknown, path: string, value: unknown): Record<string, unknown> {\n const parts = path.split(\".\");\n const root = Array.isArray(obj) ? obj.slice() : { ...(obj as Record<string, unknown>) };\n let cur: Record<string | number, unknown> = root as Record<string | number, unknown>;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isIndex = /^\\d+$/.test(part);\n const key: string | number = isIndex ? Number(part) : part;\n const isLast = i === parts.length - 1;\n if (isLast) {\n cur[key] = value;\n } else {\n let next = cur[key];\n const nextIsIndex = /^\\d+$/.test(parts[i + 1]);\n if (next == null) {\n next = nextIsIndex ? [] : {};\n } else {\n next = Array.isArray(next) ? next.slice() : { ...(next as Record<string, unknown>) };\n }\n cur[key] = next;\n cur = next as Record<string | number, unknown>;\n }\n }\n return root as Record<string, unknown>;\n}\n","export function generateColor(seed?: string | number) {\n const hash = hashString(String(seed || Math.random()));\n const h = hash % 360;\n const s = 65 + ((hash >>> 8) % 20);\n const l = 55 + ((hash >>> 16) % 10);\n return hslToHex(h, s, l);\n}\n\nexport function generateRandomName(): string {\n const len = 6;\n const alphabet = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let id = \"\";\n if (\n typeof crypto !== \"undefined\" &&\n typeof (crypto as Crypto).getRandomValues === \"function\"\n ) {\n const bytes = new Uint8Array(len);\n (crypto as Crypto).getRandomValues(bytes);\n for (let i = 0; i < len; i++) {\n id += alphabet[bytes[i] % alphabet.length];\n }\n } else {\n for (let i = 0; i < len; i++) {\n id += alphabet[Math.floor(Math.random() * alphabet.length)];\n }\n }\n return id;\n}\n\nexport function generateRandomId(): string {\n return generateRandomName();\n}\n\nfunction hashString(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n return hash >>> 0;\n}\n\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = h / 60;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n let r1 = 0,\n g1 = 0,\n b1 = 0;\n if (hp >= 0 && hp < 1) [r1, g1, b1] = [c, x, 0];\n else if (hp >= 1 && hp < 2) [r1, g1, b1] = [x, c, 0];\n else if (hp >= 2 && hp < 3) [r1, g1, b1] = [0, c, x];\n else if (hp >= 3 && hp < 4) [r1, g1, b1] = [0, x, c];\n else if (hp >= 4 && hp < 5) [r1, g1, b1] = [x, 0, c];\n else [r1, g1, b1] = [c, 0, x];\n const m = l - c / 2;\n const r = Math.round((r1 + m) * 255);\n const g = Math.round((g1 + m) * 255);\n const b = Math.round((b1 + m) * 255);\n return \"#\" + [r, g, b].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","export function createCursorImage(color: string) {\n const w = 8;\n const h = 12;\n const path =\n '<path d=\"M 4 0 L 8 12 L 4 10 L 0 12 Z\" stroke=\"' +\n color +\n '\" fill=\"' +\n color +\n '\"/>';\n const svg =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n w +\n 'px\" height=\"' +\n h +\n 'px\" viewBox=\"0 0 ' +\n w +\n \" \" +\n h +\n '\" version=\"1.1\">' +\n path +\n \"</svg>\";\n const bytes = new Uint8Array(svg.length);\n for (let i = 0; i < svg.length; i++) {\n bytes[i] = svg.charCodeAt(i);\n }\n const encoded = btoa(String.fromCharCode.apply(null, bytes as unknown as number[]));\n return \"data:image/svg+xml;base64,\" + encoded;\n}\n","import { throttle } from \"lodash-es\";\nimport { colord } from \"colord\";\nimport { createCursorImage } from \"../../helper/cursor\";\n\nimport { type Awareness } from \"y-protocols/awareness\";\nimport { type RemoteCursor } from \"./index\";\nimport type { DrawioFile, MxGraph } from \"../../types/drawio\";\n\nexport const CacheKey = \"__remoteCursor__\";\n\nfunction createCursorEl(color: string, username: string) {\n const cursor = document.createElement(\"div\");\n cursor.style.position = \"absolute\";\n cursor.style.opacity = \"0.9\";\n cursor.style.transition = \"all 0.3s ease-in-out\";\n\n const img = document.createElement(\"img\");\n img.style.transform = \"rotate(-45deg) translateX(-14px)\";\n img.setAttribute(\"src\", createCursorImage(color));\n img.style.width = \"10px\";\n img.style.transition = \"all 0.3s ease-in-out\";\n cursor.appendChild(img);\n\n const name = document.createElement(\"div\");\n name.style.backgroundColor = color;\n name.style.color = colord(color).isDark() ? \"#fff\" : \"#000\";\n name.style.fontSize = \"9pt\";\n name.style.padding = \"3px 7px\";\n name.style.marginTop = \"8px\";\n name.style.borderRadius = \"10px\";\n name.style.maxWidth = \"100px\";\n name.style.overflow = \"hidden\";\n name.style.textOverflow = \"ellipsis\";\n name.style.whiteSpace = \"nowrap\";\n\n name.innerText = username;\n cursor.appendChild(name);\n return cursor;\n}\n\nexport function bindCursor(\n file: DrawioFile,\n options: {\n awareness: Awareness;\n graph?: MxGraph;\n mouseMoveThrottle?: number;\n },\n) {\n const graph = options.graph || file.getUi().editor.graph;\n const awareness = options.awareness;\n const mouseMoveThrottle = options.mouseMoveThrottle ?? 100;\n\n const listener = {\n startX: 0,\n startY: 0,\n scrollLeft: 0,\n scrollTop: 0,\n mouseDown: function () {},\n mouseUp: function () {},\n mouseMove: throttle(function (\n _sender: unknown,\n event: { graphX: number; graphY: number; evt: MouseEvent },\n ) {\n const containerRect = graph.container.getBoundingClientRect();\n const { translate, scale } = graph.view;\n\n const x = Math.round(\n (event.evt.clientX - containerRect.x + graph.container.scrollLeft) /\n scale -\n translate.x,\n );\n const y = Math.round(\n (event.evt.clientY - containerRect.y + graph.container.scrollTop) /\n scale -\n translate.y,\n );\n\n awareness.setLocalStateField(\"cursor\", {\n x,\n y,\n pageId: file.getUi().currentPage?.getId(),\n });\n }, mouseMoveThrottle),\n };\n\n graph.addMouseListener(listener);\n\n // 鼠标离开画布时隐藏光标\n const handleMouseLeave = () => {\n awareness.setLocalStateField(\"cursor\", {\n x: 0,\n y: 0,\n pageId: file.getUi().currentPage?.getId(),\n hide: true,\n });\n };\n graph.container.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n graph.removeMouseListener(listener);\n graph.container.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n}\n\nexport function renderRemoteCursors(\n ui: { editor: { graph: MxGraph }; currentPage?: { getId(): string } | null; diagramContainer: HTMLElement },\n remotes: Map<number, RemoteCursor>,\n) {\n if (!(CacheKey in ui)) {\n (ui as Record<string, unknown>)[CacheKey] = new Map<number, HTMLDivElement>();\n }\n\n const cache = (ui as Record<string, unknown>)[CacheKey] as Map<number, HTMLDivElement>;\n const currentPageId = ui.currentPage?.getId();\n\n if (!currentPageId) {\n Array.from(cache.values()).forEach((el) => el.remove());\n cache.clear();\n return;\n }\n\n const currentPageRemotes: RemoteCursor[] = [];\n const otherPageRemotes: RemoteCursor[] = [];\n const leaveRemotesIds = new Set<number>();\n\n Array.from(cache.keys()).forEach((clientId) => {\n if (!remotes.has(clientId)) leaveRemotesIds.add(clientId);\n });\n\n Array.from(remotes.values()).forEach((remote) => {\n if (remote.cursorState?.pageId === currentPageId) {\n currentPageRemotes.push(remote);\n } else {\n otherPageRemotes.push(remote);\n }\n });\n\n leaveRemotesIds.forEach((clientId) => {\n const el = cache.get(clientId);\n cache.delete(clientId);\n if (!el) return;\n el.remove();\n });\n\n otherPageRemotes.forEach(({ clientId }) => {\n const el = cache.get(clientId);\n if (!el) return;\n el.remove();\n });\n\n if (!currentPageRemotes.length) return;\n\n const graph = ui.editor.graph;\n const { translate, scale } = graph.view;\n\n currentPageRemotes.forEach(\n ({ clientId, cursorState, userColor, userName }) => {\n if (!cursorState) return;\n let el = cache.get(clientId);\n\n // 隐藏状态:移除光标元素\n if (cursorState.hide) {\n if (el) {\n el.remove();\n cache.delete(clientId);\n }\n return;\n }\n\n if (!el) {\n el = createCursorEl(userColor, userName);\n ui.diagramContainer.appendChild(el);\n cache.set(clientId, el);\n }\n\n const x = (translate.x + cursorState.x) * scale + 8;\n const y = (translate.y + cursorState.y) * scale - 12;\n\n const cx = Math.max(\n graph.container.scrollLeft,\n Math.min(\n graph.container.scrollLeft +\n graph.container.clientWidth -\n el.clientWidth,\n x,\n ),\n );\n\n const cy = Math.max(\n graph.container.scrollTop - 22,\n Math.min(\n graph.container.scrollTop +\n graph.container.clientHeight -\n el.clientHeight,\n y,\n ),\n );\n el.style.left = cx + \"px\";\n el.style.top = cy + \"px\";\n el.style.display = \"\";\n },\n );\n}\n","export function getId(item: { id?: string | number }) {\n if (item.id) return item.id;\n return null;\n}\n","import { type Awareness } from \"y-protocols/awareness\";\nimport { getId } from \"../../helper/getId\";\nimport { type RemoteCursor } from \"./index\";\nimport type { DrawioFile, MxGraph } from \"../../types/drawio\";\n\nexport const SELECTION_OPACITY = 70;\nexport const CacheKey = \"__remoteSelection__\";\n\nexport function bindSelection(\n file: DrawioFile,\n options: { awareness: Awareness; graph?: MxGraph },\n) {\n const graph = options.graph || file.getUi().editor.graph;\n const awareness = options.awareness;\n\n const handler = function () {\n const pageId = file.getUi().currentPage?.getId();\n const cells = graph.getSelectionModel().cells as Record<string, unknown>;\n const ids = Object.keys(cells || {})\n .map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (key) => getId(cells[key] as any) as string,\n )\n .filter(Boolean);\n awareness.setLocalStateField(\"selection\", { ids, pageId });\n };\n\n const selectionModel = graph.getSelectionModel();\n selectionModel.addListener(\"change\", handler);\n\n return () => {\n selectionModel.removeListener(\"change\", handler);\n };\n}\n\nexport function renderRemoteSelections(\n ui: { editor: { graph: MxGraph }; currentPage?: { getId(): string } | null },\n remotes: Map<number, RemoteCursor>,\n) {\n if (!(CacheKey in ui)) {\n (ui as Record<string, unknown>)[CacheKey] = new Map<\n number,\n Map<string, { destroy: () => void }>\n >();\n }\n\n const cache = (ui as Record<string, unknown>)[CacheKey] as Map<\n number,\n Map<string, { destroy: () => void }>\n >;\n\n const currentPageId = ui.currentPage?.getId();\n\n if (!currentPageId) {\n cache.clear();\n return;\n }\n\n const currentPageRemotes: RemoteCursor[] = [];\n const otherPageRemotes: RemoteCursor[] = [];\n const leaveRemotesIds = new Set<number>();\n\n Array.from(cache.keys()).forEach((clientId) => {\n if (!remotes.has(clientId)) leaveRemotesIds.add(clientId);\n });\n\n Array.from(remotes.values()).forEach((remote) => {\n if (remote.selectionState?.pageId === currentPageId) {\n currentPageRemotes.push(remote);\n } else {\n otherPageRemotes.push(remote);\n }\n });\n\n leaveRemotesIds.forEach((clientId) => {\n const highlightCellMap = cache.get(clientId);\n cache.delete(clientId);\n if (!highlightCellMap) return;\n Array.from(highlightCellMap.values()).forEach((h) => h.destroy());\n highlightCellMap.clear();\n });\n\n otherPageRemotes.forEach(({ clientId }) => {\n const highlightCellMap = cache.get(clientId);\n if (!highlightCellMap) return;\n Array.from(highlightCellMap.values()).forEach((h) => h.destroy());\n highlightCellMap.clear();\n });\n\n if (!currentPageRemotes.length) return;\n\n const graph = ui.editor.graph;\n\n currentPageRemotes.forEach(({ clientId, selectionState, userColor }) => {\n let highlightCellMap = cache.get(clientId);\n if (!highlightCellMap) {\n highlightCellMap = new Map<string, { destroy: () => void }>();\n cache.set(clientId, highlightCellMap);\n }\n\n const currentIds = new Set<string>(selectionState?.ids ?? []);\n\n // 移除不再选中的高亮\n Array.from(highlightCellMap.keys()).forEach((id) => {\n if (!currentIds.has(id)) {\n highlightCellMap.get(id)?.destroy();\n highlightCellMap.delete(id);\n }\n });\n\n // 添加新选中的高亮\n currentIds.forEach((id) => {\n if (highlightCellMap.has(id)) return;\n const cell = graph.model.getCell(id);\n if (cell) {\n const highlightCell = graph.highlightCell(\n cell,\n userColor,\n 60000,\n SELECTION_OPACITY,\n 3,\n );\n highlightCellMap.set(id, highlightCell);\n }\n });\n });\n}\n","import { type Awareness } from \"y-protocols/awareness\";\nimport {\n getAwarenessStateValue,\n setAwarenessStateValue,\n} from \"../../helper/awarenessStateValue\";\nimport { generateColor, generateRandomName } from \"../../helper/random\";\nimport { bindCursor, renderRemoteCursors } from \"./cursor\";\nimport { bindSelection, renderRemoteSelections } from \"./selection\";\nimport type { DrawioFile, MxGraph } from \"../../types/drawio\";\n\nexport const DEFAULT_USER_NAME_KEY = \"user.name\";\nexport const DEFAULT_USER_COLOR_KEY = \"user.color\";\n\ntype CursorState = {\n x: number;\n y: number;\n pageId?: string | null;\n hide?: boolean;\n};\n\ntype SelectionState = {\n ids: string[];\n pageId?: string | null;\n};\n\nexport type RemoteCursor = {\n clientId: number;\n cursorState: CursorState | null;\n selectionState: SelectionState | null;\n userColor: string;\n userName: string;\n};\n\nexport function bindCollaborator(\n file: DrawioFile,\n options: {\n awareness: Awareness;\n graph?: MxGraph;\n cursor?: boolean | { userNameKey?: string; userColorKey?: string };\n mouseMoveThrottle?: number;\n },\n) {\n const graph = options.graph || file.getUi().editor.graph;\n const awareness = options.awareness;\n const mouseMoveThrottle = options.mouseMoveThrottle ?? 100;\n\n const cursorOption = options.cursor;\n const userNameKey =\n typeof cursorOption === \"object\" && cursorOption?.userNameKey\n ? cursorOption.userNameKey\n : DEFAULT_USER_NAME_KEY;\n const userColorKey =\n typeof cursorOption === \"object\" && cursorOption?.userColorKey\n ? cursorOption.userColorKey\n : DEFAULT_USER_COLOR_KEY;\n\n let userName = getAwarenessStateValue<string>(awareness, userNameKey);\n if (!userName) {\n userName = generateRandomName();\n setAwarenessStateValue(awareness, userNameKey, userName);\n }\n let userColor = getAwarenessStateValue<string>(awareness, userColorKey);\n if (!userColor) {\n userColor = generateColor(userName);\n setAwarenessStateValue(awareness, userColorKey, userColor);\n }\n\n const cleanupCursor = bindCursor(file, {\n awareness,\n graph,\n mouseMoveThrottle,\n });\n const cleanupSelection = bindSelection(file, {\n awareness,\n graph,\n });\n\n const showCursor = options.cursor ?? true;\n let cleanupAwareness: (() => void) | undefined;\n\n if (typeof showCursor === \"boolean\" && showCursor) {\n const awarenessHandler = (update: {\n added: number[];\n removed: number[];\n updated: number[];\n }) => {\n const states = awareness.getStates();\n const remotes = new Map<number, RemoteCursor>();\n\n const changedClientIds = new Set([...update.added, ...update.updated]);\n for (const [clientId] of states.entries()) {\n if (clientId === awareness.clientID) continue;\n if (!changedClientIds.has(clientId)) continue;\n\n const name =\n getAwarenessStateValue<string>(awareness, userNameKey, clientId) ||\n clientId + \"\";\n const color =\n getAwarenessStateValue<string>(awareness, userColorKey, clientId) ||\n \"#000000\";\n\n remotes.set(clientId, {\n clientId,\n cursorState: getAwarenessStateValue<CursorState>(\n awareness,\n \"cursor\",\n clientId,\n ),\n selectionState: getAwarenessStateValue<SelectionState>(\n awareness,\n \"selection\",\n clientId,\n ),\n userColor: color,\n userName: name,\n });\n }\n\n renderRemoteCursors(file.getUi(), remotes);\n renderRemoteSelections(file.getUi(), remotes);\n };\n awareness.on(\"update\", awarenessHandler);\n cleanupAwareness = () => awareness.off(\"update\", awarenessHandler);\n }\n\n return () => {\n cleanupCursor?.();\n cleanupSelection?.();\n cleanupAwareness?.();\n };\n}\n","import * as Y from \"yjs\";\nimport { type Awareness } from \"y-protocols/awareness\";\nimport { applyFilePatch, generatePatch, initDocSnapshot } from \"./patch\";\nimport { xml2doc } from \"../transformer\";\nimport { bindUndoManager } from \"./undoManager\";\nimport { bindCollaborator } from \"./collaborator\";\nimport { LOCAL_ORIGIN } from \"../helper/origin\";\nimport { key as mxfileKey, type YMxFile } from \"../models/mxfile\";\nimport type { DrawioFile, MxGraphModel } from \"../types/drawio\";\n\nexport interface BindDrawioFileOptions {\n doc: Y.Doc;\n awareness?: Awareness;\n undoManager?: Y.UndoManager;\n mouseMoveThrottle?: number;\n cursor?:\n | boolean\n | {\n userNameKey?: string;\n userColorKey?: string;\n };\n}\n\n/**\n * Y-MXGraph 绑定类,管理 draw.io 文件与 Y.Doc 的双向同步\n *\n * 初始化流程对齐 y-prosemirror 等数据源:\n * - 绑定时不向 Y.Doc 写入初始数据\n * - 在第一次本地编辑时才初始化 Y.Doc\n * - 新客户端加入时,同步已有的远端数据到本地\n */\nexport class Binding {\n /** Y.Doc 实例,用于协同数据存储 */\n readonly doc: Y.Doc;\n /** mxGraph 的数据模型,用于监听本地变更 */\n private mxGraphModel: MxGraphModel;\n /** 本地变更抑制标志,防止循环同步 */\n private suppressLocalApply = false;\n /** 初始化标志,标记 Y.Doc 是否已初始化 */\n private docInitialized = false;\n /** mxGraph change 事件监听器 */\n private mxListener: () => void;\n /** Yjs 文档深度变更监听器 */\n private docObserver: (\n events: Y.YEvent<\n Y.XmlElement | Y.Array<string> | Y.Map<Y.XmlElement> | YMxFile\n >[],\n transaction: Y.Transaction,\n ) => void;\n /** 协作功能清理函数(awareness 光标/选区) */\n private cleanupCollaborator?: () => void;\n /** UndoManager 绑定清理函数 */\n private cleanupUndoManager?: () => void;\n\n constructor(file: DrawioFile, options: BindDrawioFileOptions) {\n const { doc, awareness, undoManager, mouseMoveThrottle, cursor } = options;\n\n this.doc = doc;\n\n const ui = file.getUi();\n const graph = ui.editor.graph;\n this.mxGraphModel = graph.model;\n\n // 检查 Y.Doc 是否已有数据\n // 注意:doc.share.has() 可能因 doc.getMap() 调用而为 true 但 map 为空\n // 因此需要同时检查 map 中是否有实际内容\n const mxfileMap = doc.getMap(mxfileKey);\n const docHasData = mxfileMap.size > 0;\n this.docInitialized = docHasData;\n\n // 初始化 shadowPages = 当前 pages 的克隆\n // 这样后续 change 事件如果未真正改变 pages 内容,diffPages 会返回空 patch\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n\n // 若 Y.Doc 已有数据(新客户端加入场景),用 ydoc 内容初始化 file\n if (docHasData) {\n initDocSnapshot(doc, false);\n const fullPatch = generatePatch([], doc);\n if (Object.keys(fullPatch).length > 0) {\n this.suppressLocalApply = true;\n try {\n file.patch([fullPatch]);\n } finally {\n this.suppressLocalApply = false;\n }\n }\n // 同步后重新对齐 shadowPages\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n }\n\n // 本地变更监听\n this.mxListener = () => {\n if (this.suppressLocalApply) return;\n\n const patch = file.ui.diffPages(\n file.shadowPages,\n file.ui.pages,\n ) as import(\"./patch\").FilePatch;\n const patchKeys = Object.keys(patch);\n\n // 没有实际本地变更时直接跳过\n if (patchKeys.length === 0) return;\n\n // 第一次有实际本地编辑时才初始化 Y.Doc\n if (!this.docInitialized) {\n doc.transact(() => {\n xml2doc(file.data, doc);\n initDocSnapshot(doc, false);\n });\n this.docInitialized = true;\n }\n\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n applyFilePatch(doc, patch, { origin: LOCAL_ORIGIN });\n };\n this.mxGraphModel.addListener(\"change\", this.mxListener);\n\n // 远端变更监听\n this.docObserver = (\n events: Y.YEvent<\n Y.XmlElement | Y.Array<string> | Y.Map<Y.XmlElement> | YMxFile\n >[],\n transaction: Y.Transaction,\n ) => {\n // 标记已初始化(即使是远端数据到达)\n if (!this.docInitialized) {\n this.docInitialized = true;\n }\n\n if (transaction.local && transaction.origin === LOCAL_ORIGIN) {\n generatePatch(events);\n return;\n }\n\n const patch = generatePatch(events);\n if (Object.keys(patch).length === 0) return;\n this.suppressLocalApply = true;\n try {\n file.patch([patch]);\n file.setShadowPages(file.ui.clonePages(file.ui.pages));\n } finally {\n this.suppressLocalApply = false;\n }\n };\n mxfileMap.observeDeep(this.docObserver);\n\n // 协作功能\n if (awareness) {\n this.cleanupCollaborator = bindCollaborator(file, {\n awareness,\n graph,\n cursor: cursor ?? true,\n mouseMoveThrottle,\n });\n }\n\n // UndoManager\n if (undoManager) {\n this.cleanupUndoManager = bindUndoManager(doc, file, undoManager);\n }\n }\n\n /**\n * 销毁绑定,解除所有监听器\n * @param deep - 是否深度清理(包括 awareness/undoManager),默认 false\n */\n destroy(deep = false): void {\n this.mxGraphModel.removeListener(\"change\", this.mxListener);\n this.doc.getMap(mxfileKey).unobserveDeep(this.docObserver);\n if (deep) {\n this.cleanupCollaborator?.();\n this.cleanupUndoManager?.();\n }\n }\n\n /**\n * 生成标准化的 mxfile XML 模板,用于确保多端协同的数据起点一致。\n *\n * draw.io 每次新建 diagram 时默认生成随机 id(如 `DEMOabHTdChjKBf1yHdD`)。\n * 如果各客户端初始化时的 diagram id 不同,Y.Doc 中的数据与本地 file.data 无法对齐,\n * 会导致:\n * - 后进房间的客户端出现「孤立 page」(来自本地 XML,未写入 Y.Doc)\n * - patch 的 diff 无法正确匹配 diagram/cell id,协同失效\n *\n * 因此业务方应在初始化 draw.io 文件时,先用此方法生成统一起点的 XML,\n * 再注入到 draw.io 的 currentFile 中(详见文档「接入注意事项」)。\n *\n * @param diagramId - diagram 的固定 id,默认 `diagram-0`\n * @returns 最小化的 mxfile XML 字符串\n */\n static generateFileTemplate(diagramId = \"diagram-0\"): string {\n return `<mxfile pages=\"1\">\n <diagram id=\"${diagramId}\">\n <mxGraphModel>\n <root>\n <mxCell id=\"0\" />\n <mxCell id=\"1\" parent=\"0\" />\n </root>\n </mxGraphModel>\n </diagram>\n</mxfile>`;\n }\n\n /**\n * 静态工厂方法,创建 Binding 实例\n * 与 `new Binding()` 等价\n */\n static create(file: DrawioFile, options: BindDrawioFileOptions): Binding {\n return new Binding(file, options);\n }\n}\n"],"names":["key","parse","serializer","serialize","mxCellKey","parseMxCell","serializeMxCell","parseMxGraphModel","mxGraphModelKey","serializeMxGraphModel","diagramKey","parseDiagram","_a","serializeDiagram","mxfileKey","id","orderArr","xmlSerializer","parseMxFile","serializerMxFile","serializerMxGraphModel","CacheKey"],"mappings":"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"}
|