in backend/new.js [1516:1557]
function applyChanges(patches, decodedChanges, docState, objectIds) {
let heads = new Set(docState.heads), changeHashes = new Set()
let clock = copyObject(docState.clock)
let applied = [], enqueued = []
for (let change of decodedChanges) {
// Skip any duplicate changes that we have already seen
if (docState.changeIndexByHash[change.hash] !== undefined || changeHashes.has(change.hash)) continue
let causallyReady = true
for (let dep of change.deps) {
const depIndex = docState.changeIndexByHash[dep]
if ((depIndex === undefined || depIndex === -1) && !changeHashes.has(dep)) {
causallyReady = false
}
}
if (causallyReady) {
const expectedSeq = (clock[change.actor] || 0) + 1
if (change.seq !== expectedSeq) {
throw new RangeError(`Expected seq ${expectedSeq}, got seq ${change.seq} from actor ${change.actor}`)
}
clock[change.actor] = change.seq
changeHashes.add(change.hash)
for (let dep of change.deps) heads.delete(dep)
heads.add(change.hash)
applied.push(change)
} else {
enqueued.push(change)
}
}
if (applied.length > 0) {
let changeState = {changes: applied, changeIndex: -1, objectIds}
readNextChangeOp(docState, changeState)
while (!changeState.done) applyOps(patches, changeState, docState)
docState.heads = [...heads].sort()
docState.clock = clock
}
return [applied, enqueued]
}