@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.
- package/dist/journal/CoalescingService.d.ts.map +1 -1
- package/dist/journal/CoalescingService.js +29 -14
- package/dist/journal/CoalescingService.js.map +1 -1
- package/package.json +14 -14
- package/src/journal/COALESCING.md +51 -0
- package/src/journal/CoalescingService.ts +30 -14
- package/tests/journal/lww-ordering-bug.test.ts +248 -0
- package/tests/journal/multi-session-coalescing.test.ts +25 -19
|
@@ -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;
|
|
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:
|
|
369
|
-
*
|
|
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
|
|
375
|
-
const
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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
|
-
|
|
392
|
+
currentRun.push(msg);
|
|
393
|
+
lastSessionId = msg.sessionId;
|
|
394
|
+
}
|
|
395
|
+
if (currentRun.length > 0) {
|
|
396
|
+
runs.push(currentRun);
|
|
382
397
|
}
|
|
383
|
-
// Coalesce
|
|
398
|
+
// Coalesce each run separately
|
|
384
399
|
const coalescedMessages = [];
|
|
385
|
-
for (const
|
|
386
|
-
// Flatten all ops from this
|
|
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
|
|
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
|
|
409
|
-
const lastMsg =
|
|
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.
|
|
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:
|
|
472
|
-
*
|
|
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
|
|
481
|
-
const
|
|
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
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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
|
-
|
|
499
|
+
currentRun.push(msg);
|
|
500
|
+
lastSessionId = msg.sessionId;
|
|
501
|
+
}
|
|
502
|
+
if (currentRun.length > 0) {
|
|
503
|
+
runs.push(currentRun);
|
|
488
504
|
}
|
|
489
505
|
|
|
490
|
-
// Coalesce
|
|
506
|
+
// Coalesce each run separately
|
|
491
507
|
const coalescedMessages: CRDTMessage[] = [];
|
|
492
508
|
|
|
493
|
-
for (const
|
|
494
|
-
// Flatten all ops from this
|
|
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
|
|
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
|
|
520
|
-
const lastMsg =
|
|
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:
|
|
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(
|
|
405
|
-
|
|
406
|
-
// Alice's
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
const
|
|
410
|
-
expect(
|
|
411
|
-
|
|
412
|
-
expect(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
expect(
|
|
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 () => {
|