@vuer-ai/vuer-rtc 0.5.1 → 0.5.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/DELETE_COALESCENCE_SOLUTION.md +345 -0
- package/dist/client/coalescence/textDeletes.d.ts.map +1 -1
- package/dist/client/coalescence/textDeletes.js +7 -0
- package/dist/client/coalescence/textDeletes.js.map +1 -1
- package/dist/client/coalescence/utils.d.ts +29 -0
- package/dist/client/coalescence/utils.d.ts.map +1 -0
- package/dist/client/coalescence/utils.js +52 -0
- package/dist/client/coalescence/utils.js.map +1 -0
- package/dist/crdt/Rope.d.ts.map +1 -1
- package/dist/crdt/Rope.js +22 -1
- package/dist/crdt/Rope.js.map +1 -1
- package/package.json +1 -1
- package/src/client/coalescence/textDeletes.ts +8 -0
- package/src/client/coalescence/utils.ts +60 -0
- package/src/crdt/Rope.ts +25 -1
- package/tests/client/delete-coalescence-bug.test.ts +249 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
# Delete Coalescence Solution
|
|
2
|
+
|
|
3
|
+
## Root Cause Analysis
|
|
4
|
+
|
|
5
|
+
### The Problem
|
|
6
|
+
|
|
7
|
+
When users type text locally and then delete it, the deletion array contains many single-character entries instead of being optimized:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
delete
|
|
11
|
+
7 deletions [id:Alice:7 len:1, id:Alice:6 len:1, id:Alice:5 len:1, ...]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Expected:
|
|
15
|
+
```
|
|
16
|
+
delete
|
|
17
|
+
1 deletion [id:Alice:7 len:7] // or [id:Alice:1 len:7]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Why This Happens
|
|
21
|
+
|
|
22
|
+
1. **Local typing creates separate items:**
|
|
23
|
+
- User types "k" → `insert(rope, 0, 'k')` → Item with id "Alice:1", content "k"
|
|
24
|
+
- User types "k" → `insert(rope, 1, 'k')` → Item with id "Alice:2", content "k"
|
|
25
|
+
- ... (7 times total)
|
|
26
|
+
- Result: Rope has **7 separate items**, each with content "k"
|
|
27
|
+
|
|
28
|
+
2. **Coalescence happens at network layer only:**
|
|
29
|
+
- 7 InsertOp operations are merged into 1 operation with content "kkkkkkk"
|
|
30
|
+
- This merged operation is sent over the network
|
|
31
|
+
- **Local rope is NOT updated** with the coalesced operation
|
|
32
|
+
- Local rope still has 7 separate items
|
|
33
|
+
|
|
34
|
+
3. **Remote clients create efficient structure:**
|
|
35
|
+
- Remote client receives coalesced InsertOp: `{id: "Alice:1", content: "kkkkkkk", ...}`
|
|
36
|
+
- `apply()` creates **1 item** with content "kkkkkkk" and length 7
|
|
37
|
+
- Remote rope is more efficient than local!
|
|
38
|
+
|
|
39
|
+
4. **Deletion creates many entries:**
|
|
40
|
+
- User deletes 7 characters: `remove(rope, 0, 7)`
|
|
41
|
+
- Loop processes each of the 7 items individually
|
|
42
|
+
- Creates deletion array: `[{id: Alice:1, len:1}, {id: Alice:2, len:1}, ...]`
|
|
43
|
+
- 7 deletion entries instead of 1!
|
|
44
|
+
|
|
45
|
+
### Key Insight
|
|
46
|
+
|
|
47
|
+
**Local and remote ropes have different structures for the same text!**
|
|
48
|
+
- Local (who typed): 7 items with content "k" each
|
|
49
|
+
- Remote (who received): 1 item with content "kkkkkkk"
|
|
50
|
+
|
|
51
|
+
This asymmetry causes inefficient deletions on the local side.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Proposed Solutions
|
|
56
|
+
|
|
57
|
+
### Solution 1: Optimize remove() to merge consecutive deletions ⭐ RECOMMENDED FOR TEXT CRDT
|
|
58
|
+
|
|
59
|
+
**Approach:** Keep rope structure as-is (individual items), but make `remove()` smarter. When deleting consecutive items from the same agent with consecutive sequence numbers, merge them into a single deletion entry.
|
|
60
|
+
|
|
61
|
+
**Changes:** `src/crdt/Rope.ts` - `remove()` function
|
|
62
|
+
|
|
63
|
+
**Implementation:**
|
|
64
|
+
```typescript
|
|
65
|
+
export function remove(rope: TextRope, position: number, length: number): DeleteOp {
|
|
66
|
+
if (length === 0) return { deletions: [] };
|
|
67
|
+
|
|
68
|
+
const deletions: Array<{ id: ItemId; length: number }> = [];
|
|
69
|
+
let remaining = length;
|
|
70
|
+
|
|
71
|
+
while (remaining > 0) {
|
|
72
|
+
const result = findByVisiblePos(rope._tree, position);
|
|
73
|
+
if (!result) break;
|
|
74
|
+
|
|
75
|
+
let item = result.item as Item;
|
|
76
|
+
let ordinal = result.ordinal;
|
|
77
|
+
const charOffset = result.charOffset;
|
|
78
|
+
|
|
79
|
+
if (charOffset > 0) {
|
|
80
|
+
splitItem(rope, ordinal, charOffset);
|
|
81
|
+
ordinal++;
|
|
82
|
+
item = getAt(rope._tree, ordinal) as Item;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const toDelete = Math.min(remaining, item.content.length);
|
|
86
|
+
|
|
87
|
+
if (toDelete < item.content.length) {
|
|
88
|
+
splitItem(rope, ordinal, toDelete);
|
|
89
|
+
item = getAt(rope._tree, ordinal) as Item;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
item.isDeleted = true;
|
|
93
|
+
recalcCountsFor(rope._tree, item);
|
|
94
|
+
|
|
95
|
+
// NEW: Try to merge with previous deletion if consecutive
|
|
96
|
+
const lastDeletion = deletions[deletions.length - 1];
|
|
97
|
+
|
|
98
|
+
if (lastDeletion && canMergeDeletions(lastDeletion.id, lastDeletion.length, item.id)) {
|
|
99
|
+
// Merge: extend the previous deletion
|
|
100
|
+
lastDeletion.length += item.content.length;
|
|
101
|
+
} else {
|
|
102
|
+
// Cannot merge: add new deletion entry
|
|
103
|
+
deletions.push({ id: item.id, length: item.content.length });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
remaining -= toDelete;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { deletions };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function canMergeDeletions(lastId: ItemId, lastLength: number, currentId: ItemId): boolean {
|
|
113
|
+
const { agent: lastAgent, seq: lastSeq } = parseItemId(lastId);
|
|
114
|
+
const { agent: currentAgent, seq: currentSeq } = parseItemId(currentId);
|
|
115
|
+
|
|
116
|
+
// Can merge if: same agent AND last deletion ends where current starts
|
|
117
|
+
return lastAgent === currentAgent && lastSeq + lastLength === currentSeq;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Example:**
|
|
122
|
+
```
|
|
123
|
+
Before: deletions = [{id: Alice:1, len:1}, {id: Alice:2, len:1}, {id: Alice:3, len:1}]
|
|
124
|
+
After: deletions = [{id: Alice:1, len:3}]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Pros:**
|
|
128
|
+
- ✅ Simple, localized fix in one function
|
|
129
|
+
- ✅ No changes to rope structure or CRDT semantics
|
|
130
|
+
- ✅ Works for both local and remote deletions
|
|
131
|
+
- ✅ Safe - preserves YATA correctness
|
|
132
|
+
- ✅ Automatic - no changes needed elsewhere
|
|
133
|
+
|
|
134
|
+
**Cons:**
|
|
135
|
+
- ⚠️ Doesn't fix underlying asymmetry (local rope still has more items than remote)
|
|
136
|
+
- ⚠️ Only optimizes deletions, not the rope structure itself
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
### Solution 2: Optimize deletions in coalescence functions ⭐ RECOMMENDED FOR GRAPH CRDT
|
|
141
|
+
|
|
142
|
+
**Approach:** After merging delete operations, optimize the deletions array by merging consecutive entries.
|
|
143
|
+
|
|
144
|
+
**Changes:**
|
|
145
|
+
- `src/client/coalesceTextOperations.ts` - add optimization step
|
|
146
|
+
- `src/client/coalescence/textDeletes.ts` - add optimization step
|
|
147
|
+
- `src/client/coalesceGraphOps.ts` - add optimization for text.delete operations
|
|
148
|
+
|
|
149
|
+
**Implementation:**
|
|
150
|
+
```typescript
|
|
151
|
+
// New helper function
|
|
152
|
+
function optimizeDeletions(
|
|
153
|
+
deletions: Array<{ id: ItemId; length: number }>
|
|
154
|
+
): Array<{ id: ItemId; length: number }> {
|
|
155
|
+
if (deletions.length === 0) return deletions;
|
|
156
|
+
|
|
157
|
+
const result: Array<{ id: ItemId; length: number }> = [];
|
|
158
|
+
let current = { ...deletions[0] };
|
|
159
|
+
|
|
160
|
+
for (let i = 1; i < deletions.length; i++) {
|
|
161
|
+
const deletion = deletions[i];
|
|
162
|
+
const { agent: currAgent, seq: currSeq } = parseItemId(current.id);
|
|
163
|
+
const { agent: delAgent, seq: delSeq } = parseItemId(deletion.id);
|
|
164
|
+
|
|
165
|
+
// Can merge if same agent and consecutive sequence numbers
|
|
166
|
+
if (currAgent === delAgent && currSeq + current.length === delSeq) {
|
|
167
|
+
current.length += deletion.length;
|
|
168
|
+
} else {
|
|
169
|
+
result.push(current);
|
|
170
|
+
current = { ...deletion };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
result.push(current);
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// In coalesceTextDeletes:
|
|
179
|
+
export function coalesceTextDeletes(
|
|
180
|
+
ops: TextDeleteOp[],
|
|
181
|
+
options: CoalesceOptions = {}
|
|
182
|
+
): TextDeleteOp[] {
|
|
183
|
+
// ... existing code to merge operations ...
|
|
184
|
+
|
|
185
|
+
if (pending !== null) {
|
|
186
|
+
// NEW: Optimize deletions array before returning
|
|
187
|
+
pending.deletions = optimizeDeletions(pending.deletions);
|
|
188
|
+
result.push(pending);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Example:**
|
|
196
|
+
```
|
|
197
|
+
Before coalescence:
|
|
198
|
+
Op1: deletions = [{id: Alice:1, len:1}]
|
|
199
|
+
Op2: deletions = [{id: Alice:2, len:1}]
|
|
200
|
+
Op3: deletions = [{id: Alice:3, len:1}]
|
|
201
|
+
|
|
202
|
+
After merging ops:
|
|
203
|
+
Op: deletions = [{id: Alice:1, len:1}, {id: Alice:2, len:1}, {id: Alice:3, len:1}]
|
|
204
|
+
|
|
205
|
+
After optimizing deletions:
|
|
206
|
+
Op: deletions = [{id: Alice:1, len:3}]
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Pros:**
|
|
210
|
+
- ✅ Optimizes deletions at the operation level
|
|
211
|
+
- ✅ Works with existing coalescence infrastructure
|
|
212
|
+
- ✅ Complements Solution 1 (can use both)
|
|
213
|
+
- ✅ Handles both text CRDT and graph CRDT
|
|
214
|
+
|
|
215
|
+
**Cons:**
|
|
216
|
+
- ⚠️ Need to call optimization in multiple places
|
|
217
|
+
- ⚠️ Still doesn't fix the asymmetry
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
### Solution 3: Apply coalesced operations to local rope ⛔ NOT RECOMMENDED
|
|
222
|
+
|
|
223
|
+
**Approach:** After coalescence, apply the coalesced operation to the local rope, replacing the individual items.
|
|
224
|
+
|
|
225
|
+
**Why NOT recommended:**
|
|
226
|
+
- ❌ Very complex - need to track which operations have been applied
|
|
227
|
+
- ❌ Changes semantics of local edits (modifying history)
|
|
228
|
+
- ❌ Could break cursor tracking and undo/redo
|
|
229
|
+
- ❌ Risky - affects core CRDT operations
|
|
230
|
+
- ❌ May violate YATA ordering guarantees
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
### Solution 4: Merge consecutive items in the rope ⛔ NOT RECOMMENDED
|
|
235
|
+
|
|
236
|
+
**Approach:** After applying operations, detect and merge consecutive items from the same agent.
|
|
237
|
+
|
|
238
|
+
**Why NOT recommended:**
|
|
239
|
+
- ❌ Very complex - need to update B-tree, indices, ordinals
|
|
240
|
+
- ❌ Could break YATA ordering if not done carefully
|
|
241
|
+
- ❌ Might interfere with concurrent operations
|
|
242
|
+
- ❌ Changes item IDs, which could break references
|
|
243
|
+
- ❌ High risk, low reward
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Recommended Approach: HYBRID (Solutions 1 + 2) ⭐
|
|
248
|
+
|
|
249
|
+
Implement **both** Solution 1 and Solution 2 for comprehensive optimization:
|
|
250
|
+
|
|
251
|
+
### Part A: Text CRDT Level (Solution 1)
|
|
252
|
+
- Optimize `remove()` in `src/crdt/Rope.ts`
|
|
253
|
+
- Merges consecutive deletions when deleting from the rope
|
|
254
|
+
- Benefits: All deletions from rope are automatically optimized
|
|
255
|
+
|
|
256
|
+
### Part B: Graph CRDT Level (Solution 2)
|
|
257
|
+
- Add `optimizeDeletions()` helper function
|
|
258
|
+
- Call it in `coalesceTextDeletes()` after merging operations
|
|
259
|
+
- Call it in `coalesceGraphOps()` for text.delete operations
|
|
260
|
+
- Benefits: Deletions are optimized even when merging operations
|
|
261
|
+
|
|
262
|
+
### Why Hybrid?
|
|
263
|
+
|
|
264
|
+
1. **Comprehensive:** Optimizes at all levels
|
|
265
|
+
- Rope level (Part A): Direct deletions always optimized
|
|
266
|
+
- Coalescence level (Part B): Merged operations also optimized
|
|
267
|
+
|
|
268
|
+
2. **Safe:** No changes to rope structure or CRDT semantics
|
|
269
|
+
- Items remain separate (preserves YATA correctness)
|
|
270
|
+
- Only optimization is in the deletions array
|
|
271
|
+
|
|
272
|
+
3. **Effective:** Reduces deletion arrays significantly
|
|
273
|
+
- O(n) deletions → O(agents) in best case
|
|
274
|
+
- Example: 7 single-char deletions → 1 deletion with len:7
|
|
275
|
+
|
|
276
|
+
4. **Maintainable:** Localized changes
|
|
277
|
+
- One helper function: `optimizeDeletions()`
|
|
278
|
+
- Three call sites: `remove()`, `coalesceTextDeletes()`, `coalesceGraphOps()`
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Implementation Plan
|
|
283
|
+
|
|
284
|
+
### Phase 1: Text CRDT (Rope.ts)
|
|
285
|
+
1. Add `canMergeDeletions()` helper function
|
|
286
|
+
2. Modify `remove()` to merge consecutive deletions
|
|
287
|
+
3. Add tests in `delete-coalescence-bug.test.ts`
|
|
288
|
+
4. Verify all existing tests still pass
|
|
289
|
+
|
|
290
|
+
### Phase 2: Graph CRDT (coalesceGraphOps.ts)
|
|
291
|
+
1. Add `optimizeDeletions()` helper function to `src/client/coalescence/utils.ts`
|
|
292
|
+
2. Import and use in `coalesceTextDeletes()` in `src/client/coalescence/textDeletes.ts`
|
|
293
|
+
3. Import and use in `coalesceGraphOps()` for text.delete operations
|
|
294
|
+
4. Add tests in `coalesce-graph-operations.test.ts`
|
|
295
|
+
5. Verify all existing tests still pass
|
|
296
|
+
|
|
297
|
+
### Phase 3: Testing & Validation
|
|
298
|
+
1. Run full test suite: `pnpm test`
|
|
299
|
+
2. Test in demo: verify deletion arrays are optimized
|
|
300
|
+
3. Export debug data and verify deletions have merged IDs
|
|
301
|
+
4. Performance test: ensure no regression
|
|
302
|
+
|
|
303
|
+
### Phase 4: Documentation & Release
|
|
304
|
+
1. Update release notes
|
|
305
|
+
2. Bump version to 0.5.2
|
|
306
|
+
3. Publish to npm
|
|
307
|
+
4. Deploy docs
|
|
308
|
+
5. Create release documentation
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Expected Results
|
|
313
|
+
|
|
314
|
+
### Before Fix
|
|
315
|
+
```
|
|
316
|
+
// User types "kkkkkkk" (7 chars) and deletes
|
|
317
|
+
delete
|
|
318
|
+
7 deletions [id:Alice:1 len:1, id:Alice:2 len:1, id:Alice:3 len:1,
|
|
319
|
+
id:Alice:4 len:1, id:Alice:5 len:1, id:Alice:6 len:1,
|
|
320
|
+
id:Alice:7 len:1]
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### After Fix
|
|
324
|
+
```
|
|
325
|
+
// User types "kkkkkkk" (7 chars) and deletes
|
|
326
|
+
delete
|
|
327
|
+
1 deletion [id:Alice:1 len:7]
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Network Savings
|
|
331
|
+
- **Before:** 7 deletion entries × ~30 bytes each = ~210 bytes
|
|
332
|
+
- **After:** 1 deletion entry × ~30 bytes = ~30 bytes
|
|
333
|
+
- **Reduction:** 85% smaller deletion array
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Conclusion
|
|
338
|
+
|
|
339
|
+
The **Hybrid approach (Solutions 1 + 2)** provides the best balance of:
|
|
340
|
+
- ✅ Effectiveness (optimizes deletions at multiple levels)
|
|
341
|
+
- ✅ Safety (no changes to CRDT semantics)
|
|
342
|
+
- ✅ Simplicity (localized changes, easy to understand)
|
|
343
|
+
- ✅ Maintainability (small helper functions, clear logic)
|
|
344
|
+
|
|
345
|
+
This approach fixes the immediate problem (inefficient deletions) without introducing the complexity and risk of restructuring the rope itself.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textDeletes.d.ts","sourceRoot":"","sources":["../../../src/client/coalescence/textDeletes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"textDeletes.d.ts","sourceRoot":"","sources":["../../../src/client/coalescence/textDeletes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,EAAE,IAAI,YAAY,CAOhE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,YAAY,EAAE,EACnB,OAAO,GAAE,eAAoB,GAC5B,YAAY,EAAE,CAoDhB"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Merges consecutive text delete operations.
|
|
5
5
|
*/
|
|
6
|
+
import { optimizeDeletions } from './utils.js';
|
|
6
7
|
/**
|
|
7
8
|
* Check if an operation is a text delete with CRDT metadata
|
|
8
9
|
*/
|
|
@@ -61,8 +62,14 @@ export function coalesceTextDeletes(ops, options = {}) {
|
|
|
61
62
|
}
|
|
62
63
|
// Flush any remaining pending delete
|
|
63
64
|
if (pending !== null) {
|
|
65
|
+
// Optimize deletions array before pushing
|
|
66
|
+
pending.deletions = optimizeDeletions(pending.deletions);
|
|
64
67
|
result.push(pending);
|
|
65
68
|
}
|
|
69
|
+
// Also optimize deletions in all previously pushed operations
|
|
70
|
+
for (const op of result) {
|
|
71
|
+
op.deletions = optimizeDeletions(op.deletions);
|
|
72
|
+
}
|
|
66
73
|
return result;
|
|
67
74
|
}
|
|
68
75
|
//# sourceMappingURL=textDeletes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textDeletes.js","sourceRoot":"","sources":["../../../src/client/coalescence/textDeletes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"textDeletes.js","sourceRoot":"","sources":["../../../src/client/coalescence/textDeletes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgB/C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAa;IAC1C,OAAO,CACL,EAAE,CAAC,KAAK,KAAK,aAAa;QAC1B,KAAK,CAAC,OAAO,CAAE,EAAU,CAAC,SAAS,CAAC;QACpC,OAAQ,EAAU,CAAC,GAAG,KAAK,QAAQ;QACnC,OAAQ,EAAU,CAAC,EAAE,KAAK,QAAQ,CACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAmB,EACnB,UAA2B,EAAE;IAE7B,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAEjC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAwB,IAAI,CAAC;IAExC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,2BAA2B;YAC3B,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC;YAEtE,sEAAsE;YACtE,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YAC/C,MAAM,eAAe,GAAG,UAAU,IAAI,WAAW,CAAC;YAElD,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;gBAClC,4CAA4C;gBAC5C,MAAM,MAAM,GAAiB;oBAC3B,KAAK,EAAE,aAAa;oBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;oBAClD,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,qCAAqC;oBACzE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,+CAA+C;iBAChE,CAAC;gBACF,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,4CAA4C;gBAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,0CAA0C;QAC1C,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,8DAA8D;IAC9D,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for operation coalescence
|
|
3
|
+
*/
|
|
4
|
+
import type { ItemId } from '../../crdt/Rope.js';
|
|
5
|
+
/**
|
|
6
|
+
* Parse an ItemId into agent and sequence number.
|
|
7
|
+
* ItemId format: "agent:seq" (e.g., "alice:42")
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseItemId(id: ItemId): {
|
|
10
|
+
agent: string;
|
|
11
|
+
seq: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Optimize a deletions array by merging consecutive deletions from the same agent.
|
|
15
|
+
*
|
|
16
|
+
* Example:
|
|
17
|
+
* Input: [{id: "alice:1", length: 1}, {id: "alice:2", length: 1}, {id: "alice:3", length: 1}]
|
|
18
|
+
* Output: [{id: "alice:1", length: 3}]
|
|
19
|
+
*
|
|
20
|
+
* This reduces the size of deletion arrays when consecutive items are deleted.
|
|
21
|
+
*/
|
|
22
|
+
export declare function optimizeDeletions(deletions: Array<{
|
|
23
|
+
id: ItemId;
|
|
24
|
+
length: number;
|
|
25
|
+
}>): Array<{
|
|
26
|
+
id: ItemId;
|
|
27
|
+
length: number;
|
|
28
|
+
}>;
|
|
29
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/client/coalescence/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAStE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BvC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for operation coalescence
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse an ItemId into agent and sequence number.
|
|
6
|
+
* ItemId format: "agent:seq" (e.g., "alice:42")
|
|
7
|
+
*/
|
|
8
|
+
export function parseItemId(id) {
|
|
9
|
+
const colonIndex = id.lastIndexOf(':');
|
|
10
|
+
if (colonIndex === -1) {
|
|
11
|
+
// Fallback for invalid format
|
|
12
|
+
return { agent: id, seq: 0 };
|
|
13
|
+
}
|
|
14
|
+
const agent = id.substring(0, colonIndex);
|
|
15
|
+
const seq = parseInt(id.substring(colonIndex + 1), 10);
|
|
16
|
+
return { agent, seq: isNaN(seq) ? 0 : seq };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Optimize a deletions array by merging consecutive deletions from the same agent.
|
|
20
|
+
*
|
|
21
|
+
* Example:
|
|
22
|
+
* Input: [{id: "alice:1", length: 1}, {id: "alice:2", length: 1}, {id: "alice:3", length: 1}]
|
|
23
|
+
* Output: [{id: "alice:1", length: 3}]
|
|
24
|
+
*
|
|
25
|
+
* This reduces the size of deletion arrays when consecutive items are deleted.
|
|
26
|
+
*/
|
|
27
|
+
export function optimizeDeletions(deletions) {
|
|
28
|
+
if (deletions.length === 0)
|
|
29
|
+
return deletions;
|
|
30
|
+
const result = [];
|
|
31
|
+
let current = { ...deletions[0] };
|
|
32
|
+
for (let i = 1; i < deletions.length; i++) {
|
|
33
|
+
const deletion = deletions[i];
|
|
34
|
+
const currParsed = parseItemId(current.id);
|
|
35
|
+
const delParsed = parseItemId(deletion.id);
|
|
36
|
+
// Can merge if: same agent AND current deletion ends where next starts
|
|
37
|
+
if (currParsed.agent === delParsed.agent &&
|
|
38
|
+
currParsed.seq + current.length === delParsed.seq) {
|
|
39
|
+
// Merge: extend current deletion
|
|
40
|
+
current.length += deletion.length;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Cannot merge: push current and start new
|
|
44
|
+
result.push(current);
|
|
45
|
+
current = { ...deletion };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Push final deletion
|
|
49
|
+
result.push(current);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/client/coalescence/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,8BAA8B;QAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAgD;IAEhD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,IAAI,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE3C,uEAAuE;QACvE,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;YACpC,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;YACtD,iCAAiC;YACjC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/crdt/Rope.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rope.d.ts","sourceRoot":"","sources":["../../src/crdt/Rope.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Rope.d.ts","sourceRoot":"","sources":["../../src/crdt/Rope.ts"],"names":[],"mappings":"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"}
|
package/dist/crdt/Rope.js
CHANGED
|
@@ -437,6 +437,18 @@ export function apply(rope, op) {
|
|
|
437
437
|
// ============================================
|
|
438
438
|
// Operations — Delete
|
|
439
439
|
// ============================================
|
|
440
|
+
/**
|
|
441
|
+
* Check if two deletions can be merged into one.
|
|
442
|
+
* Deletions can be merged if they are from the same agent and the first
|
|
443
|
+
* deletion ends exactly where the second one starts (consecutive sequence numbers).
|
|
444
|
+
*/
|
|
445
|
+
function canMergeDeletions(lastId, lastLength, currentId) {
|
|
446
|
+
const lastParsed = parseItemId(lastId);
|
|
447
|
+
const currentParsed = parseItemId(currentId);
|
|
448
|
+
// Can merge if: same agent AND last deletion ends where current starts
|
|
449
|
+
return lastParsed.agent === currentParsed.agent &&
|
|
450
|
+
lastParsed.seq + lastLength === currentParsed.seq;
|
|
451
|
+
}
|
|
440
452
|
export function remove(rope, position, length) {
|
|
441
453
|
if (length === 0)
|
|
442
454
|
return { deletions: [] };
|
|
@@ -464,7 +476,16 @@ export function remove(rope, position, length) {
|
|
|
464
476
|
// Delete the item
|
|
465
477
|
item.isDeleted = true;
|
|
466
478
|
recalcCountsFor(rope._tree, item);
|
|
467
|
-
|
|
479
|
+
// Try to merge with previous deletion if consecutive
|
|
480
|
+
const lastDeletion = deletions[deletions.length - 1];
|
|
481
|
+
if (lastDeletion && canMergeDeletions(lastDeletion.id, lastDeletion.length, item.id)) {
|
|
482
|
+
// Merge: extend the previous deletion
|
|
483
|
+
lastDeletion.length += item.content.length;
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
// Cannot merge: add new deletion entry
|
|
487
|
+
deletions.push({ id: item.id, length: item.content.length });
|
|
488
|
+
}
|
|
468
489
|
remaining -= toDelete;
|
|
469
490
|
}
|
|
470
491
|
return { deletions };
|
package/dist/crdt/Rope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rope.js","sourceRoot":"","sources":["../../src/crdt/Rope.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Rope.js","sourceRoot":"","sources":["../../src/crdt/Rope.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { Operation } from '../../operations/OperationTypes.js';
|
|
8
|
+
import { optimizeDeletions } from './utils.js';
|
|
8
9
|
|
|
9
10
|
export interface TextDeleteOp {
|
|
10
11
|
otype: 'text.delete';
|
|
@@ -87,8 +88,15 @@ export function coalesceTextDeletes(
|
|
|
87
88
|
|
|
88
89
|
// Flush any remaining pending delete
|
|
89
90
|
if (pending !== null) {
|
|
91
|
+
// Optimize deletions array before pushing
|
|
92
|
+
pending.deletions = optimizeDeletions(pending.deletions);
|
|
90
93
|
result.push(pending);
|
|
91
94
|
}
|
|
92
95
|
|
|
96
|
+
// Also optimize deletions in all previously pushed operations
|
|
97
|
+
for (const op of result) {
|
|
98
|
+
op.deletions = optimizeDeletions(op.deletions);
|
|
99
|
+
}
|
|
100
|
+
|
|
93
101
|
return result;
|
|
94
102
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for operation coalescence
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ItemId } from '../../crdt/Rope.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Parse an ItemId into agent and sequence number.
|
|
9
|
+
* ItemId format: "agent:seq" (e.g., "alice:42")
|
|
10
|
+
*/
|
|
11
|
+
export function parseItemId(id: ItemId): { agent: string; seq: number } {
|
|
12
|
+
const colonIndex = id.lastIndexOf(':');
|
|
13
|
+
if (colonIndex === -1) {
|
|
14
|
+
// Fallback for invalid format
|
|
15
|
+
return { agent: id, seq: 0 };
|
|
16
|
+
}
|
|
17
|
+
const agent = id.substring(0, colonIndex);
|
|
18
|
+
const seq = parseInt(id.substring(colonIndex + 1), 10);
|
|
19
|
+
return { agent, seq: isNaN(seq) ? 0 : seq };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Optimize a deletions array by merging consecutive deletions from the same agent.
|
|
24
|
+
*
|
|
25
|
+
* Example:
|
|
26
|
+
* Input: [{id: "alice:1", length: 1}, {id: "alice:2", length: 1}, {id: "alice:3", length: 1}]
|
|
27
|
+
* Output: [{id: "alice:1", length: 3}]
|
|
28
|
+
*
|
|
29
|
+
* This reduces the size of deletion arrays when consecutive items are deleted.
|
|
30
|
+
*/
|
|
31
|
+
export function optimizeDeletions(
|
|
32
|
+
deletions: Array<{ id: ItemId; length: number }>
|
|
33
|
+
): Array<{ id: ItemId; length: number }> {
|
|
34
|
+
if (deletions.length === 0) return deletions;
|
|
35
|
+
|
|
36
|
+
const result: Array<{ id: ItemId; length: number }> = [];
|
|
37
|
+
let current = { ...deletions[0] };
|
|
38
|
+
|
|
39
|
+
for (let i = 1; i < deletions.length; i++) {
|
|
40
|
+
const deletion = deletions[i];
|
|
41
|
+
const currParsed = parseItemId(current.id);
|
|
42
|
+
const delParsed = parseItemId(deletion.id);
|
|
43
|
+
|
|
44
|
+
// Can merge if: same agent AND current deletion ends where next starts
|
|
45
|
+
if (currParsed.agent === delParsed.agent &&
|
|
46
|
+
currParsed.seq + current.length === delParsed.seq) {
|
|
47
|
+
// Merge: extend current deletion
|
|
48
|
+
current.length += deletion.length;
|
|
49
|
+
} else {
|
|
50
|
+
// Cannot merge: push current and start new
|
|
51
|
+
result.push(current);
|
|
52
|
+
current = { ...deletion };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Push final deletion
|
|
57
|
+
result.push(current);
|
|
58
|
+
|
|
59
|
+
return result;
|
|
60
|
+
}
|
package/src/crdt/Rope.ts
CHANGED
|
@@ -533,6 +533,20 @@ export function apply(rope: TextRope, op: InsertOp): void {
|
|
|
533
533
|
// Operations — Delete
|
|
534
534
|
// ============================================
|
|
535
535
|
|
|
536
|
+
/**
|
|
537
|
+
* Check if two deletions can be merged into one.
|
|
538
|
+
* Deletions can be merged if they are from the same agent and the first
|
|
539
|
+
* deletion ends exactly where the second one starts (consecutive sequence numbers).
|
|
540
|
+
*/
|
|
541
|
+
function canMergeDeletions(lastId: ItemId, lastLength: number, currentId: ItemId): boolean {
|
|
542
|
+
const lastParsed = parseItemId(lastId);
|
|
543
|
+
const currentParsed = parseItemId(currentId);
|
|
544
|
+
|
|
545
|
+
// Can merge if: same agent AND last deletion ends where current starts
|
|
546
|
+
return lastParsed.agent === currentParsed.agent &&
|
|
547
|
+
lastParsed.seq + lastLength === currentParsed.seq;
|
|
548
|
+
}
|
|
549
|
+
|
|
536
550
|
export function remove(rope: TextRope, position: number, length: number): DeleteOp {
|
|
537
551
|
if (length === 0) return { deletions: [] };
|
|
538
552
|
|
|
@@ -565,7 +579,17 @@ export function remove(rope: TextRope, position: number, length: number): Delete
|
|
|
565
579
|
// Delete the item
|
|
566
580
|
item.isDeleted = true;
|
|
567
581
|
recalcCountsFor(rope._tree, item);
|
|
568
|
-
|
|
582
|
+
|
|
583
|
+
// Try to merge with previous deletion if consecutive
|
|
584
|
+
const lastDeletion = deletions[deletions.length - 1];
|
|
585
|
+
if (lastDeletion && canMergeDeletions(lastDeletion.id, lastDeletion.length, item.id)) {
|
|
586
|
+
// Merge: extend the previous deletion
|
|
587
|
+
lastDeletion.length += item.content.length;
|
|
588
|
+
} else {
|
|
589
|
+
// Cannot merge: add new deletion entry
|
|
590
|
+
deletions.push({ id: item.id, length: item.content.length });
|
|
591
|
+
}
|
|
592
|
+
|
|
569
593
|
remaining -= toDelete;
|
|
570
594
|
}
|
|
571
595
|
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests demonstrating the delete coalescence bug
|
|
3
|
+
*
|
|
4
|
+
* BUG: When user types quickly and then deletes, the deletion array contains
|
|
5
|
+
* many single-character deletions instead of being optimized.
|
|
6
|
+
*
|
|
7
|
+
* ROOT CAUSE: Local typing creates separate items in the rope. Insert coalescence
|
|
8
|
+
* merges operations for network transmission but doesn't update the local rope.
|
|
9
|
+
* When deleting, remove() iterates through many items and creates many deletion entries.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, it, expect } from '@jest/globals';
|
|
13
|
+
import { create, insert, remove, apply, toJSON } from '../../src/crdt/Rope.js';
|
|
14
|
+
import type { InsertOp } from '../../src/crdt/Rope.js';
|
|
15
|
+
import { coalesceTextOperations } from '../../src/client/coalesceTextOperations.js';
|
|
16
|
+
import type { TextOperation } from '../../src/client/textTypes.js';
|
|
17
|
+
|
|
18
|
+
describe('Delete Coalescence Bug', () => {
|
|
19
|
+
describe('Local typing creates many items', () => {
|
|
20
|
+
it('should merge consecutive single-char deletions into one deletion', () => {
|
|
21
|
+
const rope = create('alice');
|
|
22
|
+
|
|
23
|
+
// Simulate typing "Hello" one char at a time
|
|
24
|
+
insert(rope, 0, 'H');
|
|
25
|
+
insert(rope, 1, 'e');
|
|
26
|
+
insert(rope, 2, 'l');
|
|
27
|
+
insert(rope, 3, 'l');
|
|
28
|
+
insert(rope, 4, 'o');
|
|
29
|
+
|
|
30
|
+
// Verify text is correct
|
|
31
|
+
expect(rope.toString()).toBe('Hello');
|
|
32
|
+
|
|
33
|
+
// Now delete all 5 characters
|
|
34
|
+
const deleteOp = remove(rope, 0, 5);
|
|
35
|
+
|
|
36
|
+
// FIXED: Now we get 1 deletion with length 5 instead of 5 separate deletions!
|
|
37
|
+
expect(deleteOp.deletions).toHaveLength(1);
|
|
38
|
+
expect(deleteOp.deletions[0].length).toBe(5);
|
|
39
|
+
expect(deleteOp.deletions[0].id).toMatch(/alice:\d+/);
|
|
40
|
+
|
|
41
|
+
// This is efficient - we're sending 1 deletion entry instead of 5
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should show that individual delete operations each have optimized deletions', () => {
|
|
45
|
+
const rope = create('alice');
|
|
46
|
+
|
|
47
|
+
// Type "Hello"
|
|
48
|
+
insert(rope, 0, 'H');
|
|
49
|
+
insert(rope, 1, 'e');
|
|
50
|
+
insert(rope, 2, 'l');
|
|
51
|
+
insert(rope, 3, 'l');
|
|
52
|
+
insert(rope, 4, 'o');
|
|
53
|
+
|
|
54
|
+
// Press backspace 5 times rapidly
|
|
55
|
+
const delete1 = remove(rope, 4, 1); // Delete 'o'
|
|
56
|
+
const delete2 = remove(rope, 3, 1); // Delete 'l'
|
|
57
|
+
const delete3 = remove(rope, 2, 1); // Delete 'l'
|
|
58
|
+
const delete4 = remove(rope, 1, 1); // Delete 'e'
|
|
59
|
+
const delete5 = remove(rope, 0, 1); // Delete 'H'
|
|
60
|
+
|
|
61
|
+
// Each delete creates 1 deletion entry (expected - only deleting 1 char each time)
|
|
62
|
+
expect(delete1.deletions).toHaveLength(1);
|
|
63
|
+
expect(delete2.deletions).toHaveLength(1);
|
|
64
|
+
expect(delete3.deletions).toHaveLength(1);
|
|
65
|
+
expect(delete4.deletions).toHaveLength(1);
|
|
66
|
+
expect(delete5.deletions).toHaveLength(1);
|
|
67
|
+
|
|
68
|
+
// Note: These are 5 separate delete OPERATIONS, each with 1 deletion
|
|
69
|
+
// Operation-level coalescence (in coalesceTextOperations) will merge these
|
|
70
|
+
// 5 operations into 1 operation with 5 deletions, then optimizeDeletions()
|
|
71
|
+
// will merge those 5 deletions into 1 deletion
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('Remote coalesced operations create efficient items', () => {
|
|
76
|
+
it('should show that applying coalesced InsertOp creates 1 item', () => {
|
|
77
|
+
const rope = create('bob');
|
|
78
|
+
|
|
79
|
+
// Simulate receiving a coalesced operation from Alice
|
|
80
|
+
const coalescedOp: InsertOp = {
|
|
81
|
+
id: 'alice:1',
|
|
82
|
+
content: 'Hello',
|
|
83
|
+
parentId: null,
|
|
84
|
+
seq: 1,
|
|
85
|
+
ts: 1000.0,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
apply(rope, coalescedOp);
|
|
89
|
+
|
|
90
|
+
expect(rope.toString()).toBe('Hello');
|
|
91
|
+
|
|
92
|
+
// Now delete all 5 characters
|
|
93
|
+
const deleteOp = remove(rope, 0, 5);
|
|
94
|
+
|
|
95
|
+
// GOOD: Only 1 deletion with length 5 (because it's a single item)
|
|
96
|
+
expect(deleteOp.deletions).toHaveLength(1);
|
|
97
|
+
expect(deleteOp.deletions[0].id).toBe('alice:1');
|
|
98
|
+
expect(deleteOp.deletions[0].length).toBe(5);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe('Coalescence works at network layer, deletions optimized at rope layer', () => {
|
|
103
|
+
it('should show that remove() optimizes deletions even though rope has separate items', () => {
|
|
104
|
+
const rope = create('alice');
|
|
105
|
+
const ops: InsertOp[] = [];
|
|
106
|
+
|
|
107
|
+
// Type "Hello" and collect operations
|
|
108
|
+
ops.push(insert(rope, 0, 'H'));
|
|
109
|
+
ops.push(insert(rope, 1, 'e'));
|
|
110
|
+
ops.push(insert(rope, 2, 'l'));
|
|
111
|
+
ops.push(insert(rope, 3, 'l'));
|
|
112
|
+
ops.push(insert(rope, 4, 'o'));
|
|
113
|
+
|
|
114
|
+
// Coalesce operations for network transmission
|
|
115
|
+
const textOps: TextOperation[] = ops.map(op => ({ type: 'insert', op }));
|
|
116
|
+
const coalesced = coalesceTextOperations(textOps, { thresholdMs: 1000 });
|
|
117
|
+
|
|
118
|
+
// Coalescence merged 5 ops into 1 op
|
|
119
|
+
expect(coalesced).toHaveLength(1);
|
|
120
|
+
expect((coalesced[0] as any).op.content).toBe('Hello');
|
|
121
|
+
|
|
122
|
+
// The local rope still has 5 separate items (coalescence doesn't modify the rope)
|
|
123
|
+
// BUT remove() now optimizes the deletions array!
|
|
124
|
+
const deleteOp = remove(rope, 0, 5);
|
|
125
|
+
expect(deleteOp.deletions).toHaveLength(1); // FIXED: 1 deletion instead of 5!
|
|
126
|
+
expect(deleteOp.deletions[0].length).toBe(5);
|
|
127
|
+
|
|
128
|
+
// This is the fix: even though rope has 5 items, remove() merges consecutive
|
|
129
|
+
// deletions from the same agent into a single deletion entry
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe('Verified correct behavior after fix', () => {
|
|
134
|
+
it('should merge consecutive deletions from same agent', () => {
|
|
135
|
+
const rope = create('alice');
|
|
136
|
+
|
|
137
|
+
// Type "Hello" - creates alice:0, alice:1, alice:2, alice:3, alice:4
|
|
138
|
+
insert(rope, 0, 'H');
|
|
139
|
+
insert(rope, 1, 'e');
|
|
140
|
+
insert(rope, 2, 'l');
|
|
141
|
+
insert(rope, 3, 'l');
|
|
142
|
+
insert(rope, 4, 'o');
|
|
143
|
+
|
|
144
|
+
// Delete all 5 characters
|
|
145
|
+
const deleteOp = remove(rope, 0, 5);
|
|
146
|
+
|
|
147
|
+
// FIXED: deletions = [{id: alice:0, len:5}] (merged consecutive IDs)
|
|
148
|
+
expect(deleteOp.deletions).toHaveLength(1);
|
|
149
|
+
expect(deleteOp.deletions[0].length).toBe(5);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('should handle mixed local and remote items correctly', () => {
|
|
153
|
+
const rope = create('alice');
|
|
154
|
+
|
|
155
|
+
// Alice types "Hi"
|
|
156
|
+
insert(rope, 0, 'H');
|
|
157
|
+
insert(rope, 1, 'i');
|
|
158
|
+
|
|
159
|
+
// Bob types "ey" (received as coalesced op)
|
|
160
|
+
const bobOp: InsertOp = {
|
|
161
|
+
id: 'bob:1',
|
|
162
|
+
content: 'ey',
|
|
163
|
+
parentId: 'alice:1',
|
|
164
|
+
seq: 3,
|
|
165
|
+
ts: 1000.0,
|
|
166
|
+
};
|
|
167
|
+
apply(rope, bobOp);
|
|
168
|
+
|
|
169
|
+
// YATA ordering determines final text (could be "Hiey" or "eyHi" depending on timestamps)
|
|
170
|
+
const text = rope.toString();
|
|
171
|
+
expect(text.length).toBe(4);
|
|
172
|
+
expect(text).toContain('Hi');
|
|
173
|
+
expect(text).toContain('ey');
|
|
174
|
+
|
|
175
|
+
// Alice deletes all 4 characters
|
|
176
|
+
const deleteOp = remove(rope, 0, 4);
|
|
177
|
+
|
|
178
|
+
// FIXED: 2 deletions (can't merge across agents, but alice's chars are merged)
|
|
179
|
+
// - alice:0-1 merged → 1 deletion with length 2
|
|
180
|
+
// - bob:1 → 1 deletion with length 2
|
|
181
|
+
expect(deleteOp.deletions).toHaveLength(2);
|
|
182
|
+
|
|
183
|
+
// Both deletions should be multi-char
|
|
184
|
+
expect(deleteOp.deletions[0].length).toBe(2);
|
|
185
|
+
expect(deleteOp.deletions[1].length).toBe(2);
|
|
186
|
+
|
|
187
|
+
// One from alice, one from bob
|
|
188
|
+
const agents = deleteOp.deletions.map(d => d.id.split(':')[0]);
|
|
189
|
+
expect(agents).toContain('alice');
|
|
190
|
+
expect(agents).toContain('bob');
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe('Real-world scenario from bug report', () => {
|
|
195
|
+
it('should fix the "kkkkkkk" deletion bug', () => {
|
|
196
|
+
const rope = create('Alice');
|
|
197
|
+
|
|
198
|
+
// User types "kkkkkkk" quickly (7 characters)
|
|
199
|
+
for (let i = 0; i < 7; i++) {
|
|
200
|
+
insert(rope, i, 'k');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
expect(rope.toString()).toBe('kkkkkkk');
|
|
204
|
+
|
|
205
|
+
// User selects all and deletes
|
|
206
|
+
const deleteOp = remove(rope, 0, 7);
|
|
207
|
+
|
|
208
|
+
// FIXED: Creates 1 deletion entry with length 7
|
|
209
|
+
expect(deleteOp.deletions).toHaveLength(1);
|
|
210
|
+
expect(deleteOp.deletions[0].length).toBe(7);
|
|
211
|
+
expect(deleteOp.deletions[0].id).toMatch(/Alice:\d+/);
|
|
212
|
+
|
|
213
|
+
// This is now efficient - 1 deletion entry instead of 7
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('should show delete operation coalescence creates efficient operations', () => {
|
|
217
|
+
const rope = create('Alice');
|
|
218
|
+
|
|
219
|
+
// Type "kkkkkkk"
|
|
220
|
+
for (let i = 0; i < 7; i++) {
|
|
221
|
+
insert(rope, i, 'k');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Press backspace 7 times rapidly
|
|
225
|
+
const deleteOps: TextOperation[] = [];
|
|
226
|
+
for (let i = 6; i >= 0; i--) {
|
|
227
|
+
const op = remove(rope, i, 1);
|
|
228
|
+
deleteOps.push({ type: 'delete', op });
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Coalesce delete operations
|
|
232
|
+
const coalesced = coalesceTextOperations(deleteOps, { thresholdMs: 1000 });
|
|
233
|
+
|
|
234
|
+
// Operation-level coalescence works: 7 ops → 1 op
|
|
235
|
+
expect(coalesced).toHaveLength(1);
|
|
236
|
+
expect(coalesced[0].type).toBe('delete');
|
|
237
|
+
|
|
238
|
+
// The deletions array should already be efficient from remove() optimization
|
|
239
|
+
// Each individual remove() creates 1 deletion (only deleting 1 char)
|
|
240
|
+
// When coalesceTextOperations merges the 7 ops, it combines the deletions arrays
|
|
241
|
+
const coalescedOp = (coalesced[0] as any).op;
|
|
242
|
+
expect(coalescedOp.deletions).toHaveLength(7);
|
|
243
|
+
|
|
244
|
+
// Note: These 7 deletions are NOT consecutive because we deleted backwards (6→0)
|
|
245
|
+
// So they cannot be merged. If we add optimizeDeletions() to coalesceTextOperations,
|
|
246
|
+
// it would merge them if they were consecutive.
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
});
|