@vuer-ai/vuer-rtc-server 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"CoalescingService.d.ts","sourceRoot":"","sources":["../../src/journal/CoalescingService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOnD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,YAAY,GACZ,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAG1D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,SAAS,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAudD,qBAAa,iBAAiB;IAChB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAExC;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA0ExF"}
1
+ {"version":3,"file":"CoalescingService.d.ts","sourceRoot":"","sources":["../../src/journal/CoalescingService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOnD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,YAAY,GACZ,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAG1D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,SAAS,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAueD,qBAAa,iBAAiB;IAChB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAExC;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA0ExF"}
@@ -365,27 +365,42 @@ function coalesceAdditiveOps(tOps) {
365
365
  /**
366
366
  * Coalesce operations in a message array
367
367
  *
368
- * IMPORTANT: Coalescing respects session boundaries. Operations from different
369
- * sessions are never merged together, preserving CRDT metadata and causality.
368
+ * IMPORTANT: Preserves interleaved order to maintain causality.
369
+ * Groups messages into consecutive runs from the same session, then coalesces
370
+ * each run separately. This ensures Lamport's "happened-before" relation is preserved.
371
+ *
372
+ * Example:
373
+ * Input: [alice-msg1, alice-msg2, bob-msg3, alice-msg4]
374
+ * Output: [alice-run1, bob-run2, alice-run3]
375
+ *
376
+ * This prevents the bug where all operations from a session get the last message's
377
+ * lamportTime, which breaks LWW conflict resolution.
370
378
  */
371
379
  function coalesceOperations(messages, config) {
372
380
  if (messages.length === 0)
373
381
  return [];
374
- // Group messages by sessionId to preserve CRDT metadata
375
- const sessionGroups = new Map();
382
+ // Group messages into consecutive runs from the same session
383
+ const runs = [];
384
+ let currentRun = [];
385
+ let lastSessionId = null;
376
386
  for (const msg of messages) {
377
- const sessionId = msg.sessionId;
378
- if (!sessionGroups.has(sessionId)) {
379
- sessionGroups.set(sessionId, []);
387
+ if (msg.sessionId !== lastSessionId && currentRun.length > 0) {
388
+ // Session switch - emit current run and start new one
389
+ runs.push(currentRun);
390
+ currentRun = [];
380
391
  }
381
- sessionGroups.get(sessionId).push(msg);
392
+ currentRun.push(msg);
393
+ lastSessionId = msg.sessionId;
394
+ }
395
+ if (currentRun.length > 0) {
396
+ runs.push(currentRun);
382
397
  }
383
- // Coalesce within each session separately
398
+ // Coalesce each run separately
384
399
  const coalescedMessages = [];
385
- for (const [sessionId, sessionMessages] of sessionGroups) {
386
- // Flatten all ops from this session with embedded timestamps
400
+ for (const run of runs) {
401
+ // Flatten all ops from this run with embedded timestamps
387
402
  let tOps = [];
388
- for (const msg of sessionMessages) {
403
+ for (const msg of run) {
389
404
  const timestamp = msg.timestamp * 1000; // convert to ms
390
405
  for (const op of msg.ops) {
391
406
  tOps.push({ op, timestamp });
@@ -405,8 +420,8 @@ function coalesceOperations(messages, config) {
405
420
  const allOps = tOps.map(t => t.op);
406
421
  if (allOps.length === 0)
407
422
  continue;
408
- // Rebuild message for this session - use the last message's metadata
409
- const lastMsg = sessionMessages[sessionMessages.length - 1];
423
+ // Rebuild message for this run - use the last message's metadata
424
+ const lastMsg = run[run.length - 1];
410
425
  coalescedMessages.push({
411
426
  ...lastMsg,
412
427
  ops: allOps,
@@ -1 +1 @@
1
- {"version":3,"file":"CoalescingService.js","sourceRoot":"","sources":["../../src/journal/CoalescingService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CoalescingService.js","sourceRoot":"","sources":["../../src/journal/CoalescingService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vuer-ai/vuer-rtc-server",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Vuer RTC Server — RoomBroker, WebSocket transport, MongoDB persistence",
@@ -28,6 +28,16 @@
28
28
  "import": "./dist/persistence/index.js"
29
29
  }
30
30
  },
31
+ "scripts": {
32
+ "build": "prisma generate && tsc",
33
+ "dev": "tsc --watch",
34
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
35
+ "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
36
+ "test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
37
+ "serve": "node dist/serve.js",
38
+ "prisma:generate": "prisma generate",
39
+ "prisma:push": "prisma db push"
40
+ },
31
41
  "devDependencies": {
32
42
  "@jest/globals": "^30.2.0",
33
43
  "@types/jest": "^30.0.0",
@@ -39,18 +49,8 @@
39
49
  },
40
50
  "dependencies": {
41
51
  "@prisma/client": "^5.22.0",
52
+ "@vuer-ai/vuer-rtc": "workspace:^",
42
53
  "prisma": "^5.22.0",
43
- "ws": "^8.19.0",
44
- "@vuer-ai/vuer-rtc": "^0.3.1"
45
- },
46
- "scripts": {
47
- "build": "prisma generate && tsc",
48
- "dev": "tsc --watch",
49
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
50
- "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
51
- "test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
52
- "serve": "node dist/serve.js",
53
- "prisma:generate": "prisma generate",
54
- "prisma:push": "prisma db push"
54
+ "ws": "^8.19.0"
55
55
  }
56
- }
56
+ }
@@ -7,6 +7,43 @@ Coalescing reduces journal size by merging compatible operations. This improves:
7
7
  - Replay performance (fewer operations to apply)
8
8
  - State serialization depth (fewer items in B-trees)
9
9
 
10
+ ## Session Boundaries and Causality Preservation
11
+
12
+ **Critical constraint**: Coalescing MUST preserve the **interleaved order** of operations across sessions to maintain causality.
13
+
14
+ ### The Problem
15
+
16
+ Given messages in timestamp order:
17
+ ```
18
+ msg1: sessionA [op1, op2]
19
+ msg2: sessionA [op3]
20
+ msg3: sessionB [op4]
21
+ msg4: sessionA [op5]
22
+ ```
23
+
24
+ **WRONG** - Grouping all operations by session:
25
+ ```
26
+ coalesced-A: [op1, op2, op3, op5] // ❌ Lost causality
27
+ coalesced-B: [op4]
28
+ ```
29
+ This violates causality because `op5` happened after `op4` was received. If `op5` was created in response to seeing `op4`, reordering them breaks the happened-before relation.
30
+
31
+ **CORRECT** - Preserve interleaved order, coalesce consecutive runs:
32
+ ```
33
+ run1-A: [op1, op2, op3] // Consecutive messages from A
34
+ run2-B: [op4] // Session switch to B
35
+ run3-A: [op5] // Back to A (preserves that op5 came AFTER op4)
36
+ ```
37
+
38
+ ### Implementation Strategy
39
+
40
+ 1. Process messages in timestamp order
41
+ 2. Detect "session switches" (when `msg[i].sessionId !== msg[i-1].sessionId`)
42
+ 3. Coalesce each consecutive run from the same session
43
+ 4. Emit coalesced messages in the same order as the runs
44
+
45
+ This approach preserves Lamport's "happened-before" relation while still achieving compression benefits.
46
+
10
47
  ## Types of Coalescing
11
48
 
12
49
  ### 1. Client-Side Edit Batching (Optional, UI-Level)
@@ -214,3 +251,17 @@ The text CRDT B-tree (`_textRope.content._tree`) grows very deep with many singl
214
251
  3. Verify journal in DB Viewer shows coalesced operations
215
252
  4. Test undo/redo still works after coalescing
216
253
  5. Test multi-client conflict resolution after coalescing
254
+
255
+ ## References
256
+
257
+ ### Causality and Operation Ordering
258
+
259
+ - [Peritext: A CRDT for Collaborative Rich Text Editing](https://dspace.mit.edu/bitstream/handle/1721.1/147641/3555644.pdf?sequence=1&isAllowed=y) - MIT research on collaborative text editing with CRDTs
260
+ - [Real-time collaborative editing using CRDTs](http://www.diva-portal.org/smash/get/diva2:1304659/FULLTEXT01.pdf) - Comprehensive study on CRDT-based collaborative editing
261
+ - [Geometry-Aware CRDTs for Efficient Collaborative Geospatial Editing](https://www.mdpi.com/2220-9964/14/12/468) - Research on preserving both temporal causality and spatial dependencies, includes discussion of operation batching and causality preservation
262
+
263
+ ### Key Concepts
264
+
265
+ - **Lamport's "happened-before" relation**: Operations must maintain causality - if op B was created after seeing op A, that ordering must be preserved
266
+ - **Interleaving**: When operations from different sessions are interspersed, coalescing must not reorder them
267
+ - **Vector clocks**: Track causality across distributed sessions
@@ -468,8 +468,16 @@ function coalesceAdditiveOps(tOps: TimestampedOp[]): TimestampedOp[] {
468
468
  /**
469
469
  * Coalesce operations in a message array
470
470
  *
471
- * IMPORTANT: Coalescing respects session boundaries. Operations from different
472
- * sessions are never merged together, preserving CRDT metadata and causality.
471
+ * IMPORTANT: Preserves interleaved order to maintain causality.
472
+ * Groups messages into consecutive runs from the same session, then coalesces
473
+ * each run separately. This ensures Lamport's "happened-before" relation is preserved.
474
+ *
475
+ * Example:
476
+ * Input: [alice-msg1, alice-msg2, bob-msg3, alice-msg4]
477
+ * Output: [alice-run1, bob-run2, alice-run3]
478
+ *
479
+ * This prevents the bug where all operations from a session get the last message's
480
+ * lamportTime, which breaks LWW conflict resolution.
473
481
  */
474
482
  function coalesceOperations(
475
483
  messages: CRDTMessage[],
@@ -477,23 +485,31 @@ function coalesceOperations(
477
485
  ): CRDTMessage[] {
478
486
  if (messages.length === 0) return [];
479
487
 
480
- // Group messages by sessionId to preserve CRDT metadata
481
- const sessionGroups = new Map<string, CRDTMessage[]>();
488
+ // Group messages into consecutive runs from the same session
489
+ const runs: CRDTMessage[][] = [];
490
+ let currentRun: CRDTMessage[] = [];
491
+ let lastSessionId: string | null = null;
492
+
482
493
  for (const msg of messages) {
483
- const sessionId = msg.sessionId;
484
- if (!sessionGroups.has(sessionId)) {
485
- sessionGroups.set(sessionId, []);
494
+ if (msg.sessionId !== lastSessionId && currentRun.length > 0) {
495
+ // Session switch - emit current run and start new one
496
+ runs.push(currentRun);
497
+ currentRun = [];
486
498
  }
487
- sessionGroups.get(sessionId)!.push(msg);
499
+ currentRun.push(msg);
500
+ lastSessionId = msg.sessionId;
501
+ }
502
+ if (currentRun.length > 0) {
503
+ runs.push(currentRun);
488
504
  }
489
505
 
490
- // Coalesce within each session separately
506
+ // Coalesce each run separately
491
507
  const coalescedMessages: CRDTMessage[] = [];
492
508
 
493
- for (const [sessionId, sessionMessages] of sessionGroups) {
494
- // Flatten all ops from this session with embedded timestamps
509
+ for (const run of runs) {
510
+ // Flatten all ops from this run with embedded timestamps
495
511
  let tOps: TimestampedOp[] = [];
496
- for (const msg of sessionMessages) {
512
+ for (const msg of run) {
497
513
  const timestamp = msg.timestamp * 1000; // convert to ms
498
514
  for (const op of msg.ops) {
499
515
  tOps.push({ op, timestamp });
@@ -516,8 +532,8 @@ function coalesceOperations(
516
532
 
517
533
  if (allOps.length === 0) continue;
518
534
 
519
- // Rebuild message for this session - use the last message's metadata
520
- const lastMsg = sessionMessages[sessionMessages.length - 1];
535
+ // Rebuild message for this run - use the last message's metadata
536
+ const lastMsg = run[run.length - 1];
521
537
  coalescedMessages.push({
522
538
  ...lastMsg,
523
539
  ops: allOps,
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Test demonstrating LWW bug caused by session grouping in coalescing
3
+ *
4
+ * The bug: When coalescing groups all operations by session, it uses the
5
+ * last message's lamportTime for ALL operations from that session.
6
+ * This breaks LWW conflict resolution when operations are interleaved.
7
+ */
8
+
9
+ import { describe, it, expect } from '@jest/globals';
10
+ import type { CRDTMessage, Operation, SceneGraph } from '@vuer-ai/vuer-rtc';
11
+ import { createEmptyGraph, applyMessage } from '@vuer-ai/vuer-rtc';
12
+
13
+ /**
14
+ * Helper to coalesce messages using current (buggy) implementation
15
+ */
16
+ function coalesceBuggy(messages: CRDTMessage[]): CRDTMessage[] {
17
+ if (messages.length === 0) return [];
18
+
19
+ // Current implementation: Group by session
20
+ const sessionGroups = new Map<string, CRDTMessage[]>();
21
+ for (const msg of messages) {
22
+ if (!sessionGroups.has(msg.sessionId)) {
23
+ sessionGroups.set(msg.sessionId, []);
24
+ }
25
+ sessionGroups.get(msg.sessionId)!.push(msg);
26
+ }
27
+
28
+ const coalesced: CRDTMessage[] = [];
29
+ for (const [sessionId, sessionMessages] of sessionGroups) {
30
+ // Flatten all ops from this session
31
+ const allOps: Operation[] = [];
32
+ for (const msg of sessionMessages) {
33
+ allOps.push(...msg.ops);
34
+ }
35
+
36
+ // Use last message's metadata (THIS IS THE BUG)
37
+ const lastMsg = sessionMessages[sessionMessages.length - 1];
38
+ coalesced.push({
39
+ ...lastMsg,
40
+ ops: allOps,
41
+ });
42
+ }
43
+
44
+ return coalesced;
45
+ }
46
+
47
+ /**
48
+ * Helper to coalesce messages preserving interleaved order
49
+ */
50
+ function coalesceCorrect(messages: CRDTMessage[]): CRDTMessage[] {
51
+ if (messages.length === 0) return [];
52
+
53
+ // Correct implementation: Group into consecutive runs
54
+ const runs: CRDTMessage[][] = [];
55
+ let currentRun: CRDTMessage[] = [];
56
+ let lastSessionId: string | null = null;
57
+
58
+ for (const msg of messages) {
59
+ if (msg.sessionId !== lastSessionId && currentRun.length > 0) {
60
+ runs.push(currentRun);
61
+ currentRun = [];
62
+ }
63
+ currentRun.push(msg);
64
+ lastSessionId = msg.sessionId;
65
+ }
66
+ if (currentRun.length > 0) runs.push(currentRun);
67
+
68
+ // Coalesce each run
69
+ return runs.map(run => {
70
+ const allOps: Operation[] = [];
71
+ for (const msg of run) {
72
+ allOps.push(...msg.ops);
73
+ }
74
+ const lastMsg = run[run.length - 1];
75
+ return {
76
+ ...lastMsg,
77
+ ops: allOps,
78
+ };
79
+ });
80
+ }
81
+
82
+ describe('LWW Ordering Bug', () => {
83
+ /**
84
+ * Scenario:
85
+ * 1. Alice sets cube.color = "red" (lamport=10)
86
+ * 2. Bob sets cube.color = "blue" (lamport=15)
87
+ * 3. Alice sets cube.color = "green" (lamport=20)
88
+ *
89
+ * Expected: Final color should be "green" (lamport=20 wins)
90
+ *
91
+ * Bug: When coalescing groups all Alice's ops together and uses
92
+ * lamport=20 for both, BOTH red and green get lamport=20.
93
+ * This breaks LWW resolution.
94
+ */
95
+ it('should preserve LWW ordering when operations are interleaved', () => {
96
+ // Create the node first
97
+ let graph = createEmptyGraph();
98
+ graph = applyMessage(graph, {
99
+ id: 'init',
100
+ sessionId: 'init',
101
+ clock: { init: 1 },
102
+ lamportTime: 1,
103
+ timestamp: 0,
104
+ ops: [{ otype: 'node.insert', key: '__root', path: 'children', value: { key: 'cube', tag: 'Mesh', name: 'Cube' } }],
105
+ });
106
+
107
+ // Original messages in interleaved order
108
+ const messages: CRDTMessage[] = [
109
+ {
110
+ id: 'msg1',
111
+ sessionId: 'alice',
112
+ clock: { alice: 10 },
113
+ lamportTime: 10,
114
+ timestamp: 1000,
115
+ ops: [
116
+ {
117
+ otype: 'string.set',
118
+ key: 'cube',
119
+ path: 'color',
120
+ value: 'red',
121
+ },
122
+ ],
123
+ },
124
+ {
125
+ id: 'msg2',
126
+ sessionId: 'bob',
127
+ clock: { alice: 10, bob: 15 },
128
+ lamportTime: 15,
129
+ timestamp: 1500,
130
+ ops: [
131
+ {
132
+ otype: 'string.set',
133
+ key: 'cube',
134
+ path: 'color',
135
+ value: 'blue',
136
+ },
137
+ ],
138
+ },
139
+ {
140
+ id: 'msg3',
141
+ sessionId: 'alice',
142
+ clock: { alice: 20, bob: 15 },
143
+ lamportTime: 20,
144
+ timestamp: 2000,
145
+ ops: [
146
+ {
147
+ otype: 'string.set',
148
+ key: 'cube',
149
+ path: 'color',
150
+ value: 'green',
151
+ },
152
+ ],
153
+ },
154
+ ];
155
+
156
+ // Apply original messages - should result in green
157
+ let graphOriginal = graph;
158
+ for (const msg of messages) {
159
+ graphOriginal = applyMessage(graphOriginal, msg);
160
+ }
161
+ expect(graphOriginal.nodes['cube']?.color).toBe('green');
162
+
163
+ // Apply buggy coalescing
164
+ const coalescedBuggy = coalesceBuggy(messages);
165
+ console.log('Buggy coalescing:');
166
+ coalescedBuggy.forEach(msg => {
167
+ console.log(` session=${msg.sessionId}, lamport=${msg.lamportTime}, ops=${msg.ops.length}`);
168
+ msg.ops.forEach(op => console.log(` ${JSON.stringify(op)}`));
169
+ });
170
+
171
+ let graphBuggy = graph;
172
+ for (const msg of coalescedBuggy) {
173
+ graphBuggy = applyMessage(graphBuggy, msg);
174
+ }
175
+
176
+ // THIS WILL FAIL - buggy version might produce wrong result
177
+ console.log(`Buggy result: ${graphBuggy.nodes['cube']?.color}`);
178
+
179
+ // Apply correct coalescing
180
+ const coalescedCorrect = coalesceCorrect(messages);
181
+ console.log('\nCorrect coalescing:');
182
+ coalescedCorrect.forEach(msg => {
183
+ console.log(` session=${msg.sessionId}, lamport=${msg.lamportTime}, ops=${msg.ops.length}`);
184
+ msg.ops.forEach(op => console.log(` ${JSON.stringify(op)}`));
185
+ });
186
+
187
+ let graphCorrect = graph;
188
+ for (const msg of coalescedCorrect) {
189
+ graphCorrect = applyMessage(graphCorrect, msg);
190
+ }
191
+ console.log(`Correct result: ${graphCorrect.nodes['cube']?.color}`);
192
+
193
+ // Both should produce "green"
194
+ expect(graphCorrect.nodes['cube']?.color).toBe('green');
195
+
196
+ // This expectation will FAIL with buggy coalescing
197
+ expect(graphBuggy.nodes['cube']?.color).toBe('green');
198
+ });
199
+
200
+ it('demonstrates the metadata inheritance problem', () => {
201
+ const messages: CRDTMessage[] = [
202
+ {
203
+ id: 'msg1',
204
+ sessionId: 'alice',
205
+ clock: { alice: 10 },
206
+ lamportTime: 10,
207
+ timestamp: 1000,
208
+ ops: [{ otype: 'number.set', key: 'x', path: 'value', value: 1 }],
209
+ },
210
+ {
211
+ id: 'msg2',
212
+ sessionId: 'bob',
213
+ clock: { alice: 10, bob: 15 },
214
+ lamportTime: 15,
215
+ timestamp: 1500,
216
+ ops: [{ otype: 'number.set', key: 'x', path: 'value', value: 2 }],
217
+ },
218
+ {
219
+ id: 'msg3',
220
+ sessionId: 'alice',
221
+ clock: { alice: 20, bob: 15 },
222
+ lamportTime: 20,
223
+ timestamp: 2000,
224
+ ops: [{ otype: 'number.set', key: 'x', path: 'value', value: 3 }],
225
+ },
226
+ ];
227
+
228
+ const coalesced = coalesceBuggy(messages);
229
+
230
+ // Find alice's coalesced message
231
+ const aliceMsg = coalesced.find(m => m.sessionId === 'alice')!;
232
+
233
+ // Bug: ALL of Alice's ops inherit lamportTime=20 from msg3
234
+ expect(aliceMsg.lamportTime).toBe(20);
235
+ expect(aliceMsg.ops).toHaveLength(2); // Both set operations
236
+
237
+ // When these ops are applied, they BOTH get lamportTime=20
238
+ // This means the first operation (value=1) incorrectly gets lamport=20
239
+ // instead of its original lamport=10
240
+
241
+ console.log('Alice coalesced message:', {
242
+ lamportTime: aliceMsg.lamportTime,
243
+ ops: aliceMsg.ops,
244
+ });
245
+
246
+ // The problem: Both ops get lamport=20, so LWW resolution is broken
247
+ });
248
+ });
@@ -396,32 +396,38 @@ describe('Multi-Session Coalescing', () => {
396
396
  // Compact
397
397
  await service.compact(documentId);
398
398
 
399
- // After compaction: 3 batches (1 system + 1 alice + 1 bob)
399
+ // After compaction: 4 batches (1 system + 2 alice runs + 1 bob)
400
+ // The new implementation preserves interleaved order, so Alice's two
401
+ // runs (before and after Bob) are kept separate to maintain causality
400
402
  const batchesAfter = await prisma.journalBatch.findMany({
401
403
  where: { documentId },
402
404
  orderBy: { lamportTime: 'asc' },
403
405
  });
404
- expect(batchesAfter.length).toBe(3);
405
-
406
- // Alice's operations should be coalesced into TWO text.insert ops
407
- // (one for "abc" at position 0, one for "123" at position 3)
408
- // because they are non-consecutive
409
- const aliceBatch = batchesAfter.find(b => b.sessionId === 'alice');
410
- expect(aliceBatch).toBeDefined();
411
- const aliceOps = aliceBatch!.operations as any[];
412
- expect(aliceOps.length).toBe(2);
413
- expect(aliceOps[0].value).toBe('abc');
414
- expect(aliceOps[0].position).toBe(0);
415
- expect(aliceOps[1].value).toBe('123');
416
- expect(aliceOps[1].position).toBe(3);
417
-
418
- // Bob's operations should be coalesced into ONE text.insert op
419
- const bobBatch = batchesAfter.find(b => b.sessionId === 'bob');
420
- expect(bobBatch).toBeDefined();
421
- const bobOps = bobBatch!.operations as any[];
406
+ expect(batchesAfter.length).toBe(4);
407
+
408
+ // Alice's first run: "abc" at position 0
409
+ const aliceBatch1 = batchesAfter[1]; // After system init
410
+ expect(aliceBatch1.sessionId).toBe('alice');
411
+ const aliceOps1 = aliceBatch1.operations as any[];
412
+ expect(aliceOps1.length).toBe(1);
413
+ expect(aliceOps1[0].value).toBe('abc');
414
+ expect(aliceOps1[0].position).toBe(0);
415
+
416
+ // Bob's operations: "xyz" at position 3
417
+ const bobBatch = batchesAfter[2];
418
+ expect(bobBatch.sessionId).toBe('bob');
419
+ const bobOps = bobBatch.operations as any[];
422
420
  expect(bobOps.length).toBe(1);
423
421
  expect(bobOps[0].value).toBe('xyz');
424
422
  expect(bobOps[0].position).toBe(3);
423
+
424
+ // Alice's second run: "123" at position 3
425
+ const aliceBatch2 = batchesAfter[3];
426
+ expect(aliceBatch2.sessionId).toBe('alice');
427
+ const aliceOps2 = aliceBatch2.operations as any[];
428
+ expect(aliceOps2.length).toBe(1);
429
+ expect(aliceOps2[0].value).toBe('123');
430
+ expect(aliceOps2[0].position).toBe(3);
425
431
  });
426
432
 
427
433
  it('should handle multi-session set operations with correct LWW metadata', async () => {