app.coffee 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. logger = require "logger-sharelatex"
  2. logger.initialize("real-time-sharelatex")
  3. express = require("express")
  4. session = require("express-session")
  5. redis = require("redis-sharelatex")
  6. ioredis = require('ioredis')
  7. Settings = require "settings-sharelatex"
  8. redisSessionsSettings = Settings.redis.websessions or Settings.redis.web
  9. if redisSessionsSettings?.cluster?
  10. logger.log {}, "using redis cluster for web sessions"
  11. sessionRedisClient = new ioredis.Cluster(redisSessionsSettings.cluster)
  12. else
  13. sessionRedisClient = redis.createClient(redisSessionsSettings)
  14. RedisStore = require('connect-redis')(session)
  15. SessionSockets = require('session.socket.io')
  16. CookieParser = require("cookie-parser")
  17. Metrics = require("metrics-sharelatex")
  18. Metrics.initialize(Settings.appName or "real-time")
  19. Metrics.event_loop.monitor(logger)
  20. # Set up socket.io server
  21. app = express()
  22. server = require('http').createServer(app)
  23. io = require('socket.io').listen(server)
  24. # Bind to sessions
  25. sessionStore = new RedisStore(client: sessionRedisClient)
  26. cookieParser = CookieParser(Settings.security.sessionSecret)
  27. sessionSockets = new SessionSockets(io, sessionStore, cookieParser, Settings.cookieName)
  28. io.configure ->
  29. io.enable('browser client minification')
  30. io.enable('browser client etag')
  31. # Fix for Safari 5 error of "Error during WebSocket handshake: location mismatch"
  32. # See http://answers.dotcloud.com/question/578/problem-with-websocket-over-ssl-in-safari-with
  33. io.set('match origin protocol', true)
  34. # gzip uses a Node 0.8.x method of calling the gzip program which
  35. # doesn't work with 0.6.x
  36. #io.enable('browser client gzip')
  37. io.set('transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling'])
  38. io.set('log level', 1)
  39. app.get "/status", (req, res, next) ->
  40. res.send "real-time-sharelatex is alive"
  41. redisCheck = redis.activeHealthCheckRedis(Settings.redis.web)
  42. app.get "/health_check/redis", (req, res, next) ->
  43. if redisCheck.isAlive()
  44. res.send 200
  45. else
  46. res.send 500
  47. Router = require "./app/js/Router"
  48. Router.configure(app, io, sessionSockets)
  49. WebsocketLoadBalancer = require "./app/js/WebsocketLoadBalancer"
  50. WebsocketLoadBalancer.listenForEditorEvents(io)
  51. DocumentUpdaterController = require "./app/js/DocumentUpdaterController"
  52. DocumentUpdaterController.listenForUpdatesFromDocumentUpdater(io)
  53. port = Settings.internal.realTime.port
  54. host = Settings.internal.realTime.host
  55. server.listen port, host, (error) ->
  56. throw error if error?
  57. logger.info "realtime starting up, listening on #{host}:#{port}"
  58. # Stop huge stack traces in logs from all the socket.io parsing steps.
  59. Error.stackTraceLimit = 10