in backend/new.js [1438:1503]
function setupPatches(patches, objectIds, docState) {
for (let objectId of objectIds) {
let meta = docState.objectMeta[objectId], childMeta = null, patchExists = false
while (true) {
const hasChildren = childMeta && Object.keys(meta.children[childMeta.parentKey]).length > 0
if (!patches[objectId]) patches[objectId] = emptyObjectPatch(objectId, meta.type)
if (childMeta && hasChildren) {
if (meta.type === 'list' || meta.type === 'text') {
// In list/text objects, parentKey is an elemID. First see if it already appears in an edit
for (let edit of patches[objectId].edits) {
if (edit.opId && meta.children[childMeta.parentKey][edit.opId]) {
patchExists = true
}
}
// If we need to add an edit, we first have to translate the elemId into an index
if (!patchExists) {
const obj = parseOpId(objectId), elem = parseOpId(childMeta.parentKey)
const seekPos = {
objActor: obj.actorId, objCtr: obj.counter,
keyActor: elem.actorId, keyCtr: elem.counter,
keyStr: null, insert: false,
objId: objectId
}
const { visibleCount } = seekToOp(docState, seekPos)
for (let [opId, value] of Object.entries(meta.children[childMeta.parentKey])) {
let patchValue = value
if (value.objectId) {
if (!patches[value.objectId]) patches[value.objectId] = emptyObjectPatch(value.objectId, value.type)
patchValue = patches[value.objectId]
}
const edit = {action: 'update', index: visibleCount, opId, value: patchValue}
appendEdit(patches[objectId].edits, edit)
}
}
} else {
// Non-list object: parentKey is the name of the property being updated (a string)
if (!patches[objectId].props[childMeta.parentKey]) {
patches[objectId].props[childMeta.parentKey] = {}
}
let values = patches[objectId].props[childMeta.parentKey]
for (let [opId, value] of Object.entries(meta.children[childMeta.parentKey])) {
if (values[opId]) {
patchExists = true
} else if (value.objectId) {
if (!patches[value.objectId]) patches[value.objectId] = emptyObjectPatch(value.objectId, value.type)
values[opId] = patches[value.objectId]
} else {
values[opId] = value
}
}
}
}
if (patchExists || !meta.parentObj || (childMeta && !hasChildren)) break
childMeta = meta
objectId = meta.parentObj
meta = docState.objectMeta[objectId]
}
}
return patches
}