WebsocketLoadBalancer.coffee 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. Settings = require 'settings-sharelatex'
  2. logger = require 'logger-sharelatex'
  3. redis = require("redis-sharelatex")
  4. SafeJsonParse = require "./SafeJsonParse"
  5. rclientPub = redis.createClient(Settings.redis.realtime)
  6. rclientSub = redis.createClient(Settings.redis.realtime)
  7. EventLogger = require "./EventLogger"
  8. module.exports = WebsocketLoadBalancer =
  9. rclientPub: rclientPub
  10. rclientSub: rclientSub
  11. emitToRoom: (room_id, message, payload...) ->
  12. if !room_id?
  13. logger.warn {message, payload}, "no room_id provided, ignoring emitToRoom"
  14. return
  15. data = JSON.stringify
  16. room_id: room_id
  17. message: message
  18. payload: payload
  19. logger.log {room_id, message, payload, length: data.length}, "emitting to room"
  20. @rclientPub.publish "editor-events", data
  21. emitToAll: (message, payload...) ->
  22. @emitToRoom "all", message, payload...
  23. listenForEditorEvents: (io) ->
  24. @rclientSub.subscribe "editor-events"
  25. @rclientSub.on "message", (channel, message) ->
  26. WebsocketLoadBalancer._processEditorEvent io, channel, message
  27. _processEditorEvent: (io, channel, message) ->
  28. SafeJsonParse.parse message, (error, message) ->
  29. if error?
  30. logger.error {err: error, channel}, "error parsing JSON"
  31. return
  32. if message.room_id == "all"
  33. io.sockets.emit(message.message, message.payload...)
  34. else if message.room_id?
  35. if message._id?
  36. EventLogger.checkEventOrder("editor-events", message._id, message)
  37. # send messages only to unique clients (due to duplicate entries in io.sockets.clients)
  38. clientList = io.sockets.clients(message.room_id)
  39. seen = {}
  40. for client in clientList when not seen[client.id]
  41. seen[client.id] = true
  42. client.emit(message.message, message.payload...)
  43. else if message.health_check?
  44. logger.debug {message}, "got health check message in editor events channel"