y-mxgraph 0.3.1 → 0.3.2

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.zh-CN.md CHANGED
@@ -82,7 +82,7 @@ App.main((app) => {
82
82
 
83
83
  ```ts
84
84
  // Server(父页面)
85
- import { createIframeBridgeServer } from '@y-mxgraph/iframe-bridge/server';
85
+ import { createIframeBridgeServer } from 'y-mxgraph/iframe-bridge/server';
86
86
 
87
87
  const doc = new Y.Doc();
88
88
  const provider = new WebrtcProvider(roomName, doc, { signaling });
@@ -90,7 +90,7 @@ const bridge = createIframeBridgeServer(doc, provider.awareness);
90
90
  bridge.addIframe(iframeElement, 'child-1');
91
91
 
92
92
  // Provider(iframe 子页面)
93
- import { createIframeBridgeProvider } from '@y-mxgraph/iframe-bridge/provider';
93
+ import { createIframeBridgeProvider } from 'y-mxgraph/iframe-bridge/provider';
94
94
 
95
95
  const doc = new Y.Doc();
96
96
  const awareness = new Awareness(doc);
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const Y = require("yjs");
4
+ const awareness = require("y-protocols/awareness");
5
+ function _interopNamespaceDefault(e) {
6
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
+ if (e) {
8
+ for (const k in e) {
9
+ if (k !== "default") {
10
+ const d = Object.getOwnPropertyDescriptor(e, k);
11
+ Object.defineProperty(n, k, d.get ? d : {
12
+ enumerable: true,
13
+ get: () => e[k]
14
+ });
15
+ }
16
+ }
17
+ }
18
+ n.default = e;
19
+ return Object.freeze(n);
20
+ }
21
+ const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
22
+ function readVarUint(data, pos) {
23
+ let result = 0;
24
+ let shift = 0;
25
+ let byte;
26
+ do {
27
+ byte = data[pos++];
28
+ result |= (byte & 127) << shift;
29
+ shift += 7;
30
+ } while (byte >= 128);
31
+ return [result >>> 0, pos];
32
+ }
33
+ function writeVarUint(value) {
34
+ const bytes = [];
35
+ while (value > 127) {
36
+ bytes.push(value & 127 | 128);
37
+ value >>>= 7;
38
+ }
39
+ bytes.push(value);
40
+ return bytes;
41
+ }
42
+ function readVarString(data, pos) {
43
+ const [len, pos2] = readVarUint(data, pos);
44
+ const str = new TextDecoder().decode(data.subarray(pos2, pos2 + len));
45
+ return [str, pos2 + len];
46
+ }
47
+ function writeVarString(str) {
48
+ const encoded = new TextEncoder().encode(str);
49
+ return [...writeVarUint(encoded.length), ...encoded];
50
+ }
51
+ function remapClientIdInUpdate(update, fromId, toId) {
52
+ const result = [];
53
+ let pos = 0;
54
+ const [count, pos2] = readVarUint(update, pos);
55
+ pos = pos2;
56
+ result.push(...writeVarUint(count));
57
+ for (let i = 0; i < count; i++) {
58
+ const [clientID, pos3] = readVarUint(update, pos);
59
+ pos = pos3;
60
+ const [clock, pos4] = readVarUint(update, pos);
61
+ pos = pos4;
62
+ const [state, pos5] = readVarString(update, pos);
63
+ pos = pos5;
64
+ const mappedId = clientID === fromId ? toId : clientID;
65
+ result.push(...writeVarUint(mappedId));
66
+ result.push(...writeVarUint(clock));
67
+ result.push(...writeVarString(state));
68
+ }
69
+ return new Uint8Array(result);
70
+ }
71
+ function createIframeBridgeProvider(ydoc, awareness$1) {
72
+ let applyingParentUpdate = false;
73
+ let serverClientId = null;
74
+ const onYdocUpdate = (update) => {
75
+ if (applyingParentUpdate) return;
76
+ window.parent.postMessage(
77
+ { type: "ydoc-update", payload: Array.from(update) },
78
+ "*"
79
+ );
80
+ };
81
+ const onAwarenessUpdate = ({
82
+ added,
83
+ updated,
84
+ removed
85
+ }) => {
86
+ if (applyingParentUpdate) return;
87
+ const changes = [...added, ...updated, ...removed];
88
+ if (changes.length === 0) return;
89
+ const update = awareness.encodeAwarenessUpdate(awareness$1, changes);
90
+ const remapped = serverClientId != null ? remapClientIdInUpdate(update, awareness$1.clientID, serverClientId) : update;
91
+ window.parent.postMessage(
92
+ { type: "awareness-update", payload: Array.from(remapped) },
93
+ "*"
94
+ );
95
+ };
96
+ const onMessage = (event) => {
97
+ if (event.source !== window.parent) return;
98
+ const { type, payload, serverClientId: receivedServerId } = event.data;
99
+ if (type === "pong" && receivedServerId != null) {
100
+ serverClientId = receivedServerId;
101
+ return;
102
+ }
103
+ if (type === "ydoc-sync" || type === "ydoc-update") {
104
+ applyingParentUpdate = true;
105
+ Y__namespace.applyUpdate(ydoc, new Uint8Array(payload));
106
+ applyingParentUpdate = false;
107
+ } else if (type === "awareness-sync" || type === "awareness-update") {
108
+ if (receivedServerId != null) {
109
+ serverClientId = receivedServerId;
110
+ }
111
+ const raw = new Uint8Array(payload);
112
+ const remapped = serverClientId != null ? remapClientIdInUpdate(raw, serverClientId, awareness$1.clientID) : raw;
113
+ applyingParentUpdate = true;
114
+ awareness.applyAwarenessUpdate(awareness$1, remapped, null);
115
+ applyingParentUpdate = false;
116
+ }
117
+ };
118
+ ydoc.on("update", onYdocUpdate);
119
+ awareness$1.on("update", onAwarenessUpdate);
120
+ window.addEventListener("message", onMessage);
121
+ window.parent.postMessage({ type: "init" }, "*");
122
+ return {
123
+ get serverClientId() {
124
+ return serverClientId;
125
+ },
126
+ dispose: () => {
127
+ ydoc.off("update", onYdocUpdate);
128
+ awareness$1.off("update", onAwarenessUpdate);
129
+ window.removeEventListener("message", onMessage);
130
+ }
131
+ };
132
+ }
133
+ exports.createIframeBridgeProvider = createIframeBridgeProvider;
134
+ //# sourceMappingURL=provider.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.cjs.js","sources":["../../../iframe-bridge/src/provider.ts"],"sourcesContent":["import * as Y from \"yjs\";\nimport {\n Awareness,\n applyAwarenessUpdate,\n encodeAwarenessUpdate,\n} from \"y-protocols/awareness\";\n\nexport interface IframeBridgeProvider {\n serverClientId: number | null;\n dispose: () => void;\n}\n\nfunction readVarUint(data: Uint8Array, pos: number): [number, number] {\n let result = 0;\n let shift = 0;\n let byte: number;\n do {\n byte = data[pos++];\n result |= (byte & 0x7f) << shift;\n shift += 7;\n } while (byte >= 0x80);\n return [result >>> 0, pos];\n}\n\nfunction writeVarUint(value: number): number[] {\n const bytes: number[] = [];\n while (value > 0x7f) {\n bytes.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n bytes.push(value);\n return bytes;\n}\n\nfunction readVarString(data: Uint8Array, pos: number): [string, number] {\n const [len, pos2] = readVarUint(data, pos);\n const str = new TextDecoder().decode(data.subarray(pos2, pos2 + len));\n return [str, pos2 + len];\n}\n\nfunction writeVarString(str: string): number[] {\n const encoded = new TextEncoder().encode(str);\n return [...writeVarUint(encoded.length), ...encoded];\n}\n\nfunction remapClientIdInUpdate(\n update: Uint8Array,\n fromId: number,\n toId: number,\n): Uint8Array {\n const result: number[] = [];\n let pos = 0;\n\n const [count, pos2] = readVarUint(update, pos);\n pos = pos2;\n result.push(...writeVarUint(count));\n\n for (let i = 0; i < count; i++) {\n const [clientID, pos3] = readVarUint(update, pos);\n pos = pos3;\n const [clock, pos4] = readVarUint(update, pos);\n pos = pos4;\n const [state, pos5] = readVarString(update, pos);\n pos = pos5;\n\n const mappedId = clientID === fromId ? toId : clientID;\n result.push(...writeVarUint(mappedId));\n result.push(...writeVarUint(clock));\n result.push(...writeVarString(state));\n }\n\n return new Uint8Array(result);\n}\n\nexport function createIframeBridgeProvider(\n ydoc: Y.Doc,\n awareness: Awareness,\n): IframeBridgeProvider {\n let applyingParentUpdate = false;\n let serverClientId: number | null = null;\n\n const onYdocUpdate = (update: Uint8Array) => {\n if (applyingParentUpdate) return;\n window.parent.postMessage(\n { type: \"ydoc-update\", payload: Array.from(update) },\n \"*\",\n );\n };\n\n const onAwarenessUpdate = ({\n added,\n updated,\n removed,\n }: {\n added: number[];\n updated: number[];\n removed: number[];\n }) => {\n if (applyingParentUpdate) return;\n const changes = [...added, ...updated, ...removed];\n if (changes.length === 0) return;\n\n const update = encodeAwarenessUpdate(awareness, changes);\n const remapped =\n serverClientId != null\n ? remapClientIdInUpdate(update, awareness.clientID, serverClientId)\n : update;\n\n window.parent.postMessage(\n { type: \"awareness-update\", payload: Array.from(remapped) },\n \"*\",\n );\n };\n\n const onMessage = (event: MessageEvent) => {\n if (event.source !== window.parent) return;\n const { type, payload, serverClientId: receivedServerId } = event.data;\n\n if (type === \"pong\" && receivedServerId != null) {\n serverClientId = receivedServerId;\n return;\n }\n\n if (type === \"ydoc-sync\" || type === \"ydoc-update\") {\n applyingParentUpdate = true;\n Y.applyUpdate(ydoc, new Uint8Array(payload));\n applyingParentUpdate = false;\n } else if (type === \"awareness-sync\" || type === \"awareness-update\") {\n if (receivedServerId != null) {\n serverClientId = receivedServerId;\n }\n\n const raw = new Uint8Array(payload);\n const remapped =\n serverClientId != null\n ? remapClientIdInUpdate(raw, serverClientId, awareness.clientID)\n : raw;\n\n applyingParentUpdate = true;\n applyAwarenessUpdate(awareness, remapped, null);\n applyingParentUpdate = false;\n }\n };\n\n ydoc.on(\"update\", onYdocUpdate);\n awareness.on(\"update\", onAwarenessUpdate);\n window.addEventListener(\"message\", onMessage);\n\n window.parent.postMessage({ type: \"init\" }, \"*\");\n\n return {\n get serverClientId() {\n return serverClientId;\n },\n dispose: () => {\n ydoc.off(\"update\", onYdocUpdate);\n awareness.off(\"update\", onAwarenessUpdate);\n window.removeEventListener(\"message\", onMessage);\n },\n };\n}\n"],"names":["awareness","encodeAwarenessUpdate","Y","applyAwarenessUpdate"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA,SAAS,YAAY,MAAkB,KAA+B;AACpE,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,MAAI;AACJ,KAAG;AACD,WAAO,KAAK,KAAK;AACjB,eAAW,OAAO,QAAS;AAC3B,aAAS;AAAA,EACX,SAAS,QAAQ;AACjB,SAAO,CAAC,WAAW,GAAG,GAAG;AAC3B;AAEA,SAAS,aAAa,OAAyB;AAC7C,QAAM,QAAkB,CAAA;AACxB,SAAO,QAAQ,KAAM;AACnB,UAAM,KAAM,QAAQ,MAAQ,GAAI;AAChC,eAAW;AAAA,EACb;AACA,QAAM,KAAK,KAAK;AAChB,SAAO;AACT;AAEA,SAAS,cAAc,MAAkB,KAA+B;AACtE,QAAM,CAAC,KAAK,IAAI,IAAI,YAAY,MAAM,GAAG;AACzC,QAAM,MAAM,IAAI,YAAA,EAAc,OAAO,KAAK,SAAS,MAAM,OAAO,GAAG,CAAC;AACpE,SAAO,CAAC,KAAK,OAAO,GAAG;AACzB;AAEA,SAAS,eAAe,KAAuB;AAC7C,QAAM,UAAU,IAAI,cAAc,OAAO,GAAG;AAC5C,SAAO,CAAC,GAAG,aAAa,QAAQ,MAAM,GAAG,GAAG,OAAO;AACrD;AAEA,SAAS,sBACP,QACA,QACA,MACY;AACZ,QAAM,SAAmB,CAAA;AACzB,MAAI,MAAM;AAEV,QAAM,CAAC,OAAO,IAAI,IAAI,YAAY,QAAQ,GAAG;AAC7C,QAAM;AACN,SAAO,KAAK,GAAG,aAAa,KAAK,CAAC;AAElC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,CAAC,UAAU,IAAI,IAAI,YAAY,QAAQ,GAAG;AAChD,UAAM;AACN,UAAM,CAAC,OAAO,IAAI,IAAI,YAAY,QAAQ,GAAG;AAC7C,UAAM;AACN,UAAM,CAAC,OAAO,IAAI,IAAI,cAAc,QAAQ,GAAG;AAC/C,UAAM;AAEN,UAAM,WAAW,aAAa,SAAS,OAAO;AAC9C,WAAO,KAAK,GAAG,aAAa,QAAQ,CAAC;AACrC,WAAO,KAAK,GAAG,aAAa,KAAK,CAAC;AAClC,WAAO,KAAK,GAAG,eAAe,KAAK,CAAC;AAAA,EACtC;AAEA,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEO,SAAS,2BACd,MACAA,aACsB;AACtB,MAAI,uBAAuB;AAC3B,MAAI,iBAAgC;AAEpC,QAAM,eAAe,CAAC,WAAuB;AAC3C,QAAI,qBAAsB;AAC1B,WAAO,OAAO;AAAA,MACZ,EAAE,MAAM,eAAe,SAAS,MAAM,KAAK,MAAM,EAAA;AAAA,MACjD;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,oBAAoB,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,MAKI;AACJ,QAAI,qBAAsB;AAC1B,UAAM,UAAU,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO;AACjD,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,SAASC,UAAAA,sBAAsBD,aAAW,OAAO;AACvD,UAAM,WACJ,kBAAkB,OACd,sBAAsB,QAAQA,YAAU,UAAU,cAAc,IAChE;AAEN,WAAO,OAAO;AAAA,MACZ,EAAE,MAAM,oBAAoB,SAAS,MAAM,KAAK,QAAQ,EAAA;AAAA,MACxD;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,YAAY,CAAC,UAAwB;AACzC,QAAI,MAAM,WAAW,OAAO,OAAQ;AACpC,UAAM,EAAE,MAAM,SAAS,gBAAgB,iBAAA,IAAqB,MAAM;AAElE,QAAI,SAAS,UAAU,oBAAoB,MAAM;AAC/C,uBAAiB;AACjB;AAAA,IACF;AAEA,QAAI,SAAS,eAAe,SAAS,eAAe;AAClD,6BAAuB;AACvBE,mBAAE,YAAY,MAAM,IAAI,WAAW,OAAO,CAAC;AAC3C,6BAAuB;AAAA,IACzB,WAAW,SAAS,oBAAoB,SAAS,oBAAoB;AACnE,UAAI,oBAAoB,MAAM;AAC5B,yBAAiB;AAAA,MACnB;AAEA,YAAM,MAAM,IAAI,WAAW,OAAO;AAClC,YAAM,WACJ,kBAAkB,OACd,sBAAsB,KAAK,gBAAgBF,YAAU,QAAQ,IAC7D;AAEN,6BAAuB;AACvBG,qCAAqBH,aAAW,UAAU,IAAI;AAC9C,6BAAuB;AAAA,IACzB;AAAA,EACF;AAEA,OAAK,GAAG,UAAU,YAAY;AAC9BA,cAAU,GAAG,UAAU,iBAAiB;AACxC,SAAO,iBAAiB,WAAW,SAAS;AAE5C,SAAO,OAAO,YAAY,EAAE,MAAM,OAAA,GAAU,GAAG;AAE/C,SAAO;AAAA,IACL,IAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AAAA,IACA,SAAS,MAAM;AACb,WAAK,IAAI,UAAU,YAAY;AAC/BA,kBAAU,IAAI,UAAU,iBAAiB;AACzC,aAAO,oBAAoB,WAAW,SAAS;AAAA,IACjD;AAAA,EAAA;AAEJ;;"}
@@ -0,0 +1,117 @@
1
+ import * as Y from "yjs";
2
+ import { encodeAwarenessUpdate, applyAwarenessUpdate } from "y-protocols/awareness";
3
+ function readVarUint(data, pos) {
4
+ let result = 0;
5
+ let shift = 0;
6
+ let byte;
7
+ do {
8
+ byte = data[pos++];
9
+ result |= (byte & 127) << shift;
10
+ shift += 7;
11
+ } while (byte >= 128);
12
+ return [result >>> 0, pos];
13
+ }
14
+ function writeVarUint(value) {
15
+ const bytes = [];
16
+ while (value > 127) {
17
+ bytes.push(value & 127 | 128);
18
+ value >>>= 7;
19
+ }
20
+ bytes.push(value);
21
+ return bytes;
22
+ }
23
+ function readVarString(data, pos) {
24
+ const [len, pos2] = readVarUint(data, pos);
25
+ const str = new TextDecoder().decode(data.subarray(pos2, pos2 + len));
26
+ return [str, pos2 + len];
27
+ }
28
+ function writeVarString(str) {
29
+ const encoded = new TextEncoder().encode(str);
30
+ return [...writeVarUint(encoded.length), ...encoded];
31
+ }
32
+ function remapClientIdInUpdate(update, fromId, toId) {
33
+ const result = [];
34
+ let pos = 0;
35
+ const [count, pos2] = readVarUint(update, pos);
36
+ pos = pos2;
37
+ result.push(...writeVarUint(count));
38
+ for (let i = 0; i < count; i++) {
39
+ const [clientID, pos3] = readVarUint(update, pos);
40
+ pos = pos3;
41
+ const [clock, pos4] = readVarUint(update, pos);
42
+ pos = pos4;
43
+ const [state, pos5] = readVarString(update, pos);
44
+ pos = pos5;
45
+ const mappedId = clientID === fromId ? toId : clientID;
46
+ result.push(...writeVarUint(mappedId));
47
+ result.push(...writeVarUint(clock));
48
+ result.push(...writeVarString(state));
49
+ }
50
+ return new Uint8Array(result);
51
+ }
52
+ function createIframeBridgeProvider(ydoc, awareness) {
53
+ let applyingParentUpdate = false;
54
+ let serverClientId = null;
55
+ const onYdocUpdate = (update) => {
56
+ if (applyingParentUpdate) return;
57
+ window.parent.postMessage(
58
+ { type: "ydoc-update", payload: Array.from(update) },
59
+ "*"
60
+ );
61
+ };
62
+ const onAwarenessUpdate = ({
63
+ added,
64
+ updated,
65
+ removed
66
+ }) => {
67
+ if (applyingParentUpdate) return;
68
+ const changes = [...added, ...updated, ...removed];
69
+ if (changes.length === 0) return;
70
+ const update = encodeAwarenessUpdate(awareness, changes);
71
+ const remapped = serverClientId != null ? remapClientIdInUpdate(update, awareness.clientID, serverClientId) : update;
72
+ window.parent.postMessage(
73
+ { type: "awareness-update", payload: Array.from(remapped) },
74
+ "*"
75
+ );
76
+ };
77
+ const onMessage = (event) => {
78
+ if (event.source !== window.parent) return;
79
+ const { type, payload, serverClientId: receivedServerId } = event.data;
80
+ if (type === "pong" && receivedServerId != null) {
81
+ serverClientId = receivedServerId;
82
+ return;
83
+ }
84
+ if (type === "ydoc-sync" || type === "ydoc-update") {
85
+ applyingParentUpdate = true;
86
+ Y.applyUpdate(ydoc, new Uint8Array(payload));
87
+ applyingParentUpdate = false;
88
+ } else if (type === "awareness-sync" || type === "awareness-update") {
89
+ if (receivedServerId != null) {
90
+ serverClientId = receivedServerId;
91
+ }
92
+ const raw = new Uint8Array(payload);
93
+ const remapped = serverClientId != null ? remapClientIdInUpdate(raw, serverClientId, awareness.clientID) : raw;
94
+ applyingParentUpdate = true;
95
+ applyAwarenessUpdate(awareness, remapped, null);
96
+ applyingParentUpdate = false;
97
+ }
98
+ };
99
+ ydoc.on("update", onYdocUpdate);
100
+ awareness.on("update", onAwarenessUpdate);
101
+ window.addEventListener("message", onMessage);
102
+ window.parent.postMessage({ type: "init" }, "*");
103
+ return {
104
+ get serverClientId() {
105
+ return serverClientId;
106
+ },
107
+ dispose: () => {
108
+ ydoc.off("update", onYdocUpdate);
109
+ awareness.off("update", onAwarenessUpdate);
110
+ window.removeEventListener("message", onMessage);
111
+ }
112
+ };
113
+ }
114
+ export {
115
+ createIframeBridgeProvider
116
+ };
117
+ //# sourceMappingURL=provider.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.es.js","sources":["../../../iframe-bridge/src/provider.ts"],"sourcesContent":["import * as Y from \"yjs\";\nimport {\n Awareness,\n applyAwarenessUpdate,\n encodeAwarenessUpdate,\n} from \"y-protocols/awareness\";\n\nexport interface IframeBridgeProvider {\n serverClientId: number | null;\n dispose: () => void;\n}\n\nfunction readVarUint(data: Uint8Array, pos: number): [number, number] {\n let result = 0;\n let shift = 0;\n let byte: number;\n do {\n byte = data[pos++];\n result |= (byte & 0x7f) << shift;\n shift += 7;\n } while (byte >= 0x80);\n return [result >>> 0, pos];\n}\n\nfunction writeVarUint(value: number): number[] {\n const bytes: number[] = [];\n while (value > 0x7f) {\n bytes.push((value & 0x7f) | 0x80);\n value >>>= 7;\n }\n bytes.push(value);\n return bytes;\n}\n\nfunction readVarString(data: Uint8Array, pos: number): [string, number] {\n const [len, pos2] = readVarUint(data, pos);\n const str = new TextDecoder().decode(data.subarray(pos2, pos2 + len));\n return [str, pos2 + len];\n}\n\nfunction writeVarString(str: string): number[] {\n const encoded = new TextEncoder().encode(str);\n return [...writeVarUint(encoded.length), ...encoded];\n}\n\nfunction remapClientIdInUpdate(\n update: Uint8Array,\n fromId: number,\n toId: number,\n): Uint8Array {\n const result: number[] = [];\n let pos = 0;\n\n const [count, pos2] = readVarUint(update, pos);\n pos = pos2;\n result.push(...writeVarUint(count));\n\n for (let i = 0; i < count; i++) {\n const [clientID, pos3] = readVarUint(update, pos);\n pos = pos3;\n const [clock, pos4] = readVarUint(update, pos);\n pos = pos4;\n const [state, pos5] = readVarString(update, pos);\n pos = pos5;\n\n const mappedId = clientID === fromId ? toId : clientID;\n result.push(...writeVarUint(mappedId));\n result.push(...writeVarUint(clock));\n result.push(...writeVarString(state));\n }\n\n return new Uint8Array(result);\n}\n\nexport function createIframeBridgeProvider(\n ydoc: Y.Doc,\n awareness: Awareness,\n): IframeBridgeProvider {\n let applyingParentUpdate = false;\n let serverClientId: number | null = null;\n\n const onYdocUpdate = (update: Uint8Array) => {\n if (applyingParentUpdate) return;\n window.parent.postMessage(\n { type: \"ydoc-update\", payload: Array.from(update) },\n \"*\",\n );\n };\n\n const onAwarenessUpdate = ({\n added,\n updated,\n removed,\n }: {\n added: number[];\n updated: number[];\n removed: number[];\n }) => {\n if (applyingParentUpdate) return;\n const changes = [...added, ...updated, ...removed];\n if (changes.length === 0) return;\n\n const update = encodeAwarenessUpdate(awareness, changes);\n const remapped =\n serverClientId != null\n ? remapClientIdInUpdate(update, awareness.clientID, serverClientId)\n : update;\n\n window.parent.postMessage(\n { type: \"awareness-update\", payload: Array.from(remapped) },\n \"*\",\n );\n };\n\n const onMessage = (event: MessageEvent) => {\n if (event.source !== window.parent) return;\n const { type, payload, serverClientId: receivedServerId } = event.data;\n\n if (type === \"pong\" && receivedServerId != null) {\n serverClientId = receivedServerId;\n return;\n }\n\n if (type === \"ydoc-sync\" || type === \"ydoc-update\") {\n applyingParentUpdate = true;\n Y.applyUpdate(ydoc, new Uint8Array(payload));\n applyingParentUpdate = false;\n } else if (type === \"awareness-sync\" || type === \"awareness-update\") {\n if (receivedServerId != null) {\n serverClientId = receivedServerId;\n }\n\n const raw = new Uint8Array(payload);\n const remapped =\n serverClientId != null\n ? remapClientIdInUpdate(raw, serverClientId, awareness.clientID)\n : raw;\n\n applyingParentUpdate = true;\n applyAwarenessUpdate(awareness, remapped, null);\n applyingParentUpdate = false;\n }\n };\n\n ydoc.on(\"update\", onYdocUpdate);\n awareness.on(\"update\", onAwarenessUpdate);\n window.addEventListener(\"message\", onMessage);\n\n window.parent.postMessage({ type: \"init\" }, \"*\");\n\n return {\n get serverClientId() {\n return serverClientId;\n },\n dispose: () => {\n ydoc.off(\"update\", onYdocUpdate);\n awareness.off(\"update\", onAwarenessUpdate);\n window.removeEventListener(\"message\", onMessage);\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const Y = require("yjs");
4
+ const awareness = require("y-protocols/awareness");
5
+ function _interopNamespaceDefault(e) {
6
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
+ if (e) {
8
+ for (const k in e) {
9
+ if (k !== "default") {
10
+ const d = Object.getOwnPropertyDescriptor(e, k);
11
+ Object.defineProperty(n, k, d.get ? d : {
12
+ enumerable: true,
13
+ get: () => e[k]
14
+ });
15
+ }
16
+ }
17
+ }
18
+ n.default = e;
19
+ return Object.freeze(n);
20
+ }
21
+ const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
22
+ function createIframeBridgeServer(ydoc, awareness$1) {
23
+ const iframes = /* @__PURE__ */ new Map();
24
+ const iframeReady = /* @__PURE__ */ new Set();
25
+ const onYdocUpdate = (update) => {
26
+ broadcastToAll("ydoc-update", update);
27
+ };
28
+ const onAwarenessUpdate = ({
29
+ added,
30
+ updated,
31
+ removed
32
+ }) => {
33
+ const changes = [...added, ...updated, ...removed];
34
+ if (changes.length === 0) return;
35
+ const update = awareness.encodeAwarenessUpdate(awareness$1, changes);
36
+ broadcastToAll("awareness-update", update);
37
+ };
38
+ function broadcastToAll(type, payload) {
39
+ for (const iframe of iframes.values()) {
40
+ if (iframe.contentWindow) {
41
+ iframe.contentWindow.postMessage({ type, payload }, "*");
42
+ }
43
+ }
44
+ }
45
+ const onMessage = (event) => {
46
+ let iframeId = null;
47
+ for (const [id, iframe] of iframes) {
48
+ if (event.source === iframe.contentWindow) {
49
+ iframeId = id;
50
+ break;
51
+ }
52
+ }
53
+ if (!iframeId) return;
54
+ const { type: msgType, payload } = event.data;
55
+ const sourceWindow = event.source;
56
+ if (msgType === "init") {
57
+ if (!iframeReady.has(iframeId)) {
58
+ iframeReady.add(iframeId);
59
+ }
60
+ const docState = Y__namespace.encodeStateAsUpdate(ydoc);
61
+ const awarenessState = awareness.encodeAwarenessUpdate(
62
+ awareness$1,
63
+ Array.from(awareness$1.getStates().keys())
64
+ );
65
+ sourceWindow.postMessage(
66
+ { type: "ydoc-sync", payload: Array.from(docState) },
67
+ "*"
68
+ );
69
+ sourceWindow.postMessage(
70
+ {
71
+ type: "awareness-sync",
72
+ payload: Array.from(awarenessState),
73
+ serverClientId: awareness$1.clientID
74
+ },
75
+ "*"
76
+ );
77
+ } else if (msgType === "ping") {
78
+ sourceWindow.postMessage(
79
+ { type: "pong", serverClientId: awareness$1.clientID },
80
+ "*"
81
+ );
82
+ } else if (msgType === "ydoc-update") {
83
+ Y__namespace.applyUpdate(ydoc, new Uint8Array(payload));
84
+ } else if (msgType === "awareness-update") {
85
+ awareness.applyAwarenessUpdate(awareness$1, new Uint8Array(payload), null);
86
+ }
87
+ };
88
+ function addIframe(iframe, iframeId) {
89
+ iframes.set(iframeId, iframe);
90
+ }
91
+ function removeIframe(iframeId) {
92
+ iframes.delete(iframeId);
93
+ iframeReady.delete(iframeId);
94
+ }
95
+ ydoc.on("update", onYdocUpdate);
96
+ awareness$1.on("update", onAwarenessUpdate);
97
+ window.addEventListener("message", onMessage);
98
+ return {
99
+ addIframe,
100
+ removeIframe,
101
+ dispose: () => {
102
+ ydoc.off("update", onYdocUpdate);
103
+ awareness$1.off("update", onAwarenessUpdate);
104
+ window.removeEventListener("message", onMessage);
105
+ iframes.clear();
106
+ iframeReady.clear();
107
+ }
108
+ };
109
+ }
110
+ exports.createIframeBridgeServer = createIframeBridgeServer;
111
+ //# sourceMappingURL=server.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs.js","sources":["../../../iframe-bridge/src/server.ts"],"sourcesContent":["import * as Y from \"yjs\";\nimport {\n Awareness,\n applyAwarenessUpdate,\n encodeAwarenessUpdate,\n} from \"y-protocols/awareness\";\n\nexport interface IframeBridgeServer {\n addIframe: (iframe: HTMLIFrameElement, iframeId: string) => void;\n removeIframe: (iframeId: string) => void;\n dispose: () => void;\n}\n\nexport function createIframeBridgeServer(\n ydoc: Y.Doc,\n awareness: Awareness,\n): IframeBridgeServer {\n const iframes = new Map<string, HTMLIFrameElement>();\n const iframeReady = new Set<string>();\n\n const onYdocUpdate = (update: Uint8Array) => {\n broadcastToAll(\"ydoc-update\", update);\n };\n\n const onAwarenessUpdate = ({\n added,\n updated,\n removed,\n }: {\n added: number[];\n updated: number[];\n removed: number[];\n }) => {\n const changes = [...added, ...updated, ...removed];\n if (changes.length === 0) return;\n const update = encodeAwarenessUpdate(awareness, changes);\n broadcastToAll(\"awareness-update\", update);\n };\n\n function broadcastToAll(type: string, payload: Uint8Array) {\n for (const iframe of iframes.values()) {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type, payload }, \"*\");\n }\n }\n }\n\n const onMessage = (event: MessageEvent) => {\n let iframeId: string | null = null;\n for (const [id, iframe] of iframes) {\n if (event.source === iframe.contentWindow) {\n iframeId = id;\n break;\n }\n }\n if (!iframeId) return;\n\n const { type: msgType, payload } = event.data;\n const sourceWindow = event.source as Window;\n\n if (msgType === \"init\") {\n if (!iframeReady.has(iframeId)) {\n iframeReady.add(iframeId);\n }\n const docState = Y.encodeStateAsUpdate(ydoc);\n const awarenessState = encodeAwarenessUpdate(\n awareness,\n Array.from(awareness.getStates().keys()),\n );\n sourceWindow.postMessage(\n { type: \"ydoc-sync\", payload: Array.from(docState) },\n \"*\",\n );\n sourceWindow.postMessage(\n {\n type: \"awareness-sync\",\n payload: Array.from(awarenessState),\n serverClientId: awareness.clientID,\n },\n \"*\",\n );\n } else if (msgType === \"ping\") {\n sourceWindow.postMessage(\n { type: \"pong\", serverClientId: awareness.clientID },\n \"*\",\n );\n } else if (msgType === \"ydoc-update\") {\n Y.applyUpdate(ydoc, new Uint8Array(payload));\n } else if (msgType === \"awareness-update\") {\n applyAwarenessUpdate(awareness, new Uint8Array(payload), null);\n }\n };\n\n function addIframe(iframe: HTMLIFrameElement, iframeId: string) {\n iframes.set(iframeId, iframe);\n }\n\n function removeIframe(iframeId: string) {\n iframes.delete(iframeId);\n iframeReady.delete(iframeId);\n }\n\n ydoc.on(\"update\", onYdocUpdate);\n awareness.on(\"update\", onAwarenessUpdate);\n window.addEventListener(\"message\", onMessage);\n\n return {\n addIframe,\n removeIframe,\n dispose: () => {\n ydoc.off(\"update\", onYdocUpdate);\n awareness.off(\"update\", onAwarenessUpdate);\n window.removeEventListener(\"message\", onMessage);\n iframes.clear();\n iframeReady.clear();\n },\n };\n}\n"],"names":["awareness","encodeAwarenessUpdate","Y","applyAwarenessUpdate"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,yBACd,MACAA,aACoB;AACpB,QAAM,8BAAc,IAAA;AACpB,QAAM,kCAAkB,IAAA;AAExB,QAAM,eAAe,CAAC,WAAuB;AAC3C,mBAAe,eAAe,MAAM;AAAA,EACtC;AAEA,QAAM,oBAAoB,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,MAKI;AACJ,UAAM,UAAU,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO;AACjD,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,SAASC,UAAAA,sBAAsBD,aAAW,OAAO;AACvD,mBAAe,oBAAoB,MAAM;AAAA,EAC3C;AAEA,WAAS,eAAe,MAAc,SAAqB;AACzD,eAAW,UAAU,QAAQ,UAAU;AACrC,UAAI,OAAO,eAAe;AACxB,eAAO,cAAc,YAAY,EAAE,MAAM,QAAA,GAAW,GAAG;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,UAAwB;AACzC,QAAI,WAA0B;AAC9B,eAAW,CAAC,IAAI,MAAM,KAAK,SAAS;AAClC,UAAI,MAAM,WAAW,OAAO,eAAe;AACzC,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,SAAU;AAEf,UAAM,EAAE,MAAM,SAAS,QAAA,IAAY,MAAM;AACzC,UAAM,eAAe,MAAM;AAE3B,QAAI,YAAY,QAAQ;AACtB,UAAI,CAAC,YAAY,IAAI,QAAQ,GAAG;AAC9B,oBAAY,IAAI,QAAQ;AAAA,MAC1B;AACA,YAAM,WAAWE,aAAE,oBAAoB,IAAI;AAC3C,YAAM,iBAAiBD,UAAAA;AAAAA,QACrBD;AAAAA,QACA,MAAM,KAAKA,YAAU,UAAA,EAAY,MAAM;AAAA,MAAA;AAEzC,mBAAa;AAAA,QACX,EAAE,MAAM,aAAa,SAAS,MAAM,KAAK,QAAQ,EAAA;AAAA,QACjD;AAAA,MAAA;AAEF,mBAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,SAAS,MAAM,KAAK,cAAc;AAAA,UAClC,gBAAgBA,YAAU;AAAA,QAAA;AAAA,QAE5B;AAAA,MAAA;AAAA,IAEJ,WAAW,YAAY,QAAQ;AAC7B,mBAAa;AAAA,QACX,EAAE,MAAM,QAAQ,gBAAgBA,YAAU,SAAA;AAAA,QAC1C;AAAA,MAAA;AAAA,IAEJ,WAAW,YAAY,eAAe;AACpCE,mBAAE,YAAY,MAAM,IAAI,WAAW,OAAO,CAAC;AAAA,IAC7C,WAAW,YAAY,oBAAoB;AACzCC,gBAAAA,qBAAqBH,aAAW,IAAI,WAAW,OAAO,GAAG,IAAI;AAAA,IAC/D;AAAA,EACF;AAEA,WAAS,UAAU,QAA2B,UAAkB;AAC9D,YAAQ,IAAI,UAAU,MAAM;AAAA,EAC9B;AAEA,WAAS,aAAa,UAAkB;AACtC,YAAQ,OAAO,QAAQ;AACvB,gBAAY,OAAO,QAAQ;AAAA,EAC7B;AAEA,OAAK,GAAG,UAAU,YAAY;AAC9BA,cAAU,GAAG,UAAU,iBAAiB;AACxC,SAAO,iBAAiB,WAAW,SAAS;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AACb,WAAK,IAAI,UAAU,YAAY;AAC/BA,kBAAU,IAAI,UAAU,iBAAiB;AACzC,aAAO,oBAAoB,WAAW,SAAS;AAC/C,cAAQ,MAAA;AACR,kBAAY,MAAA;AAAA,IACd;AAAA,EAAA;AAEJ;;"}
@@ -0,0 +1,94 @@
1
+ import * as Y from "yjs";
2
+ import { encodeAwarenessUpdate, applyAwarenessUpdate } from "y-protocols/awareness";
3
+ function createIframeBridgeServer(ydoc, awareness) {
4
+ const iframes = /* @__PURE__ */ new Map();
5
+ const iframeReady = /* @__PURE__ */ new Set();
6
+ const onYdocUpdate = (update) => {
7
+ broadcastToAll("ydoc-update", update);
8
+ };
9
+ const onAwarenessUpdate = ({
10
+ added,
11
+ updated,
12
+ removed
13
+ }) => {
14
+ const changes = [...added, ...updated, ...removed];
15
+ if (changes.length === 0) return;
16
+ const update = encodeAwarenessUpdate(awareness, changes);
17
+ broadcastToAll("awareness-update", update);
18
+ };
19
+ function broadcastToAll(type, payload) {
20
+ for (const iframe of iframes.values()) {
21
+ if (iframe.contentWindow) {
22
+ iframe.contentWindow.postMessage({ type, payload }, "*");
23
+ }
24
+ }
25
+ }
26
+ const onMessage = (event) => {
27
+ let iframeId = null;
28
+ for (const [id, iframe] of iframes) {
29
+ if (event.source === iframe.contentWindow) {
30
+ iframeId = id;
31
+ break;
32
+ }
33
+ }
34
+ if (!iframeId) return;
35
+ const { type: msgType, payload } = event.data;
36
+ const sourceWindow = event.source;
37
+ if (msgType === "init") {
38
+ if (!iframeReady.has(iframeId)) {
39
+ iframeReady.add(iframeId);
40
+ }
41
+ const docState = Y.encodeStateAsUpdate(ydoc);
42
+ const awarenessState = encodeAwarenessUpdate(
43
+ awareness,
44
+ Array.from(awareness.getStates().keys())
45
+ );
46
+ sourceWindow.postMessage(
47
+ { type: "ydoc-sync", payload: Array.from(docState) },
48
+ "*"
49
+ );
50
+ sourceWindow.postMessage(
51
+ {
52
+ type: "awareness-sync",
53
+ payload: Array.from(awarenessState),
54
+ serverClientId: awareness.clientID
55
+ },
56
+ "*"
57
+ );
58
+ } else if (msgType === "ping") {
59
+ sourceWindow.postMessage(
60
+ { type: "pong", serverClientId: awareness.clientID },
61
+ "*"
62
+ );
63
+ } else if (msgType === "ydoc-update") {
64
+ Y.applyUpdate(ydoc, new Uint8Array(payload));
65
+ } else if (msgType === "awareness-update") {
66
+ applyAwarenessUpdate(awareness, new Uint8Array(payload), null);
67
+ }
68
+ };
69
+ function addIframe(iframe, iframeId) {
70
+ iframes.set(iframeId, iframe);
71
+ }
72
+ function removeIframe(iframeId) {
73
+ iframes.delete(iframeId);
74
+ iframeReady.delete(iframeId);
75
+ }
76
+ ydoc.on("update", onYdocUpdate);
77
+ awareness.on("update", onAwarenessUpdate);
78
+ window.addEventListener("message", onMessage);
79
+ return {
80
+ addIframe,
81
+ removeIframe,
82
+ dispose: () => {
83
+ ydoc.off("update", onYdocUpdate);
84
+ awareness.off("update", onAwarenessUpdate);
85
+ window.removeEventListener("message", onMessage);
86
+ iframes.clear();
87
+ iframeReady.clear();
88
+ }
89
+ };
90
+ }
91
+ export {
92
+ createIframeBridgeServer
93
+ };
94
+ //# sourceMappingURL=server.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.es.js","sources":["../../../iframe-bridge/src/server.ts"],"sourcesContent":["import * as Y from \"yjs\";\nimport {\n Awareness,\n applyAwarenessUpdate,\n encodeAwarenessUpdate,\n} from \"y-protocols/awareness\";\n\nexport interface IframeBridgeServer {\n addIframe: (iframe: HTMLIFrameElement, iframeId: string) => void;\n removeIframe: (iframeId: string) => void;\n dispose: () => void;\n}\n\nexport function createIframeBridgeServer(\n ydoc: Y.Doc,\n awareness: Awareness,\n): IframeBridgeServer {\n const iframes = new Map<string, HTMLIFrameElement>();\n const iframeReady = new Set<string>();\n\n const onYdocUpdate = (update: Uint8Array) => {\n broadcastToAll(\"ydoc-update\", update);\n };\n\n const onAwarenessUpdate = ({\n added,\n updated,\n removed,\n }: {\n added: number[];\n updated: number[];\n removed: number[];\n }) => {\n const changes = [...added, ...updated, ...removed];\n if (changes.length === 0) return;\n const update = encodeAwarenessUpdate(awareness, changes);\n broadcastToAll(\"awareness-update\", update);\n };\n\n function broadcastToAll(type: string, payload: Uint8Array) {\n for (const iframe of iframes.values()) {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type, payload }, \"*\");\n }\n }\n }\n\n const onMessage = (event: MessageEvent) => {\n let iframeId: string | null = null;\n for (const [id, iframe] of iframes) {\n if (event.source === iframe.contentWindow) {\n iframeId = id;\n break;\n }\n }\n if (!iframeId) return;\n\n const { type: msgType, payload } = event.data;\n const sourceWindow = event.source as Window;\n\n if (msgType === \"init\") {\n if (!iframeReady.has(iframeId)) {\n iframeReady.add(iframeId);\n }\n const docState = Y.encodeStateAsUpdate(ydoc);\n const awarenessState = encodeAwarenessUpdate(\n awareness,\n Array.from(awareness.getStates().keys()),\n );\n sourceWindow.postMessage(\n { type: \"ydoc-sync\", payload: Array.from(docState) },\n \"*\",\n );\n sourceWindow.postMessage(\n {\n type: \"awareness-sync\",\n payload: Array.from(awarenessState),\n serverClientId: awareness.clientID,\n },\n \"*\",\n );\n } else if (msgType === \"ping\") {\n sourceWindow.postMessage(\n { type: \"pong\", serverClientId: awareness.clientID },\n \"*\",\n );\n } else if (msgType === \"ydoc-update\") {\n Y.applyUpdate(ydoc, new Uint8Array(payload));\n } else if (msgType === \"awareness-update\") {\n applyAwarenessUpdate(awareness, new Uint8Array(payload), null);\n }\n };\n\n function addIframe(iframe: HTMLIFrameElement, iframeId: string) {\n iframes.set(iframeId, iframe);\n }\n\n function removeIframe(iframeId: string) {\n iframes.delete(iframeId);\n iframeReady.delete(iframeId);\n }\n\n ydoc.on(\"update\", onYdocUpdate);\n awareness.on(\"update\", onAwarenessUpdate);\n window.addEventListener(\"message\", onMessage);\n\n return {\n addIframe,\n removeIframe,\n dispose: () => {\n ydoc.off(\"update\", onYdocUpdate);\n awareness.off(\"update\", onAwarenessUpdate);\n window.removeEventListener(\"message\", onMessage);\n iframes.clear();\n iframeReady.clear();\n },\n };\n}\n"],"names":[],"mappings":";;AAaO,SAAS,yBACd,MACA,WACoB;AACpB,QAAM,8BAAc,IAAA;AACpB,QAAM,kCAAkB,IAAA;AAExB,QAAM,eAAe,CAAC,WAAuB;AAC3C,mBAAe,eAAe,MAAM;AAAA,EACtC;AAEA,QAAM,oBAAoB,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,MAKI;AACJ,UAAM,UAAU,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO;AACjD,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,SAAS,sBAAsB,WAAW,OAAO;AACvD,mBAAe,oBAAoB,MAAM;AAAA,EAC3C;AAEA,WAAS,eAAe,MAAc,SAAqB;AACzD,eAAW,UAAU,QAAQ,UAAU;AACrC,UAAI,OAAO,eAAe;AACxB,eAAO,cAAc,YAAY,EAAE,MAAM,QAAA,GAAW,GAAG;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,UAAwB;AACzC,QAAI,WAA0B;AAC9B,eAAW,CAAC,IAAI,MAAM,KAAK,SAAS;AAClC,UAAI,MAAM,WAAW,OAAO,eAAe;AACzC,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,SAAU;AAEf,UAAM,EAAE,MAAM,SAAS,QAAA,IAAY,MAAM;AACzC,UAAM,eAAe,MAAM;AAE3B,QAAI,YAAY,QAAQ;AACtB,UAAI,CAAC,YAAY,IAAI,QAAQ,GAAG;AAC9B,oBAAY,IAAI,QAAQ;AAAA,MAC1B;AACA,YAAM,WAAW,EAAE,oBAAoB,IAAI;AAC3C,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,MAAM,KAAK,UAAU,UAAA,EAAY,MAAM;AAAA,MAAA;AAEzC,mBAAa;AAAA,QACX,EAAE,MAAM,aAAa,SAAS,MAAM,KAAK,QAAQ,EAAA;AAAA,QACjD;AAAA,MAAA;AAEF,mBAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,SAAS,MAAM,KAAK,cAAc;AAAA,UAClC,gBAAgB,UAAU;AAAA,QAAA;AAAA,QAE5B;AAAA,MAAA;AAAA,IAEJ,WAAW,YAAY,QAAQ;AAC7B,mBAAa;AAAA,QACX,EAAE,MAAM,QAAQ,gBAAgB,UAAU,SAAA;AAAA,QAC1C;AAAA,MAAA;AAAA,IAEJ,WAAW,YAAY,eAAe;AACpC,QAAE,YAAY,MAAM,IAAI,WAAW,OAAO,CAAC;AAAA,IAC7C,WAAW,YAAY,oBAAoB;AACzC,2BAAqB,WAAW,IAAI,WAAW,OAAO,GAAG,IAAI;AAAA,IAC/D;AAAA,EACF;AAEA,WAAS,UAAU,QAA2B,UAAkB;AAC9D,YAAQ,IAAI,UAAU,MAAM;AAAA,EAC9B;AAEA,WAAS,aAAa,UAAkB;AACtC,YAAQ,OAAO,QAAQ;AACvB,gBAAY,OAAO,QAAQ;AAAA,EAC7B;AAEA,OAAK,GAAG,UAAU,YAAY;AAC9B,YAAU,GAAG,UAAU,iBAAiB;AACxC,SAAO,iBAAiB,WAAW,SAAS;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AACb,WAAK,IAAI,UAAU,YAAY;AAC/B,gBAAU,IAAI,UAAU,iBAAiB;AACzC,aAAO,oBAAoB,WAAW,SAAS;AAC/C,cAAQ,MAAA;AACR,kBAAY,MAAA;AAAA,IACd;AAAA,EAAA;AAEJ;"}
package/index.d.ts CHANGED
@@ -3,6 +3,4 @@ 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";
6
- export { createIframeBridgeProvider, createIframeBridgeServer, } from "@y-mxgraph/iframe-bridge";
7
- export type { IframeBridgeProvider, IframeBridgeServer, } from "@y-mxgraph/iframe-bridge";
8
6
  //# sourceMappingURL=index.d.ts.map
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,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;AAChC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,0BAA0B,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.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Yjs binding for draw.io (mxGraph) documents",
5
5
  "keywords": [
6
6
  "yjs",
@@ -18,14 +18,22 @@
18
18
  "type": "module",
19
19
  "main": "./y-mxgraph.cjs.js",
20
20
  "module": "./y-mxgraph.es.js",
21
- "browser": "./y-mxgraph.umd.js",
22
21
  "types": "./index.d.ts",
23
22
  "exports": {
24
23
  ".": {
25
24
  "import": "./y-mxgraph.es.js",
26
25
  "require": "./y-mxgraph.cjs.js",
27
- "browser": "./y-mxgraph.umd.js",
28
26
  "types": "./index.d.ts"
27
+ },
28
+ "./iframe-bridge/server": {
29
+ "import": "./iframe-bridge/server.es.js",
30
+ "require": "./iframe-bridge/server.cjs.js",
31
+ "types": "./iframe-bridge/server.d.ts"
32
+ },
33
+ "./iframe-bridge/provider": {
34
+ "import": "./iframe-bridge/provider.es.js",
35
+ "require": "./iframe-bridge/provider.cjs.js",
36
+ "types": "./iframe-bridge/provider.d.ts"
29
37
  }
30
38
  },
31
39
  "dependencies": {