EditorUpdatesController.coffee 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. logger = require "logger-sharelatex"
  2. metrics = require('../../infrastructure/Metrics')
  3. Settings = require 'settings-sharelatex'
  4. rclient = require("redis").createClient(Settings.redis.web.port, Settings.redis.web.host)
  5. rclient.auth(Settings.redis.web.password)
  6. DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  7. AutomaticSnapshotManager = require("../Versioning/AutomaticSnapshotManager")
  8. EditorRealTimeController = require("./EditorRealTimeController")
  9. module.exports = EditorUpdatesController =
  10. _applyUpdate: (client, project_id, doc_id, update, callback = (error) ->) ->
  11. metrics.inc "editor.doc-update", 0.3
  12. metrics.set "editor.active-projects", project_id, 0.3
  13. client.get "user_id", (error, user_id) ->
  14. metrics.set "editor.active-users", user_id, 0.3
  15. client.get "take_snapshots", (error, takeSnapshot) ->
  16. if takeSnapshot
  17. AutomaticSnapshotManager.markProjectAsUpdated(project_id)
  18. logger.log doc_id: doc_id, project_id: project_id, client_id: update.meta?.source, version: update.v, "sending update to doc updater"
  19. DocumentUpdaterHandler.queueChange project_id, doc_id, update, (error) ->
  20. if error?
  21. logger.error err:error, project_id: project_id, doc_id: doc_id, client_id: update.meta?.source, version: update.v, "document was not available for update"
  22. client.disconnect()
  23. callback(error)
  24. applyOtUpdate: (client, project_id, doc_id, update) ->
  25. update.meta ||= {}
  26. update.meta.source = client.id
  27. client.get "user_id", (error, user_id) ->
  28. update.meta.user_id = user_id
  29. EditorUpdatesController._applyUpdate client, project_id, doc_id, update
  30. applyAceUpdate: (client, project_id, doc_id, window_name, update) ->
  31. # This is deprecated now and should never be used. Kick the client off if they call it.
  32. # After the initial deploy this can be removed safely
  33. logger.err project_id: project_id, doc_id: doc_id, "client using old Ace Update method"
  34. client.disconnect()
  35. listenForUpdatesFromDocumentUpdater: () ->
  36. rclient.subscribe "applied-ops"
  37. rclient.on "message", @_processMessageFromDocumentUpdater.bind(@)
  38. _processMessageFromDocumentUpdater: (channel, message) ->
  39. message = JSON.parse message
  40. if message.op?
  41. @_applyUpdateFromDocumentUpdater(message.doc_id, message.op)
  42. else if message.error?
  43. @_processErrorFromDocumentUpdater(message.doc_id, message.error, message)
  44. _applyUpdateFromDocumentUpdater: (doc_id, update) ->
  45. io = require('../../infrastructure/Server').io
  46. for client in io.sockets.clients(doc_id)
  47. if client.id == update.meta.source
  48. logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, "distributing update to sender"
  49. client.emit "otUpdateApplied", v: update.v, doc: update.doc
  50. else
  51. logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, client_id: client.id, "distributing update to collaborator"
  52. client.emit "otUpdateApplied", update
  53. _processErrorFromDocumentUpdater: (doc_id, error, message) ->
  54. io = require('../../infrastructure/Server').io
  55. logger.error err: error, doc_id: doc_id, "error from document updater"
  56. for client in io.sockets.clients(doc_id)
  57. client.emit "otUpdateError", error, message
  58. client.disconnect()