diff --git a/package-lock.json b/package-lock.json index c2c38deb..f090e209 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,10 @@ "": { "name": "@y/y", "version": "14.0.0-rc.12", + "dev": true, "license": "MIT", "dependencies": { - "lib0": "^1.0.0-rc.7" + "lib0": "^1.0.0-rc.11" }, "devDependencies": { "@types/node": "^22.14.1", @@ -3224,9 +3225,9 @@ } }, "node_modules/lib0": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-1.0.0-rc.7.tgz", - "integrity": "sha512-V5T141UN99W0uR2ULcmOBdRXl7tA21G6PLnMYpm1Ub5pn3ULbN4BHPKovgoWLZF0hrY0C8gd9uQJnuAGmVhF6w==", + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-1.0.0-rc.11.tgz", + "integrity": "sha512-zJiiiPmk2JIvLWuE2HAHdk5fiy9v7NMYS6uCdFTUEBN8zFeVfYdPJ+QQNs1vcSOAGtEFH6cw34QWiTrF3zqsGw==", "license": "MIT", "bin": { "0ecdsa-generate-keypair": "src/bin/0ecdsa-generate-keypair.js", diff --git a/package.json b/package.json index bc34c2ad..b5c5c72f 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ }, "homepage": "https://docs.yjs.dev", "dependencies": { - "lib0": "^1.0.0-rc.7" + "lib0": "^1.0.0-rc.12" }, "devDependencies": { "@types/node": "^22.14.1", diff --git a/src/utils/ids.js b/src/utils/ids.js index 7f77b211..ca91b63e 100644 --- a/src/utils/ids.js +++ b/src/utils/ids.js @@ -378,9 +378,13 @@ export const iterateStructsByIdSetWithoutSplits = (store, ds, f) => const ranges = idRanges.getIds() const structs = /** @type {Array} */ (store.clients.get(clientid)) if (structs != null) { + const lastStruct = structs[structs.length - 1] + const nextClock = lastStruct.id.clock + lastStruct.length for (let i = 0; i < ranges.length; i++) { const del = ranges[i] - iterateStructsWithoutSplits(structs, del.clock, del.len, f) + if (del.clock < nextClock) { + iterateStructsWithoutSplits(structs, del.clock, del.len, f) + } } } }) diff --git a/tests/attribution.tests.js b/tests/attribution.tests.js index 78df02d7..d448cc50 100644 --- a/tests/attribution.tests.js +++ b/tests/attribution.tests.js @@ -195,3 +195,22 @@ export const testAttributionEvent = () => { ytype.delete(0, 1) t.assert(called) } + +export const testAttributionChange = () => { + const ydoc = new Y.Doc() + const ytype = ydoc.get() + ytype.applyDelta(delta.create().insert('hi').done()) + const ydocClone = Y.cloneDoc(ydoc) + const am = Y.createAttributionManagerFromDiff(ydocClone, ydoc) + ytype.applyDelta(delta.create().retain(2).insert('!').done()) + let calledHandler = false + am.on('change', changes => { + calledHandler = true + const changeUpdate = ytype.toDelta(am, { deep: true, itemsToRender: changes, retainInserts: true, retainDeletes: true }) + const expectedUpdate = delta.create().retain(2).retain(1, null, {}) + t.compare(changeUpdate, expectedUpdate) + console.log(changeUpdate.toJSON()) + }) + Y.applyUpdate(ydocClone, Y.encodeStateAsUpdate(ydoc)) + t.assert(calledHandler) +}