in backend/columnar.js [945:981]
function decodeDocumentChanges(changes, expectedHeads) {
let heads = {} // change hashes that are not a dependency of any other change
for (let i = 0; i < changes.length; i++) {
let change = changes[i]
change.deps = []
for (let index of change.depsNum.map(d => d.depsIndex)) {
if (!changes[index] || !changes[index].hash) {
throw new RangeError(`No hash for index ${index} while processing index ${i}`)
}
const hash = changes[index].hash
change.deps.push(hash)
if (heads[hash]) delete heads[hash]
}
change.deps.sort()
delete change.depsNum
if (change.extraLen_datatype !== VALUE_TYPE.BYTES) {
throw new RangeError(`Bad datatype for extra bytes: ${VALUE_TYPE.BYTES}`)
}
change.extraBytes = change.extraLen
delete change.extraLen_datatype
// Encoding and decoding again to compute the hash of the change
changes[i] = decodeChange(encodeChange(change))
heads[changes[i].hash] = true
}
const actualHeads = Object.keys(heads).sort()
let headsEqual = (actualHeads.length === expectedHeads.length), i = 0
while (headsEqual && i < actualHeads.length) {
headsEqual = (actualHeads[i] === expectedHeads[i])
i++
}
if (!headsEqual) {
throw new RangeError(`Mismatched heads hashes: expected ${expectedHeads.join(', ')}, got ${actualHeads.join(', ')}`)
}
}