WebsocketLoadBalancer.coffee 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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. module.exports = WebsocketLoadBalancer =
  8. rclientPub: rclientPub
  9. rclientSub: rclientSub
  10. emitToRoom: (room_id, message, payload...) ->
  11. if !room_id?
  12. logger.warn {message, payload}, "no room_id provided, ignoring emitToRoom"
  13. return
  14. data = JSON.stringify
  15. room_id: room_id
  16. message: message
  17. payload: payload
  18. logger.log {room_id, message, payload, length: data.length}, "emitting to room"
  19. @rclientPub.publish "editor-events", data
  20. emitToAll: (message, payload...) ->
  21. @emitToRoom "all", message, payload...
  22. listenForEditorEvents: (io) ->
  23. @rclientSub.subscribe "editor-events"
  24. @rclientSub.on "message", (channel, message) ->
  25. WebsocketLoadBalancer._processEditorEvent io, channel, message
  26. _processEditorEvent: (io, channel, message) ->
  27. SafeJsonParse.parse message, (error, message) ->
  28. if error?
  29. logger.error {err: error, channel}, "error parsing JSON"
  30. return
  31. if message.room_id == "all"
  32. io.sockets.emit(message.message, message.payload...)
  33. else if message.room_id?
  34. io.sockets.in(message.room_id).emit(message.message, message.payload...)