mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-14 20:40:17 -05:00
43 lines
1 KiB
JavaScript
43 lines
1 KiB
JavaScript
|
module.exports = class DocIterator {
|
||
|
constructor(packs, getPackByIdFn) {
|
||
|
this.getPackByIdFn = getPackByIdFn
|
||
|
// sort packs in descending order by version (i.e. most recent first)
|
||
|
const byVersion = (a, b) => b.v - a.v
|
||
|
this.packs = packs.slice().sort(byVersion)
|
||
|
this.queue = []
|
||
|
}
|
||
|
|
||
|
next(callback) {
|
||
|
const update = this.queue.shift()
|
||
|
if (update) {
|
||
|
return callback(null, update)
|
||
|
}
|
||
|
if (!this.packs.length) {
|
||
|
this._done = true
|
||
|
return callback(null)
|
||
|
}
|
||
|
const nextPack = this.packs[0]
|
||
|
this.getPackByIdFn(
|
||
|
nextPack.project_id,
|
||
|
nextPack.doc_id,
|
||
|
nextPack._id,
|
||
|
(err, pack) => {
|
||
|
if (err != null) {
|
||
|
return callback(err)
|
||
|
}
|
||
|
this.packs.shift() // have now retrieved this pack, remove it
|
||
|
for (const op of pack.pack.reverse()) {
|
||
|
op.doc_id = nextPack.doc_id
|
||
|
op.project_id = nextPack.project_id
|
||
|
this.queue.push(op)
|
||
|
}
|
||
|
return this.next(callback)
|
||
|
}
|
||
|
)
|
||
|
}
|
||
|
|
||
|
done() {
|
||
|
return this._done
|
||
|
}
|
||
|
}
|