PersistenceManager.coffee 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. request = require "request"
  2. Settings = require "settings-sharelatex"
  3. Errors = require "./Errors"
  4. Metrics = require "./Metrics"
  5. logger = require "logger-sharelatex"
  6. # We have to be quick with HTTP calls because we're holding a lock that
  7. # expires after 30 seconds. We can't let any errors in the rest of the stack
  8. # hold us up, and need to bail out quickly if there is a problem.
  9. MAX_HTTP_REQUEST_LENGTH = 5000 # 5 seconds
  10. module.exports = PersistenceManager =
  11. getDoc: (project_id, doc_id, _callback = (error, lines, version, track_changes_entries) ->) ->
  12. timer = new Metrics.Timer("persistenceManager.getDoc")
  13. callback = (args...) ->
  14. timer.done()
  15. _callback(args...)
  16. url = "#{Settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}"
  17. request {
  18. url: url
  19. method: "GET"
  20. headers:
  21. "accept": "application/json"
  22. auth:
  23. user: Settings.apis.web.user
  24. pass: Settings.apis.web.pass
  25. sendImmediately: true
  26. jar: false
  27. timeout: MAX_HTTP_REQUEST_LENGTH
  28. }, (error, res, body) ->
  29. return callback(error) if error?
  30. if res.statusCode >= 200 and res.statusCode < 300
  31. try
  32. body = JSON.parse body
  33. catch e
  34. return callback(e)
  35. if !body.lines?
  36. return callback(new Error("web API response had no doc lines"))
  37. if !body.version? or not body.version instanceof Number
  38. return callback(new Error("web API response had no valid doc version"))
  39. return callback null, body.lines, body.version, body.track_changes_entries
  40. else if res.statusCode == 404
  41. return callback(new Errors.NotFoundError("doc not not found: #{url}"))
  42. else
  43. return callback(new Error("error accessing web API: #{url} #{res.statusCode}"))
  44. setDoc: (project_id, doc_id, lines, version, track_changes_entries, _callback = (error) ->) ->
  45. timer = new Metrics.Timer("persistenceManager.setDoc")
  46. callback = (args...) ->
  47. timer.done()
  48. _callback(args...)
  49. url = "#{Settings.apis.web.url}/project/#{project_id}/doc/#{doc_id}"
  50. request {
  51. url: url
  52. method: "POST"
  53. json:
  54. lines: lines
  55. track_changes_entries: track_changes_entries
  56. version: version
  57. auth:
  58. user: Settings.apis.web.user
  59. pass: Settings.apis.web.pass
  60. sendImmediately: true
  61. jar: false
  62. timeout: MAX_HTTP_REQUEST_LENGTH
  63. }, (error, res, body) ->
  64. return callback(error) if error?
  65. if res.statusCode >= 200 and res.statusCode < 300
  66. return callback null
  67. else if res.statusCode == 404
  68. return callback(new Errors.NotFoundError("doc not not found: #{url}"))
  69. else
  70. return callback(new Error("error accessing web API: #{url} #{res.statusCode}"))