in backend/new.js [1605:1635]
function readDocumentChanges(doc) {
const columns = makeDecoders(doc.changesColumns, DOCUMENT_COLUMNS)
const actorD = columns[0].decoder, seqD = columns[1].decoder
const depsNumD = columns[5].decoder, depsIndexD = columns[6].decoder
if (columns[0].columnId !== DOCUMENT_COLUMNS[0].columnId || DOCUMENT_COLUMNS[0].columnName !== 'actor' ||
columns[1].columnId !== DOCUMENT_COLUMNS[1].columnId || DOCUMENT_COLUMNS[1].columnName !== 'seq' ||
columns[5].columnId !== DOCUMENT_COLUMNS[5].columnId || DOCUMENT_COLUMNS[5].columnName !== 'depsNum' ||
columns[6].columnId !== DOCUMENT_COLUMNS[6].columnId || DOCUMENT_COLUMNS[6].columnName !== 'depsIndex') {
throw new RangeError('unexpected columnId')
}
let numChanges = 0, clock = {}, actorNums = [], headIndexes = new Set()
while (!actorD.done) {
const actorNum = actorD.readValue(), seq = seqD.readValue(), depsNum = depsNumD.readValue()
const actorId = doc.actorIds[actorNum]
if (seq !== 1 && seq !== clock[actorId] + 1) {
throw new RangeError(`Expected seq ${clock[actorId] + 1}, got ${seq} for actor ${actorId}`)
}
actorNums.push(actorNum)
clock[actorId] = seq
headIndexes.add(numChanges)
for (let j = 0; j < depsNum; j++) headIndexes.delete(depsIndexD.readValue())
numChanges++
}
const headActors = [...headIndexes].map(index => doc.actorIds[actorNums[index]]).sort()
for (let col of columns) col.decoder.reset()
const encoders = columns.map(col => ({columnId: col.columnId, encoder: encoderByColumnId(col.columnId)}))
copyColumns(encoders, columns, numChanges)
return {clock, headActors, encoders, numChanges}
}