DocUpdaterClient.coffee 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. Settings = require('settings-sharelatex')
  2. rclient = require("redis-sharelatex").createClient(Settings.redis.realtime)
  3. keys = Settings.redis.realtime.key_schema
  4. request = require("request").defaults(jar: false)
  5. async = require "async"
  6. rclient_sub = require("redis-sharelatex").createClient(Settings.redis.realtime)
  7. rclient_sub.subscribe "applied-ops"
  8. rclient_sub.setMaxListeners(0)
  9. module.exports = DocUpdaterClient =
  10. randomId: () ->
  11. chars = for i in [1..24]
  12. Math.random().toString(16)[2]
  13. return chars.join("")
  14. subscribeToAppliedOps: (callback = (message) ->) ->
  15. rclient_sub.on "message", callback
  16. sendUpdate: (project_id, doc_id, update, callback = (error) ->) ->
  17. rclient.rpush keys.pendingUpdates({doc_id}), JSON.stringify(update), (error)->
  18. return callback(error) if error?
  19. doc_key = "#{project_id}:#{doc_id}"
  20. rclient.sadd "DocsWithPendingUpdates", doc_key, (error) ->
  21. return callback(error) if error?
  22. rclient.rpush "pending-updates-list", doc_key, callback
  23. sendUpdates: (project_id, doc_id, updates, callback = (error) ->) ->
  24. DocUpdaterClient.preloadDoc project_id, doc_id, (error) ->
  25. return callback(error) if error?
  26. jobs = []
  27. for update in updates
  28. do (update) ->
  29. jobs.push (callback) ->
  30. DocUpdaterClient.sendUpdate project_id, doc_id, update, callback
  31. async.series jobs, callback
  32. getDoc: (project_id, doc_id, callback = (error, res, body) ->) ->
  33. request.get "http://localhost:3003/project/#{project_id}/doc/#{doc_id}", (error, res, body) ->
  34. if body? and res.statusCode >= 200 and res.statusCode < 300
  35. body = JSON.parse(body)
  36. callback error, res, body
  37. getDocAndRecentOps: (project_id, doc_id, fromVersion, callback = (error, res, body) ->) ->
  38. request.get "http://localhost:3003/project/#{project_id}/doc/#{doc_id}?fromVersion=#{fromVersion}", (error, res, body) ->
  39. if body? and res.statusCode >= 200 and res.statusCode < 300
  40. body = JSON.parse(body)
  41. callback error, res, body
  42. preloadDoc: (project_id, doc_id, callback = (error) ->) ->
  43. DocUpdaterClient.getDoc project_id, doc_id, callback
  44. flushDoc: (project_id, doc_id, callback = (error) ->) ->
  45. request.post "http://localhost:3003/project/#{project_id}/doc/#{doc_id}/flush", (error, res, body) ->
  46. callback error, res, body
  47. setDocLines: (project_id, doc_id, lines, source, user_id, undoing, callback = (error) ->) ->
  48. request.post {
  49. url: "http://localhost:3003/project/#{project_id}/doc/#{doc_id}"
  50. json:
  51. lines: lines
  52. source: source
  53. user_id: user_id
  54. undoing: undoing
  55. }, (error, res, body) ->
  56. callback error, res, body
  57. deleteDoc: (project_id, doc_id, callback = (error) ->) ->
  58. request.del "http://localhost:3003/project/#{project_id}/doc/#{doc_id}", (error, res, body) ->
  59. callback error, res, body
  60. flushProject: (project_id, callback = () ->) ->
  61. request.post "http://localhost:3003/project/#{project_id}/flush", callback
  62. deleteProject: (project_id, callback = () ->) ->
  63. request.del "http://localhost:3003/project/#{project_id}", callback
  64. acceptChange: (project_id, doc_id, change_id, callback = () ->) ->
  65. request.post "http://localhost:3003/project/#{project_id}/doc/#{doc_id}/change/#{change_id}/accept", callback
  66. removeComment: (project_id, doc_id, comment, callback = () ->) ->
  67. request.del "http://localhost:3003/project/#{project_id}/doc/#{doc_id}/comment/#{comment}", callback
  68. getProjectDocs: (project_id, projectStateHash, callback = () ->) ->
  69. request.get "http://localhost:3003/project/#{project_id}/doc?state=#{projectStateHash}", (error, res, body) ->
  70. if body? and res.statusCode >= 200 and res.statusCode < 300
  71. body = JSON.parse(body)
  72. callback error, res, body
  73. sendProjectUpdate: (project_id, userId, docUpdates, fileUpdates, version, callback = (error) ->) ->
  74. request.post {
  75. url: "http://localhost:3003/project/#{project_id}"
  76. json: { userId, docUpdates, fileUpdates, version }
  77. }, (error, res, body) ->
  78. callback error, res, body