ShareJsDB.coffee 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. Keys = require('./UpdateKeys')
  2. Settings = require('settings-sharelatex')
  3. DocumentManager = require "./DocumentManager"
  4. RedisManager = require "./RedisManager"
  5. DocOpsManager = require "./DocOpsManager"
  6. Errors = require "./Errors"
  7. logger = require "logger-sharelatex"
  8. module.exports = ShareJsDB =
  9. getOps: (doc_key, start, end, callback) ->
  10. if start == end
  11. return callback null, []
  12. # In redis, lrange values are inclusive.
  13. if end?
  14. end--
  15. else
  16. end = -1
  17. [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
  18. DocOpsManager.getPreviousDocOps project_id, doc_id, start, end, (error, ops) ->
  19. return callback error if error?
  20. callback null, ops
  21. writeOp: (doc_key, opData, callback) ->
  22. [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
  23. DocOpsManager.pushDocOp project_id, doc_id, opData, (error, version) ->
  24. return callback error if error?
  25. if version == opData.v + 1
  26. callback()
  27. else
  28. error = new Error("Version mismatch. '#{doc_id}' is corrupted.")
  29. logger.error err: error, doc_id: doc_id, project_id: project_id, opVersion: opData.v, expectedVersion: version, "doc is corrupt"
  30. callback error
  31. getSnapshot: (doc_key, callback) ->
  32. [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
  33. DocumentManager.getDoc project_id, doc_id, (error, lines, version) ->
  34. return callback(error) if error?
  35. if !lines? or !version?
  36. return callback(new Errors.NotFoundError("document not found: #{doc_id}"))
  37. if lines.length > 0 and lines[0].text?
  38. type = "json"
  39. snapshot = lines: lines
  40. else
  41. type = "text"
  42. snapshot = lines.join("\n")
  43. callback null,
  44. snapshot: snapshot
  45. v: parseInt(version, 10)
  46. type: type
  47. # To be able to remove a doc from the ShareJS memory
  48. # we need to called Model::delete, which calls this
  49. # method on the database. However, we will handle removing
  50. # it from Redis ourselves
  51. delete: (docName, dbMeta, callback) -> callback()