@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,43 @@
1
+ /**
2
+ * Edit Buffer
3
+ *
4
+ * Accumulates uncommitted operations during gestures (e.g., dragging).
5
+ * Merges additive operations to reduce message size.
6
+ */
7
+ import type { Operation } from '../operations/OperationTypes.js';
8
+ /**
9
+ * Check if an operation type is additive (can be merged)
10
+ */
11
+ export declare function isAdditiveOp(otype: string): boolean;
12
+ /**
13
+ * Merge two values for additive operations
14
+ */
15
+ export declare function mergeValues(otype: string, a: unknown, b: unknown): unknown;
16
+ /**
17
+ * Edit buffer class
18
+ */
19
+ export declare class EditBufferImpl {
20
+ private opsMap;
21
+ private opOrder;
22
+ /**
23
+ * Add or merge an operation
24
+ */
25
+ add(op: Operation): void;
26
+ /**
27
+ * Get ops in order (for committing)
28
+ */
29
+ getOps(): Operation[];
30
+ /**
31
+ * Clear buffer
32
+ */
33
+ clear(): void;
34
+ /**
35
+ * Check if empty
36
+ */
37
+ isEmpty(): boolean;
38
+ /**
39
+ * Get count
40
+ */
41
+ size(): number;
42
+ }
43
+ //# sourceMappingURL=EditBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditBuffer.d.ts","sourceRoot":"","sources":["../../src/client/EditBuffer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAyB1E;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,OAAO,CAAgB;IAE/B;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI;IAiBxB;;OAEG;IACH,MAAM,IAAI,SAAS,EAAE;IAIrB;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Edit Buffer
3
+ *
4
+ * Accumulates uncommitted operations during gestures (e.g., dragging).
5
+ * Merges additive operations to reduce message size.
6
+ */
7
+ /**
8
+ * Check if an operation type is additive (can be merged)
9
+ */
10
+ export function isAdditiveOp(otype) {
11
+ return otype === 'vector3.add' ||
12
+ otype === 'number.add' ||
13
+ otype === 'number.multiply' ||
14
+ otype === 'quaternion.multiply';
15
+ }
16
+ /**
17
+ * Merge two values for additive operations
18
+ */
19
+ export function mergeValues(otype, a, b) {
20
+ switch (otype) {
21
+ case 'vector3.add': {
22
+ const va = a;
23
+ const vb = b;
24
+ return [va[0] + vb[0], va[1] + vb[1], va[2] + vb[2]];
25
+ }
26
+ case 'number.add':
27
+ return a + b;
28
+ case 'number.multiply':
29
+ return a * b;
30
+ case 'quaternion.multiply': {
31
+ // Quaternion multiplication: q1 * q2
32
+ const q1 = a;
33
+ const q2 = b;
34
+ return [
35
+ q1[3] * q2[0] + q1[0] * q2[3] + q1[1] * q2[2] - q1[2] * q2[1],
36
+ q1[3] * q2[1] - q1[0] * q2[2] + q1[1] * q2[3] + q1[2] * q2[0],
37
+ q1[3] * q2[2] + q1[0] * q2[1] - q1[1] * q2[0] + q1[2] * q2[3],
38
+ q1[3] * q2[3] - q1[0] * q2[0] - q1[1] * q2[1] - q1[2] * q2[2],
39
+ ];
40
+ }
41
+ default:
42
+ return b; // For LWW, later value wins
43
+ }
44
+ }
45
+ /**
46
+ * Edit buffer class
47
+ */
48
+ export class EditBufferImpl {
49
+ opsMap = new Map();
50
+ opOrder = [];
51
+ /**
52
+ * Add or merge an operation
53
+ */
54
+ add(op) {
55
+ const key = `${op.key}:${op.path}`;
56
+ const existing = this.opsMap.get(key);
57
+ if (existing && existing.otype === op.otype && isAdditiveOp(op.otype)) {
58
+ // Merge additive ops
59
+ const mergedValue = mergeValues(op.otype, existing.value, op.value);
60
+ this.opsMap.set(key, { ...existing, value: mergedValue });
61
+ }
62
+ else {
63
+ // New op or LWW replacement
64
+ if (!this.opsMap.has(key)) {
65
+ this.opOrder.push(key);
66
+ }
67
+ this.opsMap.set(key, op);
68
+ }
69
+ }
70
+ /**
71
+ * Get ops in order (for committing)
72
+ */
73
+ getOps() {
74
+ return this.opOrder.map(k => this.opsMap.get(k));
75
+ }
76
+ /**
77
+ * Clear buffer
78
+ */
79
+ clear() {
80
+ this.opsMap.clear();
81
+ this.opOrder = [];
82
+ }
83
+ /**
84
+ * Check if empty
85
+ */
86
+ isEmpty() {
87
+ return this.opsMap.size === 0;
88
+ }
89
+ /**
90
+ * Get count
91
+ */
92
+ size() {
93
+ return this.opsMap.size;
94
+ }
95
+ }
96
+ //# sourceMappingURL=EditBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditBuffer.js","sourceRoot":"","sources":["../../src/client/EditBuffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Client State Actions
3
+ *
4
+ * Pure functions that transform ClientState.
5
+ * Used by createGraph and React hooks.
6
+ */
7
+ import type { CRDTMessage, Operation, SceneGraph } from '../operations/OperationTypes.js';
8
+ import type { ClientState, JournalEntry, Snapshot } from './types.js';
9
+ /**
10
+ * Generate a UUID
11
+ */
12
+ export declare function generateUUID(): string;
13
+ /**
14
+ * Create initial client state
15
+ */
16
+ export declare function createInitialState(sessionId: string, initialSnapshot?: Snapshot): ClientState;
17
+ /**
18
+ * Rebuild graph from snapshot + journal + edits
19
+ */
20
+ export declare function rebuildGraph(snapshot: Snapshot, journal: JournalEntry[], pendingOps: Operation[]): SceneGraph;
21
+ /**
22
+ * Action: Edit (uncommitted)
23
+ */
24
+ export declare function onEdit(state: ClientState, op: Operation): ClientState;
25
+ /**
26
+ * Action: Commit edits
27
+ */
28
+ export declare function commitEdits(state: ClientState, _description?: string): {
29
+ state: ClientState;
30
+ msg: CRDTMessage | null;
31
+ };
32
+ /**
33
+ * Action: Cancel edits (revert to start graph)
34
+ */
35
+ export declare function cancelEdits(state: ClientState): ClientState;
36
+ /**
37
+ * Action: Server acknowledgement
38
+ */
39
+ export declare function onServerAck(state: ClientState, msgId: string): ClientState;
40
+ /**
41
+ * Action: Receive remote message
42
+ */
43
+ export declare function onRemoteMessage(state: ClientState, msg: CRDTMessage): ClientState;
44
+ /**
45
+ * Action: Undo
46
+ */
47
+ export declare function undo(state: ClientState): {
48
+ state: ClientState;
49
+ msg: CRDTMessage | null;
50
+ };
51
+ /**
52
+ * Action: Redo
53
+ */
54
+ export declare function redo(state: ClientState): {
55
+ state: ClientState;
56
+ msg: CRDTMessage | null;
57
+ };
58
+ /**
59
+ * Action: Compact (create snapshot from acked entries)
60
+ */
61
+ export declare function compact(state: ClientState): ClientState;
62
+ /**
63
+ * Initialize from server snapshot + journal
64
+ */
65
+ export declare function initFromServer(sessionId: string, snapshot: Snapshot, journal: CRDTMessage[]): ClientState;
66
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,GAAG,WAAW,CAiB7F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,SAAS,EAAE,GACtB,UAAU,CA4BZ;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,GAAG,WAAW,CAqCrE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CA4BjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAa3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAO1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,WAAW,CA8BjF;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAiDxF;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAqCxF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CA0BvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EAAE,GACrB,WAAW,CAqCb"}
@@ -0,0 +1,345 @@
1
+ /**
2
+ * Client State Actions
3
+ *
4
+ * Pure functions that transform ClientState.
5
+ * Used by createGraph and React hooks.
6
+ */
7
+ import { produce } from 'immer';
8
+ import { applyMessage, applyOperation, createEmptyGraph } from '../operations/dispatcher.js';
9
+ import { VectorClockManager } from '../state/VectorClock.js';
10
+ import { isAdditiveOp, mergeValues } from './EditBuffer.js';
11
+ const clockManager = new VectorClockManager();
12
+ /**
13
+ * Generate a UUID
14
+ */
15
+ export function generateUUID() {
16
+ return crypto.randomUUID();
17
+ }
18
+ /**
19
+ * Create initial client state
20
+ */
21
+ export function createInitialState(sessionId, initialSnapshot) {
22
+ const emptyGraph = createEmptyGraph();
23
+ const snapshot = initialSnapshot ?? {
24
+ graph: emptyGraph,
25
+ vectorClock: {},
26
+ journalIndex: 0,
27
+ };
28
+ return {
29
+ graph: snapshot.graph,
30
+ journal: [],
31
+ edits: { ops: [], startGraph: null },
32
+ snapshot,
33
+ lamportTime: 0,
34
+ vectorClock: clockManager.create(sessionId),
35
+ sessionId,
36
+ };
37
+ }
38
+ /**
39
+ * Rebuild graph from snapshot + journal + edits
40
+ */
41
+ export function rebuildGraph(snapshot, journal, pendingOps) {
42
+ let graph = snapshot.graph;
43
+ // Apply journal (skip deleted entries and meta ops)
44
+ for (const entry of journal) {
45
+ if (entry.deletedAt)
46
+ continue;
47
+ const realOps = entry.msg.ops.filter(op => !op.otype.startsWith('meta.'));
48
+ if (realOps.length > 0) {
49
+ graph = applyMessage(graph, { ...entry.msg, ops: realOps });
50
+ }
51
+ }
52
+ // Apply pending edits
53
+ if (pendingOps.length > 0) {
54
+ graph = produce(graph, draft => {
55
+ for (const op of pendingOps) {
56
+ applyOperation(draft, op, {
57
+ sessionId: 'local',
58
+ clock: {},
59
+ lamportTime: 0,
60
+ timestamp: Date.now(),
61
+ });
62
+ }
63
+ });
64
+ }
65
+ return graph;
66
+ }
67
+ /**
68
+ * Action: Edit (uncommitted)
69
+ */
70
+ export function onEdit(state, op) {
71
+ return produce(state, draft => {
72
+ // Save start graph for cancel (first edit only)
73
+ // Use state.graph (immutable original), not draft.graph (mutable proxy)
74
+ if (draft.edits.ops.length === 0) {
75
+ draft.edits.startGraph = state.graph;
76
+ }
77
+ // Merge into edit buffer
78
+ const key = `${op.key}:${op.path}`;
79
+ const existingIdx = draft.edits.ops.findIndex(o => `${o.key}:${o.path}` === key);
80
+ if (existingIdx >= 0) {
81
+ const existing = draft.edits.ops[existingIdx];
82
+ if (existing.otype === op.otype && isAdditiveOp(op.otype)) {
83
+ // Merge additive ops
84
+ const mergedValue = mergeValues(op.otype, existing.value, op.value);
85
+ draft.edits.ops[existingIdx] = { ...existing, value: mergedValue };
86
+ }
87
+ else {
88
+ // Replace
89
+ draft.edits.ops[existingIdx] = op;
90
+ }
91
+ }
92
+ else {
93
+ draft.edits.ops.push(op);
94
+ }
95
+ // Apply to graph immediately (optimistic)
96
+ // Note: applyOperation mutates draft.graph in place
97
+ applyOperation(draft.graph, op, {
98
+ sessionId: draft.sessionId,
99
+ clock: draft.vectorClock,
100
+ lamportTime: draft.lamportTime,
101
+ timestamp: Date.now(),
102
+ });
103
+ });
104
+ }
105
+ /**
106
+ * Action: Commit edits
107
+ */
108
+ export function commitEdits(state, _description) {
109
+ if (state.edits.ops.length === 0) {
110
+ return { state, msg: null };
111
+ }
112
+ const newClock = clockManager.increment(state.vectorClock, state.sessionId);
113
+ const msg = {
114
+ id: generateUUID(),
115
+ sessionId: state.sessionId,
116
+ clock: newClock,
117
+ lamportTime: state.lamportTime + 1,
118
+ timestamp: Date.now(),
119
+ ops: [...state.edits.ops],
120
+ };
121
+ const newState = produce(state, draft => {
122
+ // Add to journal (unacknowledged)
123
+ draft.journal.push({ msg, ack: false });
124
+ // Clear edit buffer
125
+ draft.edits = { ops: [], startGraph: null };
126
+ // Update clocks
127
+ draft.lamportTime = msg.lamportTime;
128
+ draft.vectorClock = newClock;
129
+ });
130
+ return { state: newState, msg };
131
+ }
132
+ /**
133
+ * Action: Cancel edits (revert to start graph)
134
+ */
135
+ export function cancelEdits(state) {
136
+ if (state.edits.ops.length === 0) {
137
+ return state;
138
+ }
139
+ return produce(state, draft => {
140
+ // Revert to start graph
141
+ if (draft.edits.startGraph) {
142
+ draft.graph = draft.edits.startGraph;
143
+ }
144
+ // Clear edit buffer
145
+ draft.edits = { ops: [], startGraph: null };
146
+ });
147
+ }
148
+ /**
149
+ * Action: Server acknowledgement
150
+ */
151
+ export function onServerAck(state, msgId) {
152
+ return produce(state, draft => {
153
+ const entry = draft.journal.find(e => e.msg.id === msgId);
154
+ if (entry) {
155
+ entry.ack = true;
156
+ }
157
+ });
158
+ }
159
+ /**
160
+ * Action: Receive remote message
161
+ */
162
+ export function onRemoteMessage(state, msg) {
163
+ // Skip duplicates
164
+ if (state.journal.some(e => e.msg.id === msg.id)) {
165
+ return state;
166
+ }
167
+ return produce(state, draft => {
168
+ // Add to journal (already acked - came from server)
169
+ draft.journal.push({ msg, ack: true });
170
+ // Process meta ops (undo/redo)
171
+ for (const op of msg.ops) {
172
+ if (op.otype === 'meta.undo') {
173
+ const targetMsgId = op.targetMsgId;
174
+ const target = draft.journal.find(e => e.msg.id === targetMsgId);
175
+ if (target)
176
+ target.deletedAt = msg.timestamp;
177
+ }
178
+ else if (op.otype === 'meta.redo') {
179
+ const targetMsgId = op.targetMsgId;
180
+ const target = draft.journal.find(e => e.msg.id === targetMsgId);
181
+ if (target)
182
+ delete target.deletedAt;
183
+ }
184
+ }
185
+ // Merge clocks
186
+ draft.vectorClock = clockManager.merge(draft.vectorClock, msg.clock);
187
+ draft.lamportTime = Math.max(draft.lamportTime, msg.lamportTime);
188
+ // Rebuild graph
189
+ draft.graph = rebuildGraph(draft.snapshot, draft.journal, draft.edits.ops);
190
+ });
191
+ }
192
+ /**
193
+ * Action: Undo
194
+ */
195
+ export function undo(state) {
196
+ let currentState = state;
197
+ let targetMsgId;
198
+ // If edit buffer not empty, commit first then mark as deleted
199
+ if (state.edits.ops.length > 0) {
200
+ const { state: committed, msg } = commitEdits(state);
201
+ if (!msg)
202
+ return { state, msg: null };
203
+ currentState = committed;
204
+ targetMsgId = msg.id;
205
+ }
206
+ else {
207
+ // Find last non-deleted message from this session
208
+ const lastActive = [...currentState.journal]
209
+ .reverse()
210
+ .find(e => !e.deletedAt && e.msg.sessionId === currentState.sessionId);
211
+ if (!lastActive)
212
+ return { state: currentState, msg: null };
213
+ targetMsgId = lastActive.msg.id;
214
+ }
215
+ // Create undo message
216
+ const newClock = clockManager.increment(currentState.vectorClock, currentState.sessionId);
217
+ const undoMsg = {
218
+ id: generateUUID(),
219
+ sessionId: currentState.sessionId,
220
+ clock: newClock,
221
+ lamportTime: currentState.lamportTime + 1,
222
+ timestamp: Date.now(),
223
+ ops: [{ otype: 'meta.undo', key: '_meta', path: '_meta', targetMsgId }],
224
+ };
225
+ // Apply locally
226
+ const newState = produce(currentState, draft => {
227
+ // Add undo message to journal
228
+ draft.journal.push({ msg: undoMsg, ack: false });
229
+ // Mark target as deleted
230
+ const target = draft.journal.find(e => e.msg.id === targetMsgId);
231
+ if (target)
232
+ target.deletedAt = undoMsg.timestamp;
233
+ // Update clocks
234
+ draft.lamportTime = undoMsg.lamportTime;
235
+ draft.vectorClock = newClock;
236
+ // Rebuild graph
237
+ draft.graph = rebuildGraph(draft.snapshot, draft.journal, draft.edits.ops);
238
+ });
239
+ return { state: newState, msg: undoMsg };
240
+ }
241
+ /**
242
+ * Action: Redo
243
+ */
244
+ export function redo(state) {
245
+ // Find last deleted message from this session
246
+ const lastDeleted = [...state.journal]
247
+ .reverse()
248
+ .find(e => e.deletedAt && e.msg.sessionId === state.sessionId);
249
+ if (!lastDeleted)
250
+ return { state, msg: null };
251
+ // Create redo message
252
+ const newClock = clockManager.increment(state.vectorClock, state.sessionId);
253
+ const redoMsg = {
254
+ id: generateUUID(),
255
+ sessionId: state.sessionId,
256
+ clock: newClock,
257
+ lamportTime: state.lamportTime + 1,
258
+ timestamp: Date.now(),
259
+ ops: [{ otype: 'meta.redo', key: '_meta', path: '_meta', targetMsgId: lastDeleted.msg.id }],
260
+ };
261
+ // Apply locally
262
+ const newState = produce(state, draft => {
263
+ // Add redo message to journal
264
+ draft.journal.push({ msg: redoMsg, ack: false });
265
+ // Clear deletedAt on target
266
+ const target = draft.journal.find(e => e.msg.id === lastDeleted.msg.id);
267
+ if (target)
268
+ delete target.deletedAt;
269
+ // Update clocks
270
+ draft.lamportTime = redoMsg.lamportTime;
271
+ draft.vectorClock = newClock;
272
+ // Rebuild graph
273
+ draft.graph = rebuildGraph(draft.snapshot, draft.journal, draft.edits.ops);
274
+ });
275
+ return { state: newState, msg: redoMsg };
276
+ }
277
+ /**
278
+ * Action: Compact (create snapshot from acked entries)
279
+ */
280
+ export function compact(state) {
281
+ const lastAckedIdx = state.journal.findLastIndex(e => e.ack);
282
+ if (lastAckedIdx < 0)
283
+ return state;
284
+ return produce(state, draft => {
285
+ // Build new snapshot (skip deleted entries and meta ops)
286
+ let snapshotGraph = draft.snapshot.graph;
287
+ for (let i = 0; i <= lastAckedIdx; i++) {
288
+ const entry = draft.journal[i];
289
+ if (entry.deletedAt)
290
+ continue;
291
+ const realOps = entry.msg.ops.filter(op => !op.otype.startsWith('meta.'));
292
+ if (realOps.length > 0) {
293
+ snapshotGraph = applyMessage(snapshotGraph, { ...entry.msg, ops: realOps });
294
+ }
295
+ }
296
+ draft.snapshot = {
297
+ graph: snapshotGraph,
298
+ vectorClock: draft.journal[lastAckedIdx].msg.clock,
299
+ journalIndex: draft.snapshot.journalIndex + lastAckedIdx + 1,
300
+ };
301
+ // Remove compacted entries
302
+ draft.journal = draft.journal.slice(lastAckedIdx + 1);
303
+ });
304
+ }
305
+ /**
306
+ * Initialize from server snapshot + journal
307
+ */
308
+ export function initFromServer(sessionId, snapshot, journal) {
309
+ let graph = snapshot.graph;
310
+ const journalEntries = [];
311
+ let maxLamport = 0;
312
+ let mergedClock = snapshot.vectorClock;
313
+ for (const msg of journal) {
314
+ // Process meta ops
315
+ for (const op of msg.ops) {
316
+ if (op.otype === 'meta.undo') {
317
+ const targetMsgId = op.targetMsgId;
318
+ const target = journalEntries.find(e => e.msg.id === targetMsgId);
319
+ if (target)
320
+ target.deletedAt = msg.timestamp;
321
+ }
322
+ else if (op.otype === 'meta.redo') {
323
+ const targetMsgId = op.targetMsgId;
324
+ const target = journalEntries.find(e => e.msg.id === targetMsgId);
325
+ if (target)
326
+ delete target.deletedAt;
327
+ }
328
+ }
329
+ journalEntries.push({ msg, ack: true });
330
+ maxLamport = Math.max(maxLamport, msg.lamportTime);
331
+ mergedClock = clockManager.merge(mergedClock, msg.clock);
332
+ }
333
+ // Rebuild graph
334
+ graph = rebuildGraph(snapshot, journalEntries, []);
335
+ return {
336
+ graph,
337
+ journal: journalEntries,
338
+ edits: { ops: [], startGraph: null },
339
+ snapshot,
340
+ lamportTime: maxLamport,
341
+ vectorClock: clockManager.increment(mergedClock, sessionId),
342
+ sessionId,
343
+ };
344
+ }
345
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * createGraph - Factory function for creating a graph store
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * const store = createGraph({
7
+ * sessionId: 'my-session',
8
+ * onSend: (msg) => websocket.send(msg),
9
+ * });
10
+ *
11
+ * store.edit({ otype: 'vector3.add', key: 'cube', path: 'position', value: [1, 0, 0] });
12
+ * store.commit('Move cube');
13
+ * store.undo();
14
+ * ```
15
+ */
16
+ import type { CRDTMessage } from '../operations/OperationTypes.js';
17
+ import type { CreateGraphOptions, GraphStore, Snapshot } from './types.js';
18
+ /**
19
+ * Create a graph store
20
+ */
21
+ export declare function createGraph(options: CreateGraphOptions): GraphStore;
22
+ /**
23
+ * Create a graph store initialized from server state
24
+ */
25
+ export declare function createGraphFromServer(options: CreateGraphOptions & {
26
+ snapshot: Snapshot;
27
+ journal: CRDTMessage[];
28
+ }): GraphStore;
29
+ export type { ClientState, CreateGraphOptions, GraphStore, Snapshot, JournalEntry, EditBuffer } from './types.js';
30
+ //# sourceMappingURL=createGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createGraph.d.ts","sourceRoot":"","sources":["../../src/client/createGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,iCAAiC,CAAC;AAC9E,OAAO,KAAK,EAAe,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiBxF;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAkEnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,kBAAkB,GAAG;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,GACA,UAAU,CAcZ;AAGD,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}