app.coffee 2.4 KB

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