| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- Settings = require 'settings-sharelatex'
- logger = require 'logger-sharelatex'
- redis = require("redis-sharelatex")
- SafeJsonParse = require "./SafeJsonParse"
- rclientPub = redis.createClient(Settings.redis.realtime)
- rclientSub = redis.createClient(Settings.redis.realtime)
- EventLogger = require "./EventLogger"
- module.exports = WebsocketLoadBalancer =
- rclientPub: rclientPub
- rclientSub: rclientSub
- emitToRoom: (room_id, message, payload...) ->
- if !room_id?
- logger.warn {message, payload}, "no room_id provided, ignoring emitToRoom"
- return
- data = JSON.stringify
- room_id: room_id
- message: message
- payload: payload
- logger.log {room_id, message, payload, length: data.length}, "emitting to room"
- @rclientPub.publish "editor-events", data
- emitToAll: (message, payload...) ->
- @emitToRoom "all", message, payload...
- listenForEditorEvents: (io) ->
- @rclientSub.subscribe "editor-events"
- @rclientSub.on "message", (channel, message) ->
- WebsocketLoadBalancer._processEditorEvent io, channel, message
- _processEditorEvent: (io, channel, message) ->
- SafeJsonParse.parse message, (error, message) ->
- if error?
- logger.error {err: error, channel}, "error parsing JSON"
- return
- if message.room_id == "all"
- io.sockets.emit(message.message, message.payload...)
- else if message.room_id?
- if message._id?
- EventLogger.checkEventOrder("editor-events", message._id, message)
- # send messages only to unique clients (due to duplicate entries in io.sockets.clients)
- clientList = io.sockets.clients(message.room_id)
- seen = {}
- for client in clientList when not seen[client.id]
- seen[client.id] = true
- client.emit(message.message, message.payload...)
- else if message.health_check?
- logger.debug {message}, "got health check message in editor events channel"
-
|