app.coffee 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. express = require('express')
  2. logger = require('logger-sharelatex')
  3. logger.initialize("filestore")
  4. settings = require("settings-sharelatex")
  5. request = require("request")
  6. fileController = require("./app/js/FileController")
  7. keyBuilder = require("./app/js/KeyBuilder")
  8. domain = require("domain")
  9. appIsOk = true
  10. app = express()
  11. streamBuffers = require("stream-buffers")
  12. Metrics = require "metrics-sharelatex"
  13. Metrics.initialize("filestore")
  14. Metrics.open_sockets.monitor(logger)
  15. app.configure ->
  16. app.use express.bodyParser()
  17. app.use Metrics.http.monitor(logger)
  18. app.configure 'development', ->
  19. console.log "Development Enviroment"
  20. app.use express.errorHandler({ dumpExceptions: true, showStack: true })
  21. app.configure 'production', ->
  22. console.log "Production Enviroment"
  23. app.use express.errorHandler()
  24. Metrics.inc "startup"
  25. app.use (req, res, next)->
  26. Metrics.inc "http-request"
  27. next()
  28. app.use (req, res, next) ->
  29. requestDomain = domain.create()
  30. requestDomain.add req
  31. requestDomain.add res
  32. requestDomain.on "error", (err)->
  33. setTimeout(->
  34. if !res.headerSent
  35. res.send(500)
  36. , 3000)
  37. logger = require('logger-sharelatex')
  38. req =
  39. body:req.body
  40. headers:req.headers
  41. url:req.url
  42. key: req.key
  43. statusCode: req.statusCode
  44. err =
  45. message: err.message
  46. stack: err.stack
  47. name: err.name
  48. type: err.type
  49. arguments: err.arguments
  50. logger.err err:err, req:req, res:res, "uncaught exception thrown on request"
  51. requestDomain.run next
  52. app.get "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.getFile
  53. app.post "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.insertFile
  54. app.put "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.copyFile
  55. app.del "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.deleteFile
  56. app.get "/template/:template_id/v/:version/:format", keyBuilder.templateFileKey, fileController.getFile
  57. app.post "/template/:template_id/v/:version/:format", keyBuilder.templateFileKey, fileController.insertFile
  58. app.post "/shutdown", (req, res)->
  59. appIsOk = false
  60. res.send()
  61. app.get '/status', (req, res)->
  62. if appIsOk
  63. res.send('filestore sharelatex up')
  64. else
  65. logger.log "app is not ok - shutting down"
  66. res.send("server is being shut down", 500)
  67. app.get "/health_check", (req, res)->
  68. req.params.project_id = settings.health_check.project_id
  69. req.params.file_id = settings.health_check.file_id
  70. myWritableStreamBuffer = new streamBuffers.WritableStreamBuffer(initialSize: 100)
  71. keyBuilder.userFileKey req, res, ->
  72. fileController.getFile req, myWritableStreamBuffer
  73. myWritableStreamBuffer.on "close", ->
  74. if myWritableStreamBuffer.size() > 0
  75. res.send(200)
  76. else
  77. res.send(503)
  78. app.get '*', (req, res)->
  79. res.send 404
  80. serverDomain = domain.create()
  81. serverDomain.run ->
  82. server = require('http').createServer(app)
  83. port = settings.internal.filestore.port or 3009
  84. host = settings.internal.filestore.host or "localhost"
  85. server.listen port, host, ->
  86. logger.log("filestore store listening on #{host}:#{port}")
  87. serverDomain.on "error", (err)->
  88. logger.log err:err, "top level uncaught exception"