Add duplication guard in collab onChange to detect and auto-fix doubled content
Y.js CRDT merges can duplicate content when a client reconnects after external file modifications (e.g., API PUT while collab is active). The guard detects when content is exactly doubled and auto-trims it. Bunker Admin
This commit is contained in:
parent
078bb6e313
commit
a436c494fd
@ -257,8 +257,23 @@ const docsExtension: Extension = {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write plaintext to disk (debounced by Hocuspocus's built-in debounce)
|
// Duplication guard: detect and fix content that appears to be doubled
|
||||||
const content = yText.toString();
|
const content = yText.toString();
|
||||||
|
if (content.length > 20) {
|
||||||
|
const half = Math.floor(content.length / 2);
|
||||||
|
const firstHalf = content.substring(0, half);
|
||||||
|
const secondHalf = content.substring(half);
|
||||||
|
if (firstHalf === secondHalf) {
|
||||||
|
logger.warn(`Docs collab: detected duplicated content in ${documentName} (${content.length} chars), fixing`);
|
||||||
|
// Replace the Y.Text with just the first half
|
||||||
|
document.transact(() => {
|
||||||
|
yText.delete(half, content.length - half);
|
||||||
|
});
|
||||||
|
return; // The deletion triggers another onChange with the fixed content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write plaintext to disk (debounced by Hocuspocus's built-in debounce)
|
||||||
try {
|
try {
|
||||||
await docsFilesService.writeFileContent(documentName, content);
|
await docsFilesService.writeFileContent(documentName, content);
|
||||||
// Invalidate Redis file cache
|
// Invalidate Redis file cache
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user