@vuer-ai/vuer-rtc 0.0.1

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 (169) hide show
  1. package/dist/client/EditBuffer.d.ts +43 -0
  2. package/dist/client/EditBuffer.d.ts.map +1 -0
  3. package/dist/client/EditBuffer.js +96 -0
  4. package/dist/client/EditBuffer.js.map +1 -0
  5. package/dist/client/actions.d.ts +66 -0
  6. package/dist/client/actions.d.ts.map +1 -0
  7. package/dist/client/actions.js +345 -0
  8. package/dist/client/actions.js.map +1 -0
  9. package/dist/client/createGraph.d.ts +30 -0
  10. package/dist/client/createGraph.d.ts.map +1 -0
  11. package/dist/client/createGraph.js +91 -0
  12. package/dist/client/createGraph.js.map +1 -0
  13. package/dist/client/hooks.d.ts +81 -0
  14. package/dist/client/hooks.d.ts.map +1 -0
  15. package/dist/client/hooks.js +161 -0
  16. package/dist/client/hooks.js.map +1 -0
  17. package/dist/client/index.d.ts +8 -0
  18. package/dist/client/index.d.ts.map +1 -0
  19. package/dist/client/index.js +10 -0
  20. package/dist/client/index.js.map +1 -0
  21. package/dist/client/types.d.ts +74 -0
  22. package/dist/client/types.d.ts.map +1 -0
  23. package/dist/client/types.js +11 -0
  24. package/dist/client/types.js.map +1 -0
  25. package/dist/hooks.d.ts +8 -0
  26. package/dist/hooks.d.ts.map +1 -0
  27. package/dist/hooks.js +7 -0
  28. package/dist/hooks.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +12 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/operations/OperationTypes.d.ts +239 -0
  34. package/dist/operations/OperationTypes.d.ts.map +1 -0
  35. package/dist/operations/OperationTypes.js +10 -0
  36. package/dist/operations/OperationTypes.js.map +1 -0
  37. package/dist/operations/OperationValidator.d.ts +32 -0
  38. package/dist/operations/OperationValidator.d.ts.map +1 -0
  39. package/dist/operations/OperationValidator.js +208 -0
  40. package/dist/operations/OperationValidator.js.map +1 -0
  41. package/dist/operations/apply/array.d.ts +22 -0
  42. package/dist/operations/apply/array.d.ts.map +1 -0
  43. package/dist/operations/apply/array.js +64 -0
  44. package/dist/operations/apply/array.js.map +1 -0
  45. package/dist/operations/apply/boolean.d.ts +18 -0
  46. package/dist/operations/apply/boolean.d.ts.map +1 -0
  47. package/dist/operations/apply/boolean.js +34 -0
  48. package/dist/operations/apply/boolean.js.map +1 -0
  49. package/dist/operations/apply/color.d.ts +14 -0
  50. package/dist/operations/apply/color.d.ts.map +1 -0
  51. package/dist/operations/apply/color.js +46 -0
  52. package/dist/operations/apply/color.js.map +1 -0
  53. package/dist/operations/apply/index.d.ts +18 -0
  54. package/dist/operations/apply/index.d.ts.map +1 -0
  55. package/dist/operations/apply/index.js +26 -0
  56. package/dist/operations/apply/index.js.map +1 -0
  57. package/dist/operations/apply/node.d.ts +24 -0
  58. package/dist/operations/apply/node.d.ts.map +1 -0
  59. package/dist/operations/apply/node.js +77 -0
  60. package/dist/operations/apply/node.js.map +1 -0
  61. package/dist/operations/apply/number.d.ts +26 -0
  62. package/dist/operations/apply/number.d.ts.map +1 -0
  63. package/dist/operations/apply/number.js +54 -0
  64. package/dist/operations/apply/number.js.map +1 -0
  65. package/dist/operations/apply/object.d.ts +14 -0
  66. package/dist/operations/apply/object.d.ts.map +1 -0
  67. package/dist/operations/apply/object.js +47 -0
  68. package/dist/operations/apply/object.js.map +1 -0
  69. package/dist/operations/apply/quaternion.d.ts +15 -0
  70. package/dist/operations/apply/quaternion.d.ts.map +1 -0
  71. package/dist/operations/apply/quaternion.js +33 -0
  72. package/dist/operations/apply/quaternion.js.map +1 -0
  73. package/dist/operations/apply/string.d.ts +14 -0
  74. package/dist/operations/apply/string.d.ts.map +1 -0
  75. package/dist/operations/apply/string.js +26 -0
  76. package/dist/operations/apply/string.js.map +1 -0
  77. package/dist/operations/apply/types.d.ts +34 -0
  78. package/dist/operations/apply/types.d.ts.map +1 -0
  79. package/dist/operations/apply/types.js +32 -0
  80. package/dist/operations/apply/types.js.map +1 -0
  81. package/dist/operations/apply/vector3.d.ts +18 -0
  82. package/dist/operations/apply/vector3.d.ts.map +1 -0
  83. package/dist/operations/apply/vector3.js +44 -0
  84. package/dist/operations/apply/vector3.js.map +1 -0
  85. package/dist/operations/dispatcher.d.ts +35 -0
  86. package/dist/operations/dispatcher.d.ts.map +1 -0
  87. package/dist/operations/dispatcher.js +107 -0
  88. package/dist/operations/dispatcher.js.map +1 -0
  89. package/dist/operations/index.d.ts +10 -0
  90. package/dist/operations/index.d.ts.map +1 -0
  91. package/dist/operations/index.js +17 -0
  92. package/dist/operations/index.js.map +1 -0
  93. package/dist/state/ConflictResolver.d.ts +36 -0
  94. package/dist/state/ConflictResolver.d.ts.map +1 -0
  95. package/dist/state/ConflictResolver.js +167 -0
  96. package/dist/state/ConflictResolver.js.map +1 -0
  97. package/dist/state/DType.d.ts +160 -0
  98. package/dist/state/DType.d.ts.map +1 -0
  99. package/dist/state/DType.js +282 -0
  100. package/dist/state/DType.js.map +1 -0
  101. package/dist/state/Schema.d.ts +32 -0
  102. package/dist/state/Schema.d.ts.map +1 -0
  103. package/dist/state/Schema.js +175 -0
  104. package/dist/state/Schema.js.map +1 -0
  105. package/dist/state/VectorClock.d.ts +42 -0
  106. package/dist/state/VectorClock.d.ts.map +1 -0
  107. package/dist/state/VectorClock.js +84 -0
  108. package/dist/state/VectorClock.js.map +1 -0
  109. package/dist/state/index.d.ts +11 -0
  110. package/dist/state/index.d.ts.map +1 -0
  111. package/dist/state/index.js +13 -0
  112. package/dist/state/index.js.map +1 -0
  113. package/docs/OPERATION_HINTS.md +222 -0
  114. package/docs/SCENE_GRAPH.md +373 -0
  115. package/docs/TYPE_BEHAVIORS.md +348 -0
  116. package/examples/01-basic-usage.ts +139 -0
  117. package/examples/02-concurrent-edits.ts +208 -0
  118. package/examples/03-scene-building.ts +258 -0
  119. package/examples/04-conflict-resolution.ts +339 -0
  120. package/examples/README.md +86 -0
  121. package/jest.config.js +19 -0
  122. package/package.json +57 -0
  123. package/src/client/EditBuffer.ts +105 -0
  124. package/src/client/actions.ts +397 -0
  125. package/src/client/createGraph.ts +132 -0
  126. package/src/client/hooks.tsx +249 -0
  127. package/src/client/index.ts +35 -0
  128. package/src/client/types.ts +94 -0
  129. package/src/hooks.ts +20 -0
  130. package/src/index.ts +14 -0
  131. package/src/operations/OperationTypes.ts +340 -0
  132. package/src/operations/OperationValidator.ts +260 -0
  133. package/src/operations/apply/array.ts +84 -0
  134. package/src/operations/apply/boolean.ts +48 -0
  135. package/src/operations/apply/color.ts +65 -0
  136. package/src/operations/apply/index.ts +37 -0
  137. package/src/operations/apply/node.ts +98 -0
  138. package/src/operations/apply/number.ts +76 -0
  139. package/src/operations/apply/object.ts +63 -0
  140. package/src/operations/apply/quaternion.ts +47 -0
  141. package/src/operations/apply/string.ts +36 -0
  142. package/src/operations/apply/types.ts +66 -0
  143. package/src/operations/apply/vector3.ts +60 -0
  144. package/src/operations/dispatcher.ts +127 -0
  145. package/src/operations/index.ts +80 -0
  146. package/src/state/ConflictResolver.ts +205 -0
  147. package/src/state/DType.ts +333 -0
  148. package/src/state/Schema.ts +236 -0
  149. package/src/state/VectorClock.ts +98 -0
  150. package/src/state/index.ts +14 -0
  151. package/tests/client/actions.test.ts +371 -0
  152. package/tests/client/edit-buffer.test.ts +117 -0
  153. package/tests/fixtures/array-ops.jsonl +6 -0
  154. package/tests/fixtures/boolean-ops.jsonl +6 -0
  155. package/tests/fixtures/color-ops.jsonl +4 -0
  156. package/tests/fixtures/edit-buffer.jsonl +3 -0
  157. package/tests/fixtures/node-ops.jsonl +6 -0
  158. package/tests/fixtures/number-ops.jsonl +7 -0
  159. package/tests/fixtures/object-ops.jsonl +4 -0
  160. package/tests/fixtures/operations.jsonl +7 -0
  161. package/tests/fixtures/string-ops.jsonl +4 -0
  162. package/tests/fixtures/undo-redo.jsonl +3 -0
  163. package/tests/fixtures/vector-ops.jsonl +9 -0
  164. package/tests/operations/collections.test.ts +193 -0
  165. package/tests/operations/nodes.test.ts +228 -0
  166. package/tests/operations/primitives.test.ts +222 -0
  167. package/tests/operations/vectors.test.ts +150 -0
  168. package/tsconfig.json +21 -0
  169. package/tsconfig.test.json +9 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Vector3 operations: set, add, multiply
3
+ */
4
+ import type { SceneGraph, Vector3SetOp, Vector3AddOp, Vector3MultiplyOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * vector3.set - Last-Write-Wins
8
+ */
9
+ export declare function Vector3Set(draft: SceneGraph, op: Vector3SetOp, meta: OpMeta): void;
10
+ /**
11
+ * vector3.add - Component-wise addition (additive deltas)
12
+ */
13
+ export declare function Vector3Add(draft: SceneGraph, op: Vector3AddOp, meta: OpMeta): void;
14
+ /**
15
+ * vector3.multiply - Component-wise multiplication (scale)
16
+ */
17
+ export declare function Vector3Multiply(draft: SceneGraph, op: Vector3MultiplyOp, meta: OpMeta): void;
18
+ //# sourceMappingURL=vector3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector3.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/vector3.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzC;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,MAAM,GACX,IAAI,CAUN"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Vector3 operations: set, add, multiply
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * vector3.set - Last-Write-Wins
7
+ */
8
+ export function Vector3Set(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, [...op.value], meta);
13
+ }
14
+ /**
15
+ * vector3.add - Component-wise addition (additive deltas)
16
+ */
17
+ export function Vector3Add(draft, op, meta) {
18
+ const node = draft.nodes[op.key];
19
+ if (!node || node.deletedAt)
20
+ return;
21
+ const current = getNodeProperty(node, op.path, [0, 0, 0]);
22
+ const result = [
23
+ current[0] + op.value[0],
24
+ current[1] + op.value[1],
25
+ current[2] + op.value[2],
26
+ ];
27
+ setNodeProperty(node, op.path, result, meta);
28
+ }
29
+ /**
30
+ * vector3.multiply - Component-wise multiplication (scale)
31
+ */
32
+ export function Vector3Multiply(draft, op, meta) {
33
+ const node = draft.nodes[op.key];
34
+ if (!node || node.deletedAt)
35
+ return;
36
+ const current = getNodeProperty(node, op.path, [1, 1, 1]);
37
+ const result = [
38
+ current[0] * op.value[0],
39
+ current[1] * op.value[1],
40
+ current[2] * op.value[2],
41
+ ];
42
+ setNodeProperty(node, op.path, result, meta);
43
+ }
44
+ //# sourceMappingURL=vector3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector3.js","sourceRoot":"","sources":["../../../src/operations/apply/vector3.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlF;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAY,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAU,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAY;QACtB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;KACzB,CAAC;IACF,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,EAAqB,EACrB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAU,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAY;QACtB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;KACzB,CAAC;IACF,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Operation Dispatcher
3
+ *
4
+ * Applies CRDTMessage operations to a SceneGraph using immer.
5
+ * Each operation is dispatched to its corresponding "apply" function.
6
+ */
7
+ import type { SceneGraph, CRDTMessage, Operation } from './OperationTypes.js';
8
+ import type { OpMeta } from './apply/types.js';
9
+ /**
10
+ * Apply a single operation to a SceneGraph draft
11
+ */
12
+ export declare function applyOperation(draft: SceneGraph, op: Operation, meta: OpMeta): void;
13
+ /**
14
+ * Apply a CRDTMessage to a SceneGraph (immutable)
15
+ *
16
+ * Uses immer to produce a new state without mutating the original.
17
+ *
18
+ * @param graph - Current scene graph state
19
+ * @param msg - CRDT message containing operations
20
+ * @returns New scene graph state with operations applied
21
+ */
22
+ export declare function applyMessage(graph: SceneGraph, msg: CRDTMessage): SceneGraph;
23
+ /**
24
+ * Apply multiple CRDTMessages to a SceneGraph (immutable)
25
+ *
26
+ * @param graph - Current scene graph state
27
+ * @param messages - Array of CRDT messages to apply
28
+ * @returns New scene graph state with all operations applied
29
+ */
30
+ export declare function applyMessages(graph: SceneGraph, messages: CRDTMessage[]): SceneGraph;
31
+ /**
32
+ * Create an empty scene graph
33
+ */
34
+ export declare function createEmptyGraph(): SceneGraph;
35
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/operations/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsD/C;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,GACX,IAAI,CAON;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,UAAU,CAa5E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,UAAU,CAMpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAK7C"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Operation Dispatcher
3
+ *
4
+ * Applies CRDTMessage operations to a SceneGraph using immer.
5
+ * Each operation is dispatched to its corresponding "apply" function.
6
+ */
7
+ import { produce, enableMapSet } from 'immer';
8
+ import * as registry from './apply/index.js';
9
+ // Enable immer support for Map and Set
10
+ enableMapSet();
11
+ /**
12
+ * Handler map: otype -> apply function
13
+ */
14
+ const handlers = {
15
+ // Number operations
16
+ 'number.set': registry.NumberSet,
17
+ 'number.add': registry.NumberAdd,
18
+ 'number.multiply': registry.NumberMultiply,
19
+ 'number.min': registry.NumberMin,
20
+ 'number.max': registry.NumberMax,
21
+ // String operations
22
+ 'string.set': registry.StringSet,
23
+ 'string.concat': registry.StringConcat,
24
+ // Boolean operations
25
+ 'boolean.set': registry.BooleanSet,
26
+ 'boolean.or': registry.BooleanOr,
27
+ 'boolean.and': registry.BooleanAnd,
28
+ // Vector3 operations
29
+ 'vector3.set': registry.Vector3Set,
30
+ 'vector3.add': registry.Vector3Add,
31
+ 'vector3.multiply': registry.Vector3Multiply,
32
+ // Quaternion operations
33
+ 'quaternion.set': registry.QuaternionSet,
34
+ 'quaternion.multiply': registry.QuaternionMultiply,
35
+ // Color operations
36
+ 'color.set': registry.ColorSet,
37
+ 'color.blend': registry.ColorBlend,
38
+ // Array operations
39
+ 'array.set': registry.ArraySet,
40
+ 'array.push': registry.ArrayPush,
41
+ 'array.remove': registry.ArrayRemove,
42
+ 'array.union': registry.ArrayUnion,
43
+ // Object operations
44
+ 'object.set': registry.ObjectSet,
45
+ 'object.merge': registry.ObjectMerge,
46
+ // Node operations
47
+ 'node.insert': registry.NodeInsert,
48
+ 'node.remove': registry.NodeRemove,
49
+ };
50
+ /**
51
+ * Apply a single operation to a SceneGraph draft
52
+ */
53
+ export function applyOperation(draft, op, meta) {
54
+ const handler = handlers[op.otype];
55
+ if (handler) {
56
+ handler(draft, op, meta);
57
+ }
58
+ else {
59
+ console.warn(`Unknown otype: ${op.otype}`);
60
+ }
61
+ }
62
+ /**
63
+ * Apply a CRDTMessage to a SceneGraph (immutable)
64
+ *
65
+ * Uses immer to produce a new state without mutating the original.
66
+ *
67
+ * @param graph - Current scene graph state
68
+ * @param msg - CRDT message containing operations
69
+ * @returns New scene graph state with operations applied
70
+ */
71
+ export function applyMessage(graph, msg) {
72
+ return produce(graph, (draft) => {
73
+ const meta = {
74
+ sessionId: msg.sessionId,
75
+ clock: msg.clock,
76
+ lamportTime: msg.lamportTime,
77
+ timestamp: msg.timestamp,
78
+ };
79
+ for (const op of msg.ops) {
80
+ applyOperation(draft, op, meta);
81
+ }
82
+ });
83
+ }
84
+ /**
85
+ * Apply multiple CRDTMessages to a SceneGraph (immutable)
86
+ *
87
+ * @param graph - Current scene graph state
88
+ * @param messages - Array of CRDT messages to apply
89
+ * @returns New scene graph state with all operations applied
90
+ */
91
+ export function applyMessages(graph, messages) {
92
+ let current = graph;
93
+ for (const msg of messages) {
94
+ current = applyMessage(current, msg);
95
+ }
96
+ return current;
97
+ }
98
+ /**
99
+ * Create an empty scene graph
100
+ */
101
+ export function createEmptyGraph() {
102
+ return {
103
+ nodes: {},
104
+ rootKey: '',
105
+ };
106
+ }
107
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/operations/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Operations module exports
3
+ */
4
+ export type { CRDTMessage, BaseOp, NumberSetOp, NumberAddOp, NumberMultiplyOp, NumberMinOp, NumberMaxOp, StringSetOp, StringConcatOp, BooleanSetOp, BooleanOrOp, BooleanAndOp, Vector3SetOp, Vector3AddOp, Vector3MultiplyOp, QuaternionSetOp, QuaternionMultiplyOp, ColorSetOp, ColorBlendOp, ArraySetOp, ArrayPushOp, ArrayUnionOp, ArrayRemoveOp, ObjectSetOp, ObjectMergeOp, NodeInsertOp, NodeRemoveOp, MetaUndoOp, MetaRedoOp, Operation, SceneNode, SceneGraph, } from './OperationTypes.js';
5
+ export { OperationValidator, type ValidationResult } from './OperationValidator.js';
6
+ import * as registry from './apply/index.js';
7
+ export { registry };
8
+ export type { OpMeta, ApplyFn } from './apply/types.js';
9
+ export { applyMessage, applyMessages, applyOperation, createEmptyGraph, } from './dispatcher.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,YAAY,EACV,WAAW,EACX,MAAM,EAEN,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EAEX,WAAW,EACX,cAAc,EAEd,YAAY,EACZ,WAAW,EACX,YAAY,EAEZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAEjB,eAAe,EACf,oBAAoB,EAEpB,UAAU,EACV,YAAY,EAEZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EAEb,WAAW,EACX,aAAa,EAEb,YAAY,EACZ,YAAY,EAEZ,UAAU,EACV,UAAU,EAEV,SAAS,EAET,SAAS,EACT,UAAU,GACX,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMpF,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Operations module exports
3
+ */
4
+ // ============================================
5
+ // Validation
6
+ // ============================================
7
+ export { OperationValidator } from './OperationValidator.js';
8
+ // ============================================
9
+ // Apply Registry (individual apply functions)
10
+ // ============================================
11
+ import * as registry from './apply/index.js';
12
+ export { registry };
13
+ // ============================================
14
+ // Dispatcher (high-level API)
15
+ // ============================================
16
+ export { applyMessage, applyMessages, applyOperation, createEmptyGraph, } from './dispatcher.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqDH,+CAA+C;AAC/C,aAAa;AACb,+CAA+C;AAE/C,OAAO,EAAE,kBAAkB,EAAyB,MAAM,yBAAyB,CAAC;AAEpF,+CAA+C;AAC/C,8CAA8C;AAC9C,+CAA+C;AAE/C,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC;AAIpB,+CAA+C;AAC/C,8BAA8B;AAC9B,+CAA+C;AAE/C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ConflictResolver - Schema-based property conflict resolution
3
+ *
4
+ * Merges concurrent property updates based on:
5
+ * - Property schema (dtype + operation)
6
+ * - DType merge functions
7
+ */
8
+ import { type ValueWithMeta } from './DType.js';
9
+ export declare class ConflictResolver {
10
+ /**
11
+ * Merge a single property from multiple concurrent updates
12
+ *
13
+ * @param propertyName - Name of the property being merged
14
+ * @param values - Array of values with metadata
15
+ * @param operationHint - Optional operation override from UPDATE operation
16
+ * @returns Merged value
17
+ */
18
+ mergeProperty<T = any>(propertyName: string, values: ValueWithMeta<T>[], operationHint?: string): T;
19
+ /**
20
+ * Merge multiple properties from concurrent updates
21
+ *
22
+ * @param updates - Array of property updates with metadata and operation hints
23
+ * @returns Merged properties
24
+ */
25
+ mergeProperties(updates: Array<{
26
+ properties: Record<string, any>;
27
+ operations?: Record<string, string>;
28
+ lamportTime: number;
29
+ sessionId: string;
30
+ }>): Record<string, any>;
31
+ /**
32
+ * Get merge function for dtype and operation
33
+ */
34
+ private getMergeFunction;
35
+ }
36
+ //# sourceMappingURL=ConflictResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConflictResolver.d.ts","sourceRoot":"","sources":["../../src/state/ConflictResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAS,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAGvD,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;IACH,aAAa,CAAC,CAAC,GAAG,GAAG,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC1B,aAAa,CAAC,EAAE,MAAM,GACrB,CAAC;IAkCJ;;;;;OAKG;IACH,eAAe,CACb,OAAO,EAAE,KAAK,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,GACD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAqCtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA6FzB"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * ConflictResolver - Schema-based property conflict resolution
3
+ *
4
+ * Merges concurrent property updates based on:
5
+ * - Property schema (dtype + operation)
6
+ * - DType merge functions
7
+ */
8
+ import { DType } from './DType.js';
9
+ import { getPropertySchema, isImmutable } from './Schema.js';
10
+ export class ConflictResolver {
11
+ /**
12
+ * Merge a single property from multiple concurrent updates
13
+ *
14
+ * @param propertyName - Name of the property being merged
15
+ * @param values - Array of values with metadata
16
+ * @param operationHint - Optional operation override from UPDATE operation
17
+ * @returns Merged value
18
+ */
19
+ mergeProperty(propertyName, values, operationHint) {
20
+ if (values.length === 0) {
21
+ throw new Error(`Cannot merge empty values for property: ${propertyName}`);
22
+ }
23
+ if (values.length === 1) {
24
+ return values[0].value;
25
+ }
26
+ // Get schema for this property
27
+ const schema = getPropertySchema(propertyName);
28
+ // Immutable properties: return earliest value
29
+ if (isImmutable(propertyName)) {
30
+ const sorted = [...values].sort((a, b) => a.lamportTime - b.lamportTime);
31
+ return sorted[0].value;
32
+ }
33
+ // Use operation hint if provided, otherwise use schema
34
+ const operation = operationHint || schema.operation;
35
+ // Get merge function based on dtype and operation
36
+ const mergeFn = this.getMergeFunction(schema.dtype, operation);
37
+ if (!mergeFn) {
38
+ console.warn(`No merge function for dtype=${schema.dtype} operation=${operation}, defaulting to LWW`);
39
+ return DType.string.set(values);
40
+ }
41
+ return mergeFn(values);
42
+ }
43
+ /**
44
+ * Merge multiple properties from concurrent updates
45
+ *
46
+ * @param updates - Array of property updates with metadata and operation hints
47
+ * @returns Merged properties
48
+ */
49
+ mergeProperties(updates) {
50
+ // Group values by property name
51
+ const valuesByProperty = new Map();
52
+ const operationHints = new Map();
53
+ for (const update of updates) {
54
+ for (const [key, value] of Object.entries(update.properties)) {
55
+ if (key === 'operations')
56
+ continue; // Skip operations field
57
+ if (!valuesByProperty.has(key)) {
58
+ valuesByProperty.set(key, []);
59
+ }
60
+ valuesByProperty.get(key).push({
61
+ value,
62
+ lamportTime: update.lamportTime,
63
+ sessionId: update.sessionId,
64
+ });
65
+ // Store operation hint if provided
66
+ if (update.operations?.[key]) {
67
+ operationHints.set(key, update.operations[key]);
68
+ }
69
+ }
70
+ }
71
+ // Merge each property
72
+ const result = {};
73
+ for (const [propertyName, values] of valuesByProperty.entries()) {
74
+ const operationHint = operationHints.get(propertyName);
75
+ result[propertyName] = this.mergeProperty(propertyName, values, operationHint);
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * Get merge function for dtype and operation
81
+ */
82
+ getMergeFunction(dtype, operation) {
83
+ switch (dtype) {
84
+ case 'number':
85
+ switch (operation) {
86
+ case 'set':
87
+ return DType.number.set;
88
+ case 'add':
89
+ return DType.number.add;
90
+ case 'multiply':
91
+ return DType.number.multiply;
92
+ case 'min':
93
+ return DType.number.min;
94
+ case 'max':
95
+ return DType.number.max;
96
+ }
97
+ break;
98
+ case 'string':
99
+ switch (operation) {
100
+ case 'set':
101
+ return DType.string.set;
102
+ case 'concat':
103
+ return DType.string.concat;
104
+ }
105
+ break;
106
+ case 'boolean':
107
+ switch (operation) {
108
+ case 'set':
109
+ return DType.boolean.set;
110
+ case 'or':
111
+ return DType.boolean.or;
112
+ case 'and':
113
+ return DType.boolean.and;
114
+ }
115
+ break;
116
+ case 'vector3':
117
+ switch (operation) {
118
+ case 'set':
119
+ return DType.vector3.set;
120
+ case 'add':
121
+ return DType.vector3.add;
122
+ case 'multiply':
123
+ return DType.vector3.multiply;
124
+ }
125
+ break;
126
+ case 'quaternion':
127
+ switch (operation) {
128
+ case 'set':
129
+ return DType.quaternion.set;
130
+ case 'multiply':
131
+ return DType.quaternion.multiply;
132
+ }
133
+ break;
134
+ case 'color':
135
+ switch (operation) {
136
+ case 'set':
137
+ return DType.color.set;
138
+ case 'blend':
139
+ return DType.color.blend;
140
+ }
141
+ break;
142
+ case 'array':
143
+ switch (operation) {
144
+ case 'set':
145
+ return DType.array.set;
146
+ case 'union':
147
+ return DType.array.union;
148
+ case 'append':
149
+ return DType.array.append;
150
+ }
151
+ break;
152
+ case 'object':
153
+ switch (operation) {
154
+ case 'set':
155
+ return DType.object.set;
156
+ case 'lww-per-key':
157
+ return DType.object.lwwPerKey;
158
+ }
159
+ break;
160
+ case 'any':
161
+ // Default to LWW for 'any' type
162
+ return DType.string.set;
163
+ }
164
+ return null;
165
+ }
166
+ }
167
+ //# sourceMappingURL=ConflictResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConflictResolver.js","sourceRoot":"","sources":["../../src/state/ConflictResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * DType - Data type system with merge operations
3
+ *
4
+ * Based on test-data/datatypes.ts
5
+ *
6
+ * Each dtype has supported operations that define merge behavior
7
+ * for concurrent updates.
8
+ */
9
+ /**
10
+ * PropertyValue with metadata
11
+ */
12
+ export interface ValueWithMeta<T = any> {
13
+ value: T;
14
+ lamportTime: number;
15
+ sessionId?: string;
16
+ }
17
+ /**
18
+ * Merge function signature
19
+ */
20
+ export type MergeFn<T = any> = (values: ValueWithMeta<T>[]) => T;
21
+ /**
22
+ * DType definitions
23
+ */
24
+ export declare const DType: {
25
+ /**
26
+ * Number operations
27
+ */
28
+ number: {
29
+ /**
30
+ * SET - Last-Write-Wins
31
+ */
32
+ set: MergeFn<number>;
33
+ /**
34
+ * ADD - Sum all values
35
+ */
36
+ add: MergeFn<number>;
37
+ /**
38
+ * MULTIPLY - Multiply all values
39
+ */
40
+ multiply: MergeFn<number>;
41
+ /**
42
+ * MIN - Take minimum
43
+ */
44
+ min: MergeFn<number>;
45
+ /**
46
+ * MAX - Take maximum
47
+ */
48
+ max: MergeFn<number>;
49
+ };
50
+ /**
51
+ * String operations
52
+ */
53
+ string: {
54
+ /**
55
+ * SET - Last-Write-Wins
56
+ */
57
+ set: MergeFn<string>;
58
+ /**
59
+ * CONCAT - Concatenate (ordered by lamport)
60
+ */
61
+ concat: MergeFn<string>;
62
+ };
63
+ /**
64
+ * Boolean operations
65
+ */
66
+ boolean: {
67
+ /**
68
+ * SET - Last-Write-Wins
69
+ */
70
+ set: MergeFn<boolean>;
71
+ /**
72
+ * OR - Logical OR (enable wins)
73
+ */
74
+ or: MergeFn<boolean>;
75
+ /**
76
+ * AND - Logical AND (disable wins)
77
+ */
78
+ and: MergeFn<boolean>;
79
+ };
80
+ /**
81
+ * Vector3 operations - [x, y, z]
82
+ */
83
+ vector3: {
84
+ /**
85
+ * SET - Replace entire vector (preserves user intent)
86
+ */
87
+ set: MergeFn<[number, number, number]>;
88
+ /**
89
+ * ADD - Component-wise addition
90
+ */
91
+ add: MergeFn<[number, number, number]>;
92
+ /**
93
+ * MULTIPLY - Component-wise multiplication
94
+ */
95
+ multiply: MergeFn<[number, number, number]>;
96
+ };
97
+ /**
98
+ * Quaternion operations - [x, y, z, w]
99
+ */
100
+ quaternion: {
101
+ /**
102
+ * SET - Replace entire quaternion
103
+ */
104
+ set: MergeFn<[number, number, number, number]>;
105
+ /**
106
+ * MULTIPLY - Quaternion multiplication (composition)
107
+ */
108
+ multiply: MergeFn<[number, number, number, number]>;
109
+ };
110
+ /**
111
+ * Color operations
112
+ */
113
+ color: {
114
+ /**
115
+ * SET - Replace color
116
+ */
117
+ set: MergeFn<string>;
118
+ /**
119
+ * BLEND - Average colors
120
+ */
121
+ blend: MergeFn<string>;
122
+ };
123
+ /**
124
+ * Array operations
125
+ */
126
+ array: {
127
+ /**
128
+ * SET - Replace entire array
129
+ */
130
+ set: MergeFn<any[]>;
131
+ /**
132
+ * UNION - Merge unique elements
133
+ */
134
+ union: MergeFn<any[]>;
135
+ /**
136
+ * APPEND - Append all (ordered by lamport)
137
+ */
138
+ append: MergeFn<any[]>;
139
+ };
140
+ /**
141
+ * Object operations
142
+ */
143
+ object: {
144
+ /**
145
+ * SET - Replace entire object
146
+ */
147
+ set: MergeFn<Record<string, any>>;
148
+ /**
149
+ * LWW_PER_KEY - Last-Write-Wins per key
150
+ */
151
+ lwwPerKey: MergeFn<Record<string, any>>;
152
+ };
153
+ /**
154
+ * Immutable - Cannot be changed
155
+ */
156
+ immutable: {
157
+ set: MergeFn;
158
+ };
159
+ };
160
+ //# sourceMappingURL=DType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DType.d.ts","sourceRoot":"","sources":["../../src/state/DType.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,KAAK;IAKhB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;aAGG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;kBAGG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;aAGG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;aAGG,OAAO,CAAC,MAAM,CAAC;;IAGvB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;gBAIG,OAAO,CAAC,MAAM,CAAC;;IAGvB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,OAAO,CAAC;QAEtB;;WAEG;YAGG,OAAO,CAAC,OAAO,CAAC;QAEtB;;WAEG;aAGG,OAAO,CAAC,OAAO,CAAC;;IAOxB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvC;;WAEG;aASG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvC;;WAEG;kBASG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;;IAGzC;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/C;;WAEG;kBAUG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;;IAGjD;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;eAOG,OAAO,CAAC,MAAM,CAAC;;IAOvB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEpB;;WAEG;eAIG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEpB;;WAEG;gBAIG,OAAO,CAAC,GAAG,EAAE,CAAC;;IAGtB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElC;;WAEG;mBAeG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;IAOpC;;OAEG;;aAMK,OAAO;;CAEhB,CAAC"}