DocumentUpdaterController.coffee 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. logger = require "logger-sharelatex"
  2. settings = require 'settings-sharelatex'
  3. redis = require("redis-sharelatex")
  4. rclient = redis.createClient(settings.redis.documentupdater)
  5. SafeJsonParse = require "./SafeJsonParse"
  6. MESSAGE_SIZE_LOG_LIMIT = 1024 * 1024 # 1Mb
  7. module.exports = DocumentUpdaterController =
  8. # DocumentUpdaterController is responsible for updates that come via Redis
  9. # Pub/Sub from the document updater.
  10. listenForUpdatesFromDocumentUpdater: (io) ->
  11. rclient.subscribe "applied-ops"
  12. rclient.on "message", (channel, message) ->
  13. DocumentUpdaterController._processMessageFromDocumentUpdater(io, channel, message)
  14. _processMessageFromDocumentUpdater: (io, channel, message) ->
  15. SafeJsonParse.parse message, (error, message) ->
  16. if error?
  17. logger.error {err: error, channel}, "error parsing JSON"
  18. return
  19. if message.op?
  20. DocumentUpdaterController._applyUpdateFromDocumentUpdater(io, message.doc_id, message.op)
  21. else if message.error?
  22. DocumentUpdaterController._processErrorFromDocumentUpdater(io, message.doc_id, message.error, message)
  23. _applyUpdateFromDocumentUpdater: (io, doc_id, update) ->
  24. for client in io.sockets.clients(doc_id)
  25. if client.id == update.meta.source
  26. logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, "distributing update to sender"
  27. client.emit "otUpdateApplied", v: update.v, doc: update.doc
  28. else if !update.dup # Duplicate ops should just be sent back to sending client for acknowledgement
  29. logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, client_id: client.id, "distributing update to collaborator"
  30. client.emit "otUpdateApplied", update
  31. _processErrorFromDocumentUpdater: (io, doc_id, error, message) ->
  32. for client in io.sockets.clients(doc_id)
  33. logger.error err: error, doc_id: doc_id, client_id: client.id, "error from document updater, disconnecting client"
  34. client.emit "otUpdateError", error, message
  35. client.disconnect()