EditorUpdatesController.coffee 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. logger = require "logger-sharelatex"
  2. metrics = require('../../infrastructure/Metrics')
  3. Settings = require 'settings-sharelatex'
  4. redis = require("redis-sharelatex")
  5. DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  6. EditorRealTimeController = require("./EditorRealTimeController")
  7. rclient = redis.createMonitoredSubscriptionClient(Settings.redis.web)
  8. module.exports = EditorUpdatesController =
  9. _applyUpdate: (client, project_id, doc_id, update, callback = (error) ->) ->
  10. metrics.inc "editor.doc-update", 0.3
  11. metrics.set "editor.active-projects", project_id, 0.3
  12. client.get "user_id", (error, user_id) ->
  13. metrics.set "editor.active-users", user_id, 0.3
  14. logger.log doc_id: doc_id, project_id: project_id, client_id: update.meta?.source, version: update.v, "sending update to doc updater"
  15. DocumentUpdaterHandler.queueChange project_id, doc_id, update, (error) ->
  16. if error?
  17. 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"
  18. client.disconnect()
  19. callback(error)
  20. applyOtUpdate: (client, project_id, doc_id, update) ->
  21. update.meta ||= {}
  22. update.meta.source = client.id
  23. client.get "user_id", (error, user_id) ->
  24. update.meta.user_id = user_id
  25. EditorUpdatesController._applyUpdate client, project_id, doc_id, update
  26. isRedisPubSubAlive: () ->
  27. rclient.isAlive()
  28. listenForUpdatesFromDocumentUpdater: () ->
  29. rclient.subscribe "applied-ops"
  30. rclient.on "message", (channel, message) ->
  31. return unless channel == "applied-ops"
  32. EditorUpdatesController._processMessageFromDocumentUpdater(channel, message)
  33. _processMessageFromDocumentUpdater: (channel, message) ->
  34. message = JSON.parse message
  35. if message.op?
  36. @_applyUpdateFromDocumentUpdater(message.doc_id, message.op)
  37. else if message.error?
  38. @_processErrorFromDocumentUpdater(message.doc_id, message.error, message)
  39. _applyUpdateFromDocumentUpdater: (doc_id, update) ->
  40. io = require('../../infrastructure/Server').io
  41. for client in io.sockets.clients(doc_id)
  42. if client.id == update.meta.source
  43. logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, "distributing update to sender"
  44. client.emit "otUpdateApplied", v: update.v, doc: update.doc
  45. else
  46. logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, client_id: client.id, "distributing update to collaborator"
  47. client.emit "otUpdateApplied", update
  48. _processErrorFromDocumentUpdater: (doc_id, error, message) ->
  49. io = require('../../infrastructure/Server').io
  50. logger.error err: error, doc_id: doc_id, "error from document updater"
  51. for client in io.sockets.clients(doc_id)
  52. client.emit "otUpdateError", error, message
  53. client.disconnect()