in backend/columnar.js [133:170]
function parseAllOpIds(changes, single) {
const actors = {}, newChanges = []
for (let change of changes) {
change = copyObject(change)
actors[change.actor] = true
change.ops = expandMultiOps(change.ops, change.startOp, change.actor)
change.ops = change.ops.map(op => {
op = copyObject(op)
if (op.obj !== '_root') op.obj = parseOpId(op.obj)
if (op.elemId && op.elemId !== '_head') op.elemId = parseOpId(op.elemId)
if (op.child) op.child = parseOpId(op.child)
if (op.pred) op.pred = op.pred.map(parseOpId)
if (op.obj.actorId) actors[op.obj.actorId] = true
if (op.elemId && op.elemId.actorId) actors[op.elemId.actorId] = true
if (op.child && op.child.actorId) actors[op.child.actorId] = true
for (let pred of op.pred) actors[pred.actorId] = true
return op
})
newChanges.push(change)
}
let actorIds = Object.keys(actors).sort()
if (single) {
actorIds = [changes[0].actor].concat(actorIds.filter(actor => actor !== changes[0].actor))
}
for (let change of newChanges) {
change.actorNum = actorIds.indexOf(change.actor)
for (let i = 0; i < change.ops.length; i++) {
let op = change.ops[i]
op.id = {counter: change.startOp + i, actorNum: change.actorNum, actorId: change.actor}
op.obj = actorIdToActorNum(op.obj, actorIds)
op.elemId = actorIdToActorNum(op.elemId, actorIds)
op.child = actorIdToActorNum(op.child, actorIds)
op.pred = op.pred.map(pred => actorIdToActorNum(pred, actorIds))
}
}
return {changes: newChanges, actorIds}
}