server.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import Metrics from '@overleaf/metrics'
  2. import logger from '@overleaf/logger'
  3. import express from 'express'
  4. import bodyParser from 'body-parser'
  5. import * as Errors from './Errors.js'
  6. import * as Router from './Router.js'
  7. import { handleValidationError } from '@overleaf/validation-tools'
  8. const HistoryLogger = logger.initialize('project-history').logger
  9. Metrics.event_loop.monitor(logger)
  10. Metrics.memory.monitor(logger)
  11. Metrics.leaked_sockets.monitor(logger)
  12. Metrics.open_sockets.monitor()
  13. // log updates as truncated strings
  14. function truncateFn(updates) {
  15. return JSON.parse(
  16. JSON.stringify(updates, function (key, value) {
  17. let len
  18. if (typeof value === 'string' && (len = value.length) > 80) {
  19. return (
  20. value.substr(0, 32) +
  21. `...(message of length ${len} truncated)...` +
  22. value.substr(-32)
  23. )
  24. } else {
  25. return value
  26. }
  27. })
  28. )
  29. }
  30. HistoryLogger.addSerializers({
  31. rawUpdate: truncateFn,
  32. rawUpdates: truncateFn,
  33. newUpdates: truncateFn,
  34. lastUpdate: truncateFn,
  35. })
  36. export const app = express()
  37. app.use(bodyParser.json())
  38. app.use(bodyParser.urlencoded({ extended: true }))
  39. app.use(Metrics.http.monitor(logger))
  40. Router.initialize(app)
  41. Metrics.injectMetricsRoute(app)
  42. app.use(handleValidationError)
  43. app.use(function (error, req, res, next) {
  44. if (error instanceof Errors.NotFoundError) {
  45. res.sendStatus(404)
  46. } else if (error instanceof Errors.BadRequestError) {
  47. res.sendStatus(400)
  48. } else if (error instanceof Errors.InconsistentChunkError) {
  49. res.sendStatus(422)
  50. } else if (error instanceof Errors.TooManyRequestsError) {
  51. res.status(429).set('Retry-After', 300).end()
  52. } else {
  53. logger.error({ err: error, req }, error.message)
  54. res.status(500).json({ message: 'an internal error occurred' })
  55. }
  56. })