y-mxgraph 0.1.1 → 0.1.3

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
@@ -29,6 +29,12 @@ import { Binding, LOCAL_ORIGIN } from 'y-mxgraph';
29
29
  const doc = new Y.Doc();
30
30
 
31
31
  App.main((app) => {
32
+ // 确保多端初始文件一致;draw.io 默认创建时 diagram id 是随机的,
33
+ // 若各客户端起点不同会导致协同异常。可用 generateFileTemplate 生成统一模板。
34
+ if (!app.currentFile.data) {
35
+ app.currentFile.data = Binding.generateFileTemplate('diagram-0');
36
+ }
37
+
32
38
  const binding = new Binding(app.currentFile, { doc });
33
39
 
34
40
  window.addEventListener('beforeunload', () => binding.destroy());
@@ -58,10 +64,19 @@ pnpm --filter y-mxgraph build
58
64
  pnpm --filter y-mxgraph test
59
65
 
60
66
  # Demo
67
+
68
+ ```bash
69
+ # 单页模式(draw.io 直接加载在当前页面)
61
70
  pnpm --filter @y-mxgraph/demo dev
62
71
 
72
+ # iframe 模式(父页运行 WebRTC Provider,两个 iframe 各跑一套 draw.io + y-mxgraph,通过 postMessage 同步)
73
+ # 访问 http://localhost:5173/iframe-mode.html
74
+ ```
75
+
63
76
  # Docs
77
+
64
78
  pnpm --filter @y-mxgraph/docs dev
79
+
65
80
  ```
66
81
 
67
82
  ## License
package/README.zh-CN.md CHANGED
@@ -29,6 +29,12 @@ import { Binding, LOCAL_ORIGIN } from 'y-mxgraph';
29
29
  const doc = new Y.Doc();
30
30
 
31
31
  App.main((app) => {
32
+ // 必须保证多端初始文件一致;draw.io 默认新建 diagram 时 id 是随机的,
33
+ // 若各客户端起点不同会导致协同异常。可用 generateFileTemplate 生成统一模板。
34
+ if (!app.currentFile.data) {
35
+ app.currentFile.data = Binding.generateFileTemplate('diagram-0');
36
+ }
37
+
32
38
  const binding = new Binding(app.currentFile, { doc });
33
39
 
34
40
  window.addEventListener('beforeunload', () => binding.destroy());
@@ -35,6 +35,22 @@ export declare class Binding {
35
35
  * @param deep - 是否深度清理(包括 awareness/undoManager),默认 false
36
36
  */
37
37
  destroy(deep?: boolean): void;
38
+ /**
39
+ * 生成标准化的 mxfile XML 模板,用于确保多端协同的数据起点一致。
40
+ *
41
+ * draw.io 每次新建 diagram 时默认生成随机 id(如 `DEMOabHTdChjKBf1yHdD`)。
42
+ * 如果各客户端初始化时的 diagram id 不同,Y.Doc 中的数据与本地 file.data 无法对齐,
43
+ * 会导致:
44
+ * - 后进房间的客户端出现「孤立 page」(来自本地 XML,未写入 Y.Doc)
45
+ * - patch 的 diff 无法正确匹配 diagram/cell id,协同失效
46
+ *
47
+ * 因此业务方应在初始化 draw.io 文件时,先用此方法生成统一起点的 XML,
48
+ * 再注入到 draw.io 的 currentFile 中(详见文档「接入注意事项」)。
49
+ *
50
+ * @param diagramId - diagram 的固定 id,默认 `diagram-0`
51
+ * @returns 最小化的 mxfile XML 字符串
52
+ */
53
+ static generateFileTemplate(diagramId?: string): string;
38
54
  /**
39
55
  * 静态工厂方法,创建 Binding 实例
40
56
  * 与 `new Binding()` 等价
@@ -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;;GAEG;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,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;IAkF5D;;;OAGG;IACH,OAAO,CAAC,IAAI,UAAQ,GAAG,IAAI;IAS3B;;;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;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;;GAEG;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,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;IAkF5D;;;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/package.json CHANGED
@@ -1,7 +1,20 @@
1
1
  {
2
2
  "name": "y-mxgraph",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Yjs binding for draw.io (mxGraph) documents",
5
+ "keywords": [
6
+ "yjs",
7
+ "mxgraph",
8
+ "drawio",
9
+ "draw.io",
10
+ "crdt",
11
+ "collaboration",
12
+ "real-time",
13
+ "operational-transformation",
14
+ "diagram",
15
+ "graph",
16
+ "sync"
17
+ ],
5
18
  "type": "module",
6
19
  "main": "./y-mxgraph.cjs.js",
7
20
  "module": "./y-mxgraph.es.js",
package/y-mxgraph.cjs.js CHANGED
@@ -1509,6 +1509,33 @@ class Binding {
1509
1509
  (_b = this.cleanupUndoManager) == null ? void 0 : _b.call(this);
1510
1510
  }
1511
1511
  }
1512
+ /**
1513
+ * 生成标准化的 mxfile XML 模板,用于确保多端协同的数据起点一致。
1514
+ *
1515
+ * draw.io 每次新建 diagram 时默认生成随机 id(如 `DEMOabHTdChjKBf1yHdD`)。
1516
+ * 如果各客户端初始化时的 diagram id 不同,Y.Doc 中的数据与本地 file.data 无法对齐,
1517
+ * 会导致:
1518
+ * - 后进房间的客户端出现「孤立 page」(来自本地 XML,未写入 Y.Doc)
1519
+ * - patch 的 diff 无法正确匹配 diagram/cell id,协同失效
1520
+ *
1521
+ * 因此业务方应在初始化 draw.io 文件时,先用此方法生成统一起点的 XML,
1522
+ * 再注入到 draw.io 的 currentFile 中(详见文档「接入注意事项」)。
1523
+ *
1524
+ * @param diagramId - diagram 的固定 id,默认 `diagram-0`
1525
+ * @returns 最小化的 mxfile XML 字符串
1526
+ */
1527
+ static generateFileTemplate(diagramId = "diagram-0") {
1528
+ return `<mxfile pages="1">
1529
+ <diagram id="${diagramId}">
1530
+ <mxGraphModel>
1531
+ <root>
1532
+ <mxCell id="0" />
1533
+ <mxCell id="1" parent="0" />
1534
+ </root>
1535
+ </mxGraphModel>
1536
+ </diagram>
1537
+ </mxfile>`;
1538
+ }
1512
1539
  /**
1513
1540
  * 静态工厂方法,创建 Binding 实例
1514
1541
  * 与 `new Binding()` 等价