@ifc-lite/collab 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.
Files changed (219) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +92 -0
  3. package/dist/awareness/agent.d.ts +36 -0
  4. package/dist/awareness/agent.d.ts.map +1 -0
  5. package/dist/awareness/agent.js +39 -0
  6. package/dist/awareness/agent.js.map +1 -0
  7. package/dist/awareness/color.d.ts +31 -0
  8. package/dist/awareness/color.d.ts.map +1 -0
  9. package/dist/awareness/color.js +61 -0
  10. package/dist/awareness/color.js.map +1 -0
  11. package/dist/awareness/index.d.ts +6 -0
  12. package/dist/awareness/index.d.ts.map +1 -0
  13. package/dist/awareness/index.js +9 -0
  14. package/dist/awareness/index.js.map +1 -0
  15. package/dist/awareness/overlay.d.ts +59 -0
  16. package/dist/awareness/overlay.d.ts.map +1 -0
  17. package/dist/awareness/overlay.js +110 -0
  18. package/dist/awareness/overlay.js.map +1 -0
  19. package/dist/awareness/presence.d.ts +95 -0
  20. package/dist/awareness/presence.d.ts.map +1 -0
  21. package/dist/awareness/presence.js +114 -0
  22. package/dist/awareness/presence.js.map +1 -0
  23. package/dist/awareness/render.d.ts +58 -0
  24. package/dist/awareness/render.d.ts.map +1 -0
  25. package/dist/awareness/render.js +66 -0
  26. package/dist/awareness/render.js.map +1 -0
  27. package/dist/branch/branch-tree.d.ts +40 -0
  28. package/dist/branch/branch-tree.d.ts.map +1 -0
  29. package/dist/branch/branch-tree.js +66 -0
  30. package/dist/branch/branch-tree.js.map +1 -0
  31. package/dist/branch/branch.d.ts +44 -0
  32. package/dist/branch/branch.d.ts.map +1 -0
  33. package/dist/branch/branch.js +109 -0
  34. package/dist/branch/branch.js.map +1 -0
  35. package/dist/branch/history-automerge.d.ts +31 -0
  36. package/dist/branch/history-automerge.d.ts.map +1 -0
  37. package/dist/branch/history-automerge.js +237 -0
  38. package/dist/branch/history-automerge.js.map +1 -0
  39. package/dist/branch/history.d.ts +147 -0
  40. package/dist/branch/history.d.ts.map +1 -0
  41. package/dist/branch/history.js +223 -0
  42. package/dist/branch/history.js.map +1 -0
  43. package/dist/branch/index.d.ts +5 -0
  44. package/dist/branch/index.d.ts.map +1 -0
  45. package/dist/branch/index.js +8 -0
  46. package/dist/branch/index.js.map +1 -0
  47. package/dist/conflicts/detector.d.ts +52 -0
  48. package/dist/conflicts/detector.d.ts.map +1 -0
  49. package/dist/conflicts/detector.js +226 -0
  50. package/dist/conflicts/detector.js.map +1 -0
  51. package/dist/conflicts/index.d.ts +3 -0
  52. package/dist/conflicts/index.d.ts.map +1 -0
  53. package/dist/conflicts/index.js +6 -0
  54. package/dist/conflicts/index.js.map +1 -0
  55. package/dist/conflicts/ui-bridge.d.ts +80 -0
  56. package/dist/conflicts/ui-bridge.d.ts.map +1 -0
  57. package/dist/conflicts/ui-bridge.js +126 -0
  58. package/dist/conflicts/ui-bridge.js.map +1 -0
  59. package/dist/doc/entity.d.ts +84 -0
  60. package/dist/doc/entity.d.ts.map +1 -0
  61. package/dist/doc/entity.js +345 -0
  62. package/dist/doc/entity.js.map +1 -0
  63. package/dist/doc/geometry.d.ts +39 -0
  64. package/dist/doc/geometry.d.ts.map +1 -0
  65. package/dist/doc/geometry.js +99 -0
  66. package/dist/doc/geometry.js.map +1 -0
  67. package/dist/doc/index.d.ts +8 -0
  68. package/dist/doc/index.d.ts.map +1 -0
  69. package/dist/doc/index.js +11 -0
  70. package/dist/doc/index.js.map +1 -0
  71. package/dist/doc/migration-ifc4-to-ifc4x3.d.ts +21 -0
  72. package/dist/doc/migration-ifc4-to-ifc4x3.d.ts.map +1 -0
  73. package/dist/doc/migration-ifc4-to-ifc4x3.js +55 -0
  74. package/dist/doc/migration-ifc4-to-ifc4x3.js.map +1 -0
  75. package/dist/doc/relationship.d.ts +27 -0
  76. package/dist/doc/relationship.d.ts.map +1 -0
  77. package/dist/doc/relationship.js +110 -0
  78. package/dist/doc/relationship.js.map +1 -0
  79. package/dist/doc/schema-version.d.ts +47 -0
  80. package/dist/doc/schema-version.d.ts.map +1 -0
  81. package/dist/doc/schema-version.js +41 -0
  82. package/dist/doc/schema-version.js.map +1 -0
  83. package/dist/doc/schema.d.ts +131 -0
  84. package/dist/doc/schema.d.ts.map +1 -0
  85. package/dist/doc/schema.js +117 -0
  86. package/dist/doc/schema.js.map +1 -0
  87. package/dist/doc/units.d.ts +45 -0
  88. package/dist/doc/units.d.ts.map +1 -0
  89. package/dist/doc/units.js +120 -0
  90. package/dist/doc/units.js.map +1 -0
  91. package/dist/federation/bridge.d.ts +34 -0
  92. package/dist/federation/bridge.d.ts.map +1 -0
  93. package/dist/federation/bridge.js +52 -0
  94. package/dist/federation/bridge.js.map +1 -0
  95. package/dist/federation/index.d.ts +4 -0
  96. package/dist/federation/index.d.ts.map +1 -0
  97. package/dist/federation/index.js +7 -0
  98. package/dist/federation/index.js.map +1 -0
  99. package/dist/federation/resolver.d.ts +58 -0
  100. package/dist/federation/resolver.d.ts.map +1 -0
  101. package/dist/federation/resolver.js +43 -0
  102. package/dist/federation/resolver.js.map +1 -0
  103. package/dist/federation/session.d.ts +79 -0
  104. package/dist/federation/session.d.ts.map +1 -0
  105. package/dist/federation/session.js +126 -0
  106. package/dist/federation/session.js.map +1 -0
  107. package/dist/geometry/blob-store.d.ts +106 -0
  108. package/dist/geometry/blob-store.d.ts.map +1 -0
  109. package/dist/geometry/blob-store.js +266 -0
  110. package/dist/geometry/blob-store.js.map +1 -0
  111. package/dist/geometry/csg.d.ts +63 -0
  112. package/dist/geometry/csg.d.ts.map +1 -0
  113. package/dist/geometry/csg.js +101 -0
  114. package/dist/geometry/csg.js.map +1 -0
  115. package/dist/geometry/determinism.d.ts +45 -0
  116. package/dist/geometry/determinism.d.ts.map +1 -0
  117. package/dist/geometry/determinism.js +92 -0
  118. package/dist/geometry/determinism.js.map +1 -0
  119. package/dist/geometry/gc.d.ts +63 -0
  120. package/dist/geometry/gc.d.ts.map +1 -0
  121. package/dist/geometry/gc.js +109 -0
  122. package/dist/geometry/gc.js.map +1 -0
  123. package/dist/geometry/index.d.ts +6 -0
  124. package/dist/geometry/index.d.ts.map +1 -0
  125. package/dist/geometry/index.js +9 -0
  126. package/dist/geometry/index.js.map +1 -0
  127. package/dist/geometry/parametric.d.ts +92 -0
  128. package/dist/geometry/parametric.d.ts.map +1 -0
  129. package/dist/geometry/parametric.js +200 -0
  130. package/dist/geometry/parametric.js.map +1 -0
  131. package/dist/index.d.ts +27 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +46 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/mutations/bind.d.ts +56 -0
  136. package/dist/mutations/bind.d.ts.map +1 -0
  137. package/dist/mutations/bind.js +68 -0
  138. package/dist/mutations/bind.js.map +1 -0
  139. package/dist/mutations/index.d.ts +2 -0
  140. package/dist/mutations/index.d.ts.map +1 -0
  141. package/dist/mutations/index.js +5 -0
  142. package/dist/mutations/index.js.map +1 -0
  143. package/dist/perf/benchmark.d.ts +25 -0
  144. package/dist/perf/benchmark.d.ts.map +1 -0
  145. package/dist/perf/benchmark.js +97 -0
  146. package/dist/perf/benchmark.js.map +1 -0
  147. package/dist/perf/index.d.ts +3 -0
  148. package/dist/perf/index.d.ts.map +1 -0
  149. package/dist/perf/index.js +6 -0
  150. package/dist/perf/index.js.map +1 -0
  151. package/dist/perf/latency.d.ts +39 -0
  152. package/dist/perf/latency.d.ts.map +1 -0
  153. package/dist/perf/latency.js +79 -0
  154. package/dist/perf/latency.js.map +1 -0
  155. package/dist/privacy.d.ts +45 -0
  156. package/dist/privacy.d.ts.map +1 -0
  157. package/dist/privacy.js +66 -0
  158. package/dist/privacy.js.map +1 -0
  159. package/dist/providers/indexeddb.d.ts +37 -0
  160. package/dist/providers/indexeddb.d.ts.map +1 -0
  161. package/dist/providers/indexeddb.js +45 -0
  162. package/dist/providers/indexeddb.js.map +1 -0
  163. package/dist/providers/webrtc.d.ts +40 -0
  164. package/dist/providers/webrtc.d.ts.map +1 -0
  165. package/dist/providers/webrtc.js +81 -0
  166. package/dist/providers/webrtc.js.map +1 -0
  167. package/dist/providers/websocket.d.ts +45 -0
  168. package/dist/providers/websocket.d.ts.map +1 -0
  169. package/dist/providers/websocket.js +56 -0
  170. package/dist/providers/websocket.js.map +1 -0
  171. package/dist/security/e2e.d.ts +54 -0
  172. package/dist/security/e2e.d.ts.map +1 -0
  173. package/dist/security/e2e.js +147 -0
  174. package/dist/security/e2e.js.map +1 -0
  175. package/dist/security/index.d.ts +2 -0
  176. package/dist/security/index.d.ts.map +1 -0
  177. package/dist/security/index.js +5 -0
  178. package/dist/security/index.js.map +1 -0
  179. package/dist/session.d.ts +79 -0
  180. package/dist/session.d.ts.map +1 -0
  181. package/dist/session.js +112 -0
  182. package/dist/session.js.map +1 -0
  183. package/dist/snapshot/from-ifcx.d.ts +24 -0
  184. package/dist/snapshot/from-ifcx.d.ts.map +1 -0
  185. package/dist/snapshot/from-ifcx.js +93 -0
  186. package/dist/snapshot/from-ifcx.js.map +1 -0
  187. package/dist/snapshot/index.d.ts +6 -0
  188. package/dist/snapshot/index.d.ts.map +1 -0
  189. package/dist/snapshot/index.js +9 -0
  190. package/dist/snapshot/index.js.map +1 -0
  191. package/dist/snapshot/layers.d.ts +56 -0
  192. package/dist/snapshot/layers.d.ts.map +1 -0
  193. package/dist/snapshot/layers.js +82 -0
  194. package/dist/snapshot/layers.js.map +1 -0
  195. package/dist/snapshot/minimal-layer.d.ts +40 -0
  196. package/dist/snapshot/minimal-layer.d.ts.map +1 -0
  197. package/dist/snapshot/minimal-layer.js +123 -0
  198. package/dist/snapshot/minimal-layer.js.map +1 -0
  199. package/dist/snapshot/to-ifcx.d.ts +26 -0
  200. package/dist/snapshot/to-ifcx.d.ts.map +1 -0
  201. package/dist/snapshot/to-ifcx.js +54 -0
  202. package/dist/snapshot/to-ifcx.js.map +1 -0
  203. package/dist/snapshot/worker.d.ts +45 -0
  204. package/dist/snapshot/worker.d.ts.map +1 -0
  205. package/dist/snapshot/worker.js +73 -0
  206. package/dist/snapshot/worker.js.map +1 -0
  207. package/dist/sync/room.d.ts +15 -0
  208. package/dist/sync/room.d.ts.map +1 -0
  209. package/dist/sync/room.js +20 -0
  210. package/dist/sync/room.js.map +1 -0
  211. package/dist/undo.d.ts +25 -0
  212. package/dist/undo.d.ts.map +1 -0
  213. package/dist/undo.js +37 -0
  214. package/dist/undo.js.map +1 -0
  215. package/dist/viewer-bridge.d.ts +27 -0
  216. package/dist/viewer-bridge.d.ts.map +1 -0
  217. package/dist/viewer-bridge.js +82 -0
  218. package/dist/viewer-bridge.js.map +1 -0
  219. package/package.json +83 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-bridge.d.ts","sourceRoot":"","sources":["../../src/conflicts/ui-bridge.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,iBAAiB,CAAC;IACvB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,uDAAuD;IACvD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhF,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,MAAM,IAAI,cAAc,EAAE,CAAC;IAC3B,6DAA6D;IAC7D,EAAE,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAAC;IACzC;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,yDAAyD;IACzD,YAAY,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,gEAAgE;IAChE,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;IAC/E,qEAAqE;IACrE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;IACnF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,GAAE,uBAA4B,GACjC,gBAAgB,CAoHlB"}
@@ -0,0 +1,126 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Build a UI bridge subscribed to `detector`.
6
+ *
7
+ * Each `(kind, path, field)` triple maps to one bucket. A new event
8
+ * folded into an existing bucket emits `update`; a new triple emits
9
+ * `open`; an idle timeout or explicit `resolve()` emits `close`.
10
+ */
11
+ export function createConflictUIBridge(detector, opts = {}) {
12
+ const closeAfterMs = opts.closeAfterMs ?? 4_000;
13
+ const buckets = new Map();
14
+ const listeners = new Set();
15
+ const keepMineHandlers = new Map();
16
+ const acceptTheirsHandlers = new Map();
17
+ let timer = setInterval(sweep, 1_000);
18
+ function bucketKey(e) {
19
+ return `${e.kind}|${e.path}|${e.field ?? ''}`;
20
+ }
21
+ function emit(type, bucket) {
22
+ listeners.forEach((l) => l({ type, bucket }));
23
+ }
24
+ function sweep() {
25
+ const now = Date.now();
26
+ for (const bucket of Array.from(buckets.values())) {
27
+ if (now - bucket.lastSeenAt > closeAfterMs) {
28
+ buckets.delete(bucket.key);
29
+ emit('close', bucket);
30
+ }
31
+ }
32
+ }
33
+ const unsubscribe = detector.onConflict((event) => {
34
+ const key = bucketKey(event);
35
+ let bucket = buckets.get(key);
36
+ if (!bucket) {
37
+ bucket = {
38
+ key,
39
+ path: event.path,
40
+ field: event.field,
41
+ kind: event.kind,
42
+ contributors: new Set(event.contributors),
43
+ firstSeenAt: event.detectedAt,
44
+ lastSeenAt: event.detectedAt,
45
+ count: 1,
46
+ };
47
+ buckets.set(key, bucket);
48
+ emit('open', bucket);
49
+ return;
50
+ }
51
+ bucket.lastSeenAt = event.detectedAt;
52
+ bucket.count += 1;
53
+ let added = false;
54
+ for (const c of event.contributors) {
55
+ if (!bucket.contributors.has(c)) {
56
+ bucket.contributors.add(c);
57
+ added = true;
58
+ }
59
+ }
60
+ if (added)
61
+ emit('update', bucket);
62
+ });
63
+ async function runActions(table, bucket) {
64
+ const set = table.get(bucket.kind);
65
+ if (!set || set.size === 0)
66
+ return;
67
+ for (const action of set)
68
+ await action({ bucket });
69
+ }
70
+ return {
71
+ active: () => Array.from(buckets.values()),
72
+ on(listener) {
73
+ listeners.add(listener);
74
+ return () => listeners.delete(listener);
75
+ },
76
+ resolve(key) {
77
+ const bucket = buckets.get(key);
78
+ if (!bucket)
79
+ return false;
80
+ buckets.delete(key);
81
+ emit('close', bucket);
82
+ return true;
83
+ },
84
+ async keepMine(key) {
85
+ const bucket = buckets.get(key);
86
+ if (!bucket)
87
+ return false;
88
+ await runActions(keepMineHandlers, bucket);
89
+ buckets.delete(key);
90
+ emit('close', bucket);
91
+ return true;
92
+ },
93
+ async acceptTheirs(key) {
94
+ const bucket = buckets.get(key);
95
+ if (!bucket)
96
+ return false;
97
+ await runActions(acceptTheirsHandlers, bucket);
98
+ buckets.delete(key);
99
+ emit('close', bucket);
100
+ return true;
101
+ },
102
+ onKeepMine(kind, action) {
103
+ const set = keepMineHandlers.get(kind) ?? new Set();
104
+ set.add(action);
105
+ keepMineHandlers.set(kind, set);
106
+ return () => set.delete(action);
107
+ },
108
+ onAcceptTheirs(kind, action) {
109
+ const set = acceptTheirsHandlers.get(kind) ?? new Set();
110
+ set.add(action);
111
+ acceptTheirsHandlers.set(kind, set);
112
+ return () => set.delete(action);
113
+ },
114
+ destroy() {
115
+ unsubscribe();
116
+ if (timer)
117
+ clearInterval(timer);
118
+ timer = null;
119
+ buckets.clear();
120
+ listeners.clear();
121
+ keepMineHandlers.clear();
122
+ acceptTheirsHandlers.clear();
123
+ },
124
+ };
125
+ }
126
+ //# sourceMappingURL=ui-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-bridge.js","sourceRoot":"","sources":["../../src/conflicts/ui-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Entity-level operations on the Y.Doc.
3
+ *
4
+ * Each function maps directly to a row in the spec §6 operations table.
5
+ * Callers are expected to wrap multi-step edits in `ydoc.transact()`.
6
+ */
7
+ import * as Y from 'yjs';
8
+ import { type ClassificationRef, type EntityMeta, type GeometryRefRecord, type MaterialAssignment, type PropertyValue } from './schema.js';
9
+ /** Options for `createEntity`. */
10
+ export interface CreateEntityOptions {
11
+ ifcClass?: string;
12
+ schemaVersion?: 'ifc4' | 'ifc4x3' | 'ifc5';
13
+ attributes?: Record<string, unknown>;
14
+ children?: Record<string, string>;
15
+ inherits?: Record<string, string>;
16
+ meta?: EntityMeta;
17
+ }
18
+ /**
19
+ * Look up the entity Y.Map by path. Returns `undefined` if missing or
20
+ * tombstoned.
21
+ */
22
+ export declare function getEntity(doc: Y.Doc, path: string): Y.Map<unknown> | undefined;
23
+ /** Existence check that ignores tombstones. */
24
+ export declare function hasEntity(doc: Y.Doc, path: string): boolean;
25
+ /**
26
+ * Build a fresh entity Y.Map shape and register it under `path`.
27
+ *
28
+ * Idempotent: if the entity already exists, this is a no-op (use
29
+ * `setAttribute` etc. for incremental updates). To replace an entity
30
+ * outright, call `deleteEntity` first.
31
+ */
32
+ export declare function createEntity(doc: Y.Doc, path: string, options?: CreateEntityOptions): Y.Map<unknown>;
33
+ /**
34
+ * Delete an entity. Yjs preserves the operation as a tombstone; observers
35
+ * see a `delete` event.
36
+ */
37
+ export declare function deleteEntity(doc: Y.Doc, path: string): boolean;
38
+ /**
39
+ * Type promotion (e.g. IfcWall → IfcCurtainWall). Implemented as
40
+ * delete + create with `meta.previousPath` linking the new entity to the
41
+ * old path so consumers can render history.
42
+ */
43
+ export declare function promoteEntityType(doc: Y.Doc, oldPath: string, newPath: string, newIfcClass: string, options?: {
44
+ keepAttributes?: boolean;
45
+ }): Y.Map<unknown> | undefined;
46
+ /**
47
+ * Set a flat namespaced attribute (e.g. `bsi::ifc::class` or
48
+ * `usd::xformOp::translate`). Mirrors IFCX's wire shape.
49
+ */
50
+ export declare function setAttribute(doc: Y.Doc, path: string, name: string, value: unknown): void;
51
+ export declare function deleteAttribute(doc: Y.Doc, path: string, name: string): boolean;
52
+ export declare function getAttribute(doc: Y.Doc, path: string, name: string): unknown;
53
+ /** Set or update a `role → child path` entry on an entity. */
54
+ export declare function setChild(doc: Y.Doc, path: string, role: string, childPath: string): void;
55
+ export declare function removeChild(doc: Y.Doc, path: string, role: string): boolean;
56
+ /** Move an entity's containment by updating both endpoints atomically. */
57
+ export declare function moveEntity(doc: Y.Doc, childPath: string, fromParentPath: string, toParentPath: string, role: string): void;
58
+ /** Set a property within a Pset; creates the Pset map if missing. */
59
+ export declare function setPropertyValue(doc: Y.Doc, path: string, psetName: string, propName: string, value: PropertyValue): void;
60
+ export declare function deletePropertyValue(doc: Y.Doc, path: string, psetName: string, propName: string): boolean;
61
+ export declare function getPropertyValue(doc: Y.Doc, path: string, psetName: string, propName: string): PropertyValue | undefined;
62
+ export declare function setQuantityValue(doc: Y.Doc, path: string, qsetName: string, qtyName: string, value: number): void;
63
+ export declare function addClassification(doc: Y.Doc, path: string, ref: ClassificationRef): number;
64
+ export declare function addMaterial(doc: Y.Doc, path: string, assignment: MaterialAssignment): number;
65
+ /** Point an entity at a specific entry in the top-level geometry map. */
66
+ export declare function setGeometryRef(doc: Y.Doc, path: string, ref: GeometryRefRecord): void;
67
+ export declare function getGeometryRef(doc: Y.Doc, path: string): GeometryRefRecord | undefined;
68
+ /** Iterate every (path, entity) pair currently live. */
69
+ export declare function iterEntities(doc: Y.Doc): IterableIterator<[string, Y.Map<unknown>]>;
70
+ /**
71
+ * Convert an entity Y.Map into a plain JSON snapshot. Useful for tests and
72
+ * for the IFCX writer.
73
+ */
74
+ export declare function entityToJSON(entity: Y.Map<unknown>): {
75
+ attributes: Record<string, unknown>;
76
+ children: Record<string, string>;
77
+ inherits: Record<string, string>;
78
+ psets: Record<string, Record<string, PropertyValue>>;
79
+ classifications: ClassificationRef[];
80
+ materials: MaterialAssignment[];
81
+ geometryRef?: string;
82
+ meta: Record<string, unknown>;
83
+ };
84
+ //# sourceMappingURL=entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/doc/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,345 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Entity-level operations on the Y.Doc.
6
+ *
7
+ * Each function maps directly to a row in the spec §6 operations table.
8
+ * Callers are expected to wrap multi-step edits in `ydoc.transact()`.
9
+ */
10
+ import * as Y from 'yjs';
11
+ import { ENTITY_KEY, entitiesMap, } from './schema.js';
12
+ /**
13
+ * Look up the entity Y.Map by path. Returns `undefined` if missing or
14
+ * tombstoned.
15
+ */
16
+ export function getEntity(doc, path) {
17
+ return entitiesMap(doc).get(path);
18
+ }
19
+ /** Existence check that ignores tombstones. */
20
+ export function hasEntity(doc, path) {
21
+ return entitiesMap(doc).has(path);
22
+ }
23
+ /**
24
+ * Build a fresh entity Y.Map shape and register it under `path`.
25
+ *
26
+ * Idempotent: if the entity already exists, this is a no-op (use
27
+ * `setAttribute` etc. for incremental updates). To replace an entity
28
+ * outright, call `deleteEntity` first.
29
+ */
30
+ export function createEntity(doc, path, options = {}) {
31
+ const ents = entitiesMap(doc);
32
+ const existing = ents.get(path);
33
+ if (existing) {
34
+ return existing;
35
+ }
36
+ const entity = new Y.Map();
37
+ const attributes = new Y.Map();
38
+ if (options.attributes) {
39
+ for (const [k, v] of Object.entries(options.attributes)) {
40
+ attributes.set(k, v);
41
+ }
42
+ }
43
+ entity.set(ENTITY_KEY.ATTRIBUTES, attributes);
44
+ const children = new Y.Map();
45
+ if (options.children) {
46
+ for (const [role, target] of Object.entries(options.children)) {
47
+ children.set(role, target);
48
+ }
49
+ }
50
+ entity.set(ENTITY_KEY.CHILDREN, children);
51
+ const inherits = new Y.Map();
52
+ if (options.inherits) {
53
+ for (const [role, target] of Object.entries(options.inherits)) {
54
+ inherits.set(role, target);
55
+ }
56
+ }
57
+ entity.set(ENTITY_KEY.INHERITS, inherits);
58
+ entity.set(ENTITY_KEY.PSETS, new Y.Map());
59
+ entity.set(ENTITY_KEY.QUANTITIES, new Y.Map());
60
+ entity.set(ENTITY_KEY.CLASSIFICATIONS, new Y.Array());
61
+ entity.set(ENTITY_KEY.MATERIALS, new Y.Array());
62
+ entity.set(ENTITY_KEY.GEOMETRY_REF, new Y.Map());
63
+ const meta = new Y.Map();
64
+ const stamp = options.meta?.createdAt ?? new Date().toISOString();
65
+ if (options.ifcClass)
66
+ meta.set('ifcClass', options.ifcClass);
67
+ if (options.schemaVersion)
68
+ meta.set('schemaVersion', options.schemaVersion);
69
+ meta.set('createdAt', stamp);
70
+ if (options.meta) {
71
+ for (const [k, v] of Object.entries(options.meta)) {
72
+ meta.set(k, v);
73
+ }
74
+ }
75
+ entity.set(ENTITY_KEY.META, meta);
76
+ ents.set(path, entity);
77
+ return entity;
78
+ }
79
+ /**
80
+ * Delete an entity. Yjs preserves the operation as a tombstone; observers
81
+ * see a `delete` event.
82
+ */
83
+ export function deleteEntity(doc, path) {
84
+ const ents = entitiesMap(doc);
85
+ if (!ents.has(path))
86
+ return false;
87
+ ents.delete(path);
88
+ return true;
89
+ }
90
+ /**
91
+ * Type promotion (e.g. IfcWall → IfcCurtainWall). Implemented as
92
+ * delete + create with `meta.previousPath` linking the new entity to the
93
+ * old path so consumers can render history.
94
+ */
95
+ export function promoteEntityType(doc, oldPath, newPath, newIfcClass, options = {}) {
96
+ const old = getEntity(doc, oldPath);
97
+ if (!old)
98
+ return undefined;
99
+ const oldAttrs = old.get(ENTITY_KEY.ATTRIBUTES);
100
+ const oldChildren = old.get(ENTITY_KEY.CHILDREN);
101
+ const oldMeta = old.get(ENTITY_KEY.META);
102
+ const carried = {};
103
+ if (options.keepAttributes !== false && oldAttrs) {
104
+ for (const [k, v] of oldAttrs.entries())
105
+ carried[k] = v;
106
+ }
107
+ // ifcClass attribute, if any, is overridden.
108
+ carried['bsi::ifc::class'] = { code: newIfcClass };
109
+ const carriedChildren = {};
110
+ if (oldChildren) {
111
+ for (const [role, target] of oldChildren.entries()) {
112
+ carriedChildren[role] = target;
113
+ }
114
+ }
115
+ const meta = {
116
+ ifcClass: newIfcClass,
117
+ previousPath: oldPath,
118
+ createdAt: new Date().toISOString(),
119
+ lastEditedAt: new Date().toISOString(),
120
+ };
121
+ if (oldMeta) {
122
+ const createdBy = oldMeta.get('createdBy');
123
+ if (typeof createdBy === 'string')
124
+ meta.createdBy = createdBy;
125
+ }
126
+ deleteEntity(doc, oldPath);
127
+ return createEntity(doc, newPath, {
128
+ ifcClass: newIfcClass,
129
+ attributes: carried,
130
+ children: carriedChildren,
131
+ meta,
132
+ });
133
+ }
134
+ /* ------------------------------------------------------------------ */
135
+ /* Attributes */
136
+ /* ------------------------------------------------------------------ */
137
+ /**
138
+ * Set a flat namespaced attribute (e.g. `bsi::ifc::class` or
139
+ * `usd::xformOp::translate`). Mirrors IFCX's wire shape.
140
+ */
141
+ export function setAttribute(doc, path, name, value) {
142
+ const entity = getEntity(doc, path);
143
+ if (!entity)
144
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
145
+ const attrs = entity.get(ENTITY_KEY.ATTRIBUTES);
146
+ if (!attrs)
147
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing attributes map`);
148
+ attrs.set(name, value);
149
+ }
150
+ export function deleteAttribute(doc, path, name) {
151
+ const entity = getEntity(doc, path);
152
+ if (!entity)
153
+ return false;
154
+ const attrs = entity.get(ENTITY_KEY.ATTRIBUTES);
155
+ if (!attrs || !attrs.has(name))
156
+ return false;
157
+ attrs.delete(name);
158
+ return true;
159
+ }
160
+ export function getAttribute(doc, path, name) {
161
+ return getEntity(doc, path)?.get(ENTITY_KEY.ATTRIBUTES)?.get(name);
162
+ }
163
+ /* ------------------------------------------------------------------ */
164
+ /* Children / hierarchy */
165
+ /* ------------------------------------------------------------------ */
166
+ /** Set or update a `role → child path` entry on an entity. */
167
+ export function setChild(doc, path, role, childPath) {
168
+ const entity = getEntity(doc, path);
169
+ if (!entity)
170
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
171
+ const children = entity.get(ENTITY_KEY.CHILDREN);
172
+ if (!children)
173
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing children map`);
174
+ children.set(role, childPath);
175
+ }
176
+ export function removeChild(doc, path, role) {
177
+ const entity = getEntity(doc, path);
178
+ if (!entity)
179
+ return false;
180
+ const children = entity.get(ENTITY_KEY.CHILDREN);
181
+ if (!children || !children.has(role))
182
+ return false;
183
+ children.delete(role);
184
+ return true;
185
+ }
186
+ /** Move an entity's containment by updating both endpoints atomically. */
187
+ export function moveEntity(doc, childPath, fromParentPath, toParentPath, role) {
188
+ doc.transact(() => {
189
+ removeChild(doc, fromParentPath, role);
190
+ setChild(doc, toParentPath, role, childPath);
191
+ });
192
+ }
193
+ /* ------------------------------------------------------------------ */
194
+ /* Property sets */
195
+ /* ------------------------------------------------------------------ */
196
+ /** Set a property within a Pset; creates the Pset map if missing. */
197
+ export function setPropertyValue(doc, path, psetName, propName, value) {
198
+ const entity = getEntity(doc, path);
199
+ if (!entity)
200
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
201
+ const psets = entity.get(ENTITY_KEY.PSETS);
202
+ if (!psets)
203
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing psets map`);
204
+ let pset = psets.get(psetName);
205
+ if (!pset) {
206
+ pset = new Y.Map();
207
+ psets.set(psetName, pset);
208
+ }
209
+ pset.set(propName, value);
210
+ }
211
+ export function deletePropertyValue(doc, path, psetName, propName) {
212
+ const psets = getEntity(doc, path)?.get(ENTITY_KEY.PSETS);
213
+ const pset = psets?.get(psetName);
214
+ if (!pset || !pset.has(propName))
215
+ return false;
216
+ pset.delete(propName);
217
+ // Clean up empty psets.
218
+ if (pset.size === 0)
219
+ psets.delete(psetName);
220
+ return true;
221
+ }
222
+ export function getPropertyValue(doc, path, psetName, propName) {
223
+ const psets = getEntity(doc, path)?.get(ENTITY_KEY.PSETS);
224
+ return psets?.get(psetName)?.get(propName);
225
+ }
226
+ /* ------------------------------------------------------------------ */
227
+ /* Quantities */
228
+ /* ------------------------------------------------------------------ */
229
+ export function setQuantityValue(doc, path, qsetName, qtyName, value) {
230
+ const entity = getEntity(doc, path);
231
+ if (!entity)
232
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
233
+ const qsets = entity.get(ENTITY_KEY.QUANTITIES);
234
+ if (!qsets)
235
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing quantities map`);
236
+ let qset = qsets.get(qsetName);
237
+ if (!qset) {
238
+ qset = new Y.Map();
239
+ qsets.set(qsetName, qset);
240
+ }
241
+ qset.set(qtyName, value);
242
+ }
243
+ /* ------------------------------------------------------------------ */
244
+ /* Classifications & materials */
245
+ /* ------------------------------------------------------------------ */
246
+ export function addClassification(doc, path, ref) {
247
+ const entity = getEntity(doc, path);
248
+ if (!entity)
249
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
250
+ const arr = entity.get(ENTITY_KEY.CLASSIFICATIONS);
251
+ if (!arr)
252
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing classifications`);
253
+ arr.push([ref]);
254
+ return arr.length - 1;
255
+ }
256
+ export function addMaterial(doc, path, assignment) {
257
+ const entity = getEntity(doc, path);
258
+ if (!entity)
259
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
260
+ const arr = entity.get(ENTITY_KEY.MATERIALS);
261
+ if (!arr)
262
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing materials`);
263
+ arr.push([assignment]);
264
+ return arr.length - 1;
265
+ }
266
+ /* ------------------------------------------------------------------ */
267
+ /* Geometry reference */
268
+ /* ------------------------------------------------------------------ */
269
+ /** Point an entity at a specific entry in the top-level geometry map. */
270
+ export function setGeometryRef(doc, path, ref) {
271
+ const entity = getEntity(doc, path);
272
+ if (!entity)
273
+ throw new Error(`@ifc-lite/collab: entity "${path}" not found`);
274
+ const refMap = entity.get(ENTITY_KEY.GEOMETRY_REF);
275
+ if (!refMap)
276
+ throw new Error(`@ifc-lite/collab: entity "${path}" missing geometryRef`);
277
+ refMap.set('geomId', ref.geomId);
278
+ }
279
+ export function getGeometryRef(doc, path) {
280
+ const refMap = getEntity(doc, path)?.get(ENTITY_KEY.GEOMETRY_REF);
281
+ const geomId = refMap?.get('geomId');
282
+ return typeof geomId === 'string' ? { geomId } : undefined;
283
+ }
284
+ /* ------------------------------------------------------------------ */
285
+ /* Iteration helpers */
286
+ /* ------------------------------------------------------------------ */
287
+ /** Iterate every (path, entity) pair currently live. */
288
+ export function* iterEntities(doc) {
289
+ const ents = entitiesMap(doc);
290
+ for (const [path, entity] of ents.entries()) {
291
+ yield [path, entity];
292
+ }
293
+ }
294
+ /**
295
+ * Convert an entity Y.Map into a plain JSON snapshot. Useful for tests and
296
+ * for the IFCX writer.
297
+ */
298
+ export function entityToJSON(entity) {
299
+ const attrs = entity.get(ENTITY_KEY.ATTRIBUTES);
300
+ const children = entity.get(ENTITY_KEY.CHILDREN);
301
+ const inherits = entity.get(ENTITY_KEY.INHERITS);
302
+ const psets = entity.get(ENTITY_KEY.PSETS);
303
+ const classifications = entity.get(ENTITY_KEY.CLASSIFICATIONS);
304
+ const materials = entity.get(ENTITY_KEY.MATERIALS);
305
+ const geomRef = entity.get(ENTITY_KEY.GEOMETRY_REF);
306
+ const meta = entity.get(ENTITY_KEY.META);
307
+ const attributes = {};
308
+ if (attrs)
309
+ for (const [k, v] of attrs.entries())
310
+ attributes[k] = v;
311
+ const childrenJson = {};
312
+ if (children)
313
+ for (const [k, v] of children.entries())
314
+ childrenJson[k] = v;
315
+ const inheritsJson = {};
316
+ if (inherits)
317
+ for (const [k, v] of inherits.entries())
318
+ inheritsJson[k] = v;
319
+ const psetsJson = {};
320
+ if (psets) {
321
+ for (const [psetName, pset] of psets.entries()) {
322
+ const props = {};
323
+ for (const [propName, val] of pset.entries()) {
324
+ props[propName] = val;
325
+ }
326
+ psetsJson[psetName] = props;
327
+ }
328
+ }
329
+ const metaJson = {};
330
+ if (meta)
331
+ for (const [k, v] of meta.entries())
332
+ metaJson[k] = v;
333
+ const geomId = geomRef?.get('geomId');
334
+ return {
335
+ attributes,
336
+ children: childrenJson,
337
+ inherits: inheritsJson,
338
+ psets: psetsJson,
339
+ classifications: classifications ? classifications.toArray() : [],
340
+ materials: materials ? materials.toArray() : [],
341
+ geometryRef: typeof geomId === 'string' ? geomId : undefined,
342
+ meta: metaJson,
343
+ };
344
+ }
345
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/doc/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Geometry-reference operations on the Y.Doc.
3
+ *
4
+ * The Y.Doc only ever holds *references* to geometry (parametric params or
5
+ * mesh blob hashes), never raw mesh bytes. This keeps Y.Doc memory small
6
+ * and bounded — see spec §11 and §15.
7
+ */
8
+ import * as Y from 'yjs';
9
+ export type GeometryType = 'parametric' | 'mesh' | 'csg-tree';
10
+ export type GeometrySource = 'extruded-area-solid' | 'swept-disk-solid' | 'revolved-area-solid' | 'mesh-blob' | 'point-cloud' | 'csg-op' | string;
11
+ export type BBox = [number, number, number, number, number, number];
12
+ export interface CreateGeometryOptions {
13
+ type: GeometryType;
14
+ source: GeometrySource;
15
+ blobHash?: string;
16
+ params?: Record<string, unknown>;
17
+ bbox?: BBox;
18
+ }
19
+ export declare function getGeometry(doc: Y.Doc, geomId: string): Y.Map<unknown> | undefined;
20
+ export declare function createGeometry(doc: Y.Doc, geomId: string, opts: CreateGeometryOptions): Y.Map<unknown>;
21
+ export declare function setGeometryParam(doc: Y.Doc, geomId: string, paramName: string, value: unknown): void;
22
+ export declare function setGeometryBlobHash(doc: Y.Doc, geomId: string, blobHash: string): void;
23
+ /**
24
+ * Bump the version vector for a peer when this peer replaces geometry. The
25
+ * conflict detector (`conflicts/detector.ts`) uses these vectors to
26
+ * identify concurrent replacements.
27
+ */
28
+ export declare function bumpGeometryVersion(doc: Y.Doc, geomId: string, peerId: string | number): void;
29
+ export declare function deleteGeometry(doc: Y.Doc, geomId: string): boolean;
30
+ /** Plain JSON snapshot of a geometry node (used by the IFCX writer). */
31
+ export declare function geometryToJSON(node: Y.Map<unknown>): {
32
+ type: GeometryType;
33
+ source: GeometrySource;
34
+ params: Record<string, unknown>;
35
+ blobHash?: string;
36
+ bbox?: BBox;
37
+ versionVector: Record<string, number>;
38
+ };
39
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/doc/geometry.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,WAAW,GACX,aAAa,GACb,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,CAElF;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,qBAAqB,GAC1B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CA0BhB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,IAAI,CAMN;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAItF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKlE;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;IACpD,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAeA"}