overleaf/services/track-changes/app/coffee/HistoryManager.coffee

35 lines
1.4 KiB
CoffeeScript
Raw Normal View History

MongoManager = require "./MongoManager"
UpdateCompressor = require "./UpdateCompressor"
logger = require "logger-sharelatex"
module.exports = HistoryManager =
compressAndSaveRawUpdates: (doc_id, rawUpdates, callback = (error) ->) ->
length = rawUpdates.length
if length == 0
return callback()
MongoManager.popLastCompressedUpdate doc_id, (error, lastCompressedUpdate) ->
return callback(error) if error?
# Ensure that raw updates start where lastCompressedUpdate left off
if lastCompressedUpdate?
rawUpdates = rawUpdates.slice(0)
while rawUpdates[0]? and rawUpdates[0].v <= lastCompressedUpdate.v
rawUpdates.shift()
if rawUpdates[0]? and rawUpdates[0].v != lastCompressedUpdate.v + 1
return callback new Error("Tried to apply raw op at version #{rawUpdates[0].v} to last compressed update with version #{lastCompressedUpdate.v}")
compressedUpdates = UpdateCompressor.compressRawUpdates lastCompressedUpdate, rawUpdates
MongoManager.insertCompressedUpdates doc_id, compressedUpdates, (error) ->
return callback(error) if error?
logger.log doc_id: doc_id, rawUpdatesLength: length, compressedUpdatesLength: compressedUpdates.length, "compressed doc updates"
callback()
processUncompressedUpdates: (doc_id, callback = (error) ->) ->
# Get lock - here or elsewhere?
# Get batch from Redis left hand side (oldest)
# pass batch to compressAndSaveRawUpdates
# Delete batch from redis
# release lock