y-mxgraph 0.1.5 → 0.2.0

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 CHANGED
@@ -24,18 +24,24 @@ pnpm add y-mxgraph yjs y-protocols
24
24
 
25
25
  ```ts
26
26
  import * as Y from 'yjs';
27
- import { Binding, LOCAL_ORIGIN } from 'y-mxgraph';
27
+ import { Binding } from 'y-mxgraph';
28
28
 
29
29
  const doc = new Y.Doc();
30
30
 
31
31
  App.main((app) => {
32
- // Ensure consistent initial files across clients. draw.io generates random diagram ids by default,
33
- // which can cause sync issues if clients start from different states. Use generateFileTemplate to create a unified template.
34
- if (!app.currentFile.data) {
35
- app.currentFile.data = Binding.generateFileTemplate('diagram-0');
36
- }
37
-
38
- const binding = new Binding(app.currentFile, { doc });
32
+ const file = app.currentFile;
33
+
34
+ // Binding automatically reconciles file and Y.Doc based on
35
+ // `initialContent` strategy (default: 'replace').
36
+ // - 'replace' : Y.Doc wins; file UI is replaced with doc XML
37
+ // - 'merge-remote' : union by diagram id; doc wins on conflicts
38
+ // - 'merge-client' : union by diagram id; file wins on conflicts
39
+ //
40
+ // By default only `file.ui.setFileData(xml)` is called (rebuilds UI).
41
+ // `file.setData(xml)` is intentionally NOT called so draw.io does not
42
+ // mark the file as modified and pop up the "Save diagrams to:" dialog.
43
+ // Override via `applyFileData` if you need to sync `file.data` too.
44
+ const binding = new Binding(file, { doc /*, initialContent: 'merge-remote' */ });
39
45
 
40
46
  window.addEventListener('beforeunload', () => binding.destroy());
41
47
  });
@@ -1,6 +1,13 @@
1
1
  import * as Y from "yjs";
2
2
  import { type Awareness } from "y-protocols/awareness";
3
3
  import type { DrawioFile } from "../types/drawio";
4
+ /**
5
+ * 控制 Binding 构造时 file 与 Y.Doc 的初始内容对齐策略。
6
+ * - `replace` : doc 非空则用 doc 覆盖 file;doc 为空则保留 file 现有数据(默认)。
7
+ * - `merge-remote` : 按 diagram id 取并集,同 id 冲突时以 doc 为准(远端权威)。
8
+ * - `merge-client` : 按 diagram id 取并集,同 id 冲突时以 file 为准(本地权威,覆盖到 doc)。
9
+ */
10
+ export type InitialContentStrategy = "replace" | "merge-remote" | "merge-client";
4
11
  export interface BindDrawioFileOptions {
5
12
  doc: Y.Doc;
6
13
  awareness?: Awareness;
@@ -10,6 +17,20 @@ export interface BindDrawioFileOptions {
10
17
  userNameKey?: string;
11
18
  userColorKey?: string;
12
19
  };
20
+ /**
21
+ * 初始内容对齐策略,默认 `replace`。详见 {@link InitialContentStrategy}。
22
+ */
23
+ initialContent?: InitialContentStrategy;
24
+ /**
25
+ * 自定义把 XML 应用到 file 的方式。默认实现只调用
26
+ * `file.ui.setFileData(xml)`(刷新 UI / 重建 pages),
27
+ * **不会**调用 `file.setData(xml)`,以避免把 file 标记为「已修改」
28
+ * 触发 draw.io 的 "Save diagrams to:" 存储选择对话框。
29
+ *
30
+ * 若业务方确实需要同步 `file.data`(如自定义 CollabFile 或依赖
31
+ * `file.save()`),可提供自定义实现。
32
+ */
33
+ applyFileData?: (file: DrawioFile, xml: string) => void;
13
34
  }
14
35
  /**
15
36
  * Y-MXGraph 绑定类,管理 draw.io 文件与 Y.Doc 的双向同步
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/binding/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOvD,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EACH,OAAO,GACP;QACE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACP;AAED;;;;;;;GAOG;AACH,qBAAa,OAAO;IAClB,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACpB,6BAA6B;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,sBAAsB;IACtB,OAAO,CAAC,kBAAkB,CAAS;IACnC,4BAA4B;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,2BAA2B;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,oBAAoB;IACpB,OAAO,CAAC,WAAW,CAKT;IACV,gCAAgC;IAChC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,yBAAyB;IACzB,OAAO,CAAC,kBAAkB,CAAC,CAAa;gBAE5B,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB;IA4G5D;;;OAGG;IACH,OAAO,CAAC,IAAI,UAAQ,GAAG,IAAI;IAS3B;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,oBAAoB,CAAC,SAAS,SAAc,GAAG,MAAM;IAa5D;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO;CAGzE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/binding/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAiBvD,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EACH,OAAO,GACP;QACE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACN;;OAEG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AA0KD;;;;;;;GAOG;AACH,qBAAa,OAAO;IAClB,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACpB,6BAA6B;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,sBAAsB;IACtB,OAAO,CAAC,kBAAkB,CAAS;IACnC,4BAA4B;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,2BAA2B;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,oBAAoB;IACpB,OAAO,CAAC,WAAW,CAKT;IACV,gCAAgC;IAChC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,yBAAyB;IACzB,OAAO,CAAC,kBAAkB,CAAC,CAAa;gBAE5B,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB;IA+G5D;;;OAGG;IACH,OAAO,CAAC,IAAI,UAAQ,GAAG,IAAI;IAS3B;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,oBAAoB,CAAC,SAAS,SAAc,GAAG,MAAM;IAa5D;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO;CAGzE"}
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { Binding } from "./binding";
2
- export type { BindDrawioFileOptions } from "./binding";
2
+ export type { BindDrawioFileOptions, InitialContentStrategy } from "./binding";
3
3
  export { xml2doc, doc2xml } from "./transformer";
4
4
  export { LOCAL_ORIGIN } from "./helper/origin";
5
5
  export { DEFAULT_USER_NAME_KEY, DEFAULT_USER_COLOR_KEY, } from "./binding/collaborator";
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "y-mxgraph",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "description": "Yjs binding for draw.io (mxGraph) documents",
5
5
  "keywords": [
6
6
  "yjs",
@@ -28,6 +28,11 @@
28
28
  "types": "./index.d.ts"
29
29
  }
30
30
  },
31
+ "dependencies": {
32
+ "colord": "^2.9.3",
33
+ "lodash-es": "^4.17.21",
34
+ "xml-js": "^1.6.11"
35
+ },
31
36
  "peerDependencies": {
32
37
  "y-protocols": "^1.0.0",
33
38
  "yjs": "^13.6.0"
package/types/drawio.d.ts CHANGED
@@ -56,6 +56,8 @@ export interface DrawioUi {
56
56
  pages: unknown[];
57
57
  diffPages(oldPages: unknown[], newPages: unknown[]): unknown;
58
58
  clonePages(pages: unknown[]): unknown[];
59
+ /** 解析 XML 并重建 pages / mxGraphModel,触发 UI 重绘 */
60
+ setFileData(data: string): void;
59
61
  }
60
62
  /** mxGraph 事件对象 */
61
63
  export interface MxEventObject {
@@ -71,6 +73,8 @@ export interface DrawioFile {
71
73
  getUi(): DrawioUi;
72
74
  setShadowPages(pages: unknown[]): void;
73
75
  patch(patches: unknown[]): void;
76
+ /** 仅赋值 this.data = xml,不触发 UI 重绘 */
77
+ setData(data: string): void;
74
78
  }
75
79
  /** draw.io App(demo 中通过 iframe 访问) */
76
80
  export interface DrawioApp {
@@ -1 +1 @@
1
- {"version":3,"file":"drawio.d.ts","sourceRoot":"","sources":["../../src/types/drawio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drawio.d.ts","sourceRoot":"","sources":["../../src/types/drawio.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,MAAM,CAAC;CACjB;AAED,iBAAiB;AACjB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACtE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACrC;AAED,mBAAmB;AACnB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CACvE;AAED,iBAAiB;AACjB,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,WAAW,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,iBAAiB,IAAI,cAAc,CAAC;IACpC,aAAa,CACX,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;QAAE,OAAO,IAAI,IAAI,CAAA;KAAE,CAAC;CACxB;AAED,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;QAC3B,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CAC7C;AAED,iBAAiB;AACjB,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,WAAW,CAAC;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC7D,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACxC,+CAA+C;IAC/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,IAAI,MAAM,CAAC;IAClB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,mBAAmB;AACnB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,IAAI,QAAQ,CAAC;IAClB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,oCAAoC;IACpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;CACtB"}
package/y-mxgraph.cjs.js CHANGED
@@ -1455,32 +1455,147 @@ function bindCollaborator(file, options) {
1455
1455
  cleanupAwareness == null ? void 0 : cleanupAwareness();
1456
1456
  };
1457
1457
  }
1458
+ const defaultApplyFileData = (file, xml) => {
1459
+ file.ui.setFileData(xml);
1460
+ };
1461
+ function mergeFileIntoDoc(doc, fileXml, strategy) {
1462
+ let parsed;
1463
+ try {
1464
+ parsed = parse$4(fileXml);
1465
+ } catch (err) {
1466
+ console.warn(
1467
+ "[y-mxgraph] 合并失败,file XML 解析异常,回退到 replace:",
1468
+ err
1469
+ );
1470
+ return false;
1471
+ }
1472
+ const mxfileObj = parsed == null ? void 0 : parsed.mxfile;
1473
+ if (!mxfileObj || !Array.isArray(mxfileObj.diagram)) {
1474
+ console.warn(
1475
+ "[y-mxgraph] 合并失败,file XML 不是合法 mxfile,回退到 replace"
1476
+ );
1477
+ return false;
1478
+ }
1479
+ const mxfileMap = doc.getMap(key);
1480
+ const diagramMap = mxfileMap.get(key$1);
1481
+ const diagramOrder = mxfileMap.get(diagramOrderKey);
1482
+ if (!diagramMap || !diagramOrder) {
1483
+ console.warn("[y-mxgraph] 合并失败,doc 结构不完整,回退到 replace");
1484
+ return false;
1485
+ }
1486
+ doc.transact(() => {
1487
+ var _a;
1488
+ for (const diagram of mxfileObj.diagram) {
1489
+ const id = ((_a = diagram._attributes) == null ? void 0 : _a.id) || "";
1490
+ if (!id)
1491
+ continue;
1492
+ const docHas = diagramMap.has(id);
1493
+ if (docHas && strategy === "merge-remote") {
1494
+ continue;
1495
+ }
1496
+ const yDiagram = parse$1(
1497
+ diagram
1498
+ );
1499
+ diagramMap.set(id, yDiagram);
1500
+ if (!docHas) {
1501
+ diagramOrder.push([id]);
1502
+ }
1503
+ }
1504
+ });
1505
+ return true;
1506
+ }
1507
+ function reconcileInitialContent(doc, file, strategy, applyFileData) {
1508
+ const mxfileMap = doc.getMap(key);
1509
+ const docHasData = mxfileMap.size > 0;
1510
+ const fileHasAnyData = !!file.data;
1511
+ const fileHasDiagrams = fileHasAnyData && file.data.includes("<diagram");
1512
+ if (strategy === "replace") {
1513
+ if (docHasData) {
1514
+ const xml2 = doc2xml(doc);
1515
+ if (xml2 && xml2.includes("<diagram")) {
1516
+ applyFileData(file, xml2);
1517
+ } else if (!fileHasAnyData) {
1518
+ applyFileData(file, Binding.generateFileTemplate("diagram-0"));
1519
+ }
1520
+ } else if (!fileHasAnyData) {
1521
+ applyFileData(file, Binding.generateFileTemplate("diagram-0"));
1522
+ }
1523
+ return mxfileMap.size > 0;
1524
+ }
1525
+ if (!docHasData && !fileHasDiagrams) {
1526
+ if (!fileHasAnyData) {
1527
+ applyFileData(file, Binding.generateFileTemplate("diagram-0"));
1528
+ }
1529
+ return false;
1530
+ }
1531
+ if (!docHasData && fileHasDiagrams) {
1532
+ try {
1533
+ doc.transact(() => {
1534
+ xml2doc(file.data, doc);
1535
+ });
1536
+ return true;
1537
+ } catch (err) {
1538
+ console.warn(
1539
+ "[y-mxgraph] merge 模式下 xml2doc 失败,回退 replace:",
1540
+ err
1541
+ );
1542
+ applyFileData(file, Binding.generateFileTemplate("diagram-0"));
1543
+ return false;
1544
+ }
1545
+ }
1546
+ if (docHasData && !fileHasDiagrams) {
1547
+ const xml2 = doc2xml(doc);
1548
+ if (xml2 && xml2.includes("<diagram")) {
1549
+ applyFileData(file, xml2);
1550
+ } else if (!fileHasAnyData) {
1551
+ applyFileData(file, Binding.generateFileTemplate("diagram-0"));
1552
+ }
1553
+ return mxfileMap.size > 0;
1554
+ }
1555
+ const ok = mergeFileIntoDoc(doc, file.data, strategy);
1556
+ if (!ok) {
1557
+ const xml2 = doc2xml(doc);
1558
+ if (xml2 && xml2.includes("<diagram"))
1559
+ applyFileData(file, xml2);
1560
+ return mxfileMap.size > 0;
1561
+ }
1562
+ const xml = doc2xml(doc);
1563
+ if (xml && xml.includes("<diagram"))
1564
+ applyFileData(file, xml);
1565
+ return true;
1566
+ }
1458
1567
  class Binding {
1459
1568
  constructor(file, options) {
1460
1569
  this.suppressLocalApply = false;
1461
1570
  this.docInitialized = false;
1462
- const { doc, awareness, undoManager, mouseMoveThrottle, cursor } = options;
1571
+ const {
1572
+ doc,
1573
+ awareness,
1574
+ undoManager,
1575
+ mouseMoveThrottle,
1576
+ cursor,
1577
+ initialContent = "replace",
1578
+ applyFileData = defaultApplyFileData
1579
+ } = options;
1463
1580
  this.doc = doc;
1464
1581
  const ui = file.getUi();
1465
1582
  const graph = ui.editor.graph;
1466
1583
  this.mxGraphModel = graph.model;
1467
- const mxfileMap = doc.getMap(key);
1468
- const docHasData = mxfileMap.size > 0;
1469
- this.docInitialized = docHasData;
1470
- file.setShadowPages(file.ui.clonePages(file.ui.pages));
1471
- if (docHasData) {
1472
- initDocSnapshot(doc, false);
1473
- const fullPatch = generatePatch([], doc);
1474
- if (Object.keys(fullPatch).length > 0) {
1475
- this.suppressLocalApply = true;
1476
- try {
1477
- file.patch([fullPatch]);
1478
- } finally {
1479
- this.suppressLocalApply = false;
1480
- }
1584
+ this.suppressLocalApply = true;
1585
+ try {
1586
+ this.docInitialized = reconcileInitialContent(
1587
+ doc,
1588
+ file,
1589
+ initialContent,
1590
+ applyFileData
1591
+ );
1592
+ if (this.docInitialized) {
1593
+ initDocSnapshot(doc, false);
1481
1594
  }
1482
- file.setShadowPages(file.ui.clonePages(file.ui.pages));
1595
+ } finally {
1596
+ this.suppressLocalApply = false;
1483
1597
  }
1598
+ file.setShadowPages(file.ui.clonePages(file.ui.pages));
1484
1599
  this.mxListener = () => {
1485
1600
  if (this.suppressLocalApply)
1486
1601
  return;
@@ -1521,7 +1636,7 @@ class Binding {
1521
1636
  this.suppressLocalApply = false;
1522
1637
  }
1523
1638
  };
1524
- mxfileMap.observeDeep(this.docObserver);
1639
+ doc.getMap(key).observeDeep(this.docObserver);
1525
1640
  if (awareness) {
1526
1641
  this.cleanupCollaborator = bindCollaborator(file, {
1527
1642
  awareness,