server.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import 'reflect-metadata'
  2. import '../src/Infra/InversifyExpressUtils/AnnotatedFallbackController'
  3. import '../src/Infra/InversifyExpressUtils/AnnotatedHealthCheckController'
  4. import '../src/Infra/InversifyExpressUtils/AnnotatedItemsController'
  5. import '../src/Infra/InversifyExpressUtils/AnnotatedMessagesController'
  6. import '../src/Infra/InversifyExpressUtils/AnnotatedSharedVaultInvitesController'
  7. import '../src/Infra/InversifyExpressUtils/AnnotatedSharedVaultUsersController'
  8. import '../src/Infra/InversifyExpressUtils/AnnotatedSharedVaultsController'
  9. import helmet from 'helmet'
  10. import * as cors from 'cors'
  11. import { urlencoded, json, Request, Response, NextFunction } from 'express'
  12. import * as winston from 'winston'
  13. import { InversifyExpressServer } from 'inversify-express-utils'
  14. import TYPES from '../src/Bootstrap/Types'
  15. import { Env } from '../src/Bootstrap/Env'
  16. import { ContainerConfigLoader } from '../src/Bootstrap/Container'
  17. const container = new ContainerConfigLoader()
  18. void container.load().then((container) => {
  19. const env: Env = new Env()
  20. env.load()
  21. const server = new InversifyExpressServer(container)
  22. server.setConfig((app) => {
  23. app.use((_request: Request, response: Response, next: NextFunction) => {
  24. response.setHeader('X-SSJS-Version', container.get(TYPES.Sync_VERSION))
  25. next()
  26. })
  27. /* eslint-disable */
  28. app.use(helmet({
  29. contentSecurityPolicy: {
  30. directives: {
  31. defaultSrc: ["https: 'self'"],
  32. baseUri: ["'self'"],
  33. childSrc: ["*", "blob:"],
  34. connectSrc: ["*"],
  35. fontSrc: ["*", "'self'"],
  36. formAction: ["'self'"],
  37. frameAncestors: ["*", "*.standardnotes.org"],
  38. frameSrc: ["*", "blob:"],
  39. imgSrc: ["'self'", "*", "data:"],
  40. manifestSrc: ["'self'"],
  41. mediaSrc: ["'self'"],
  42. objectSrc: ["'self'"],
  43. scriptSrc: ["'self'"],
  44. styleSrc: ["'self'"]
  45. }
  46. }
  47. }))
  48. /* eslint-enable */
  49. app.use(json({ limit: '50mb' }))
  50. app.use(urlencoded({ extended: true, limit: '50mb', parameterLimit: 5000 }))
  51. app.use(cors())
  52. })
  53. const logger: winston.Logger = container.get(TYPES.Sync_Logger)
  54. server.setErrorConfig((app) => {
  55. app.use((error: Record<string, unknown>, _request: Request, response: Response, _next: NextFunction) => {
  56. logger.error(error.stack)
  57. response.status(500).send({
  58. error: {
  59. message:
  60. "Unfortunately, we couldn't handle your request. Please try again or contact our support if the error persists.",
  61. },
  62. })
  63. })
  64. })
  65. const serverInstance = server.build().listen(env.get('PORT'))
  66. process.on('SIGTERM', () => {
  67. logger.info('SIGTERM signal received: closing HTTP server')
  68. serverInstance.close(() => {
  69. logger.info('HTTP server closed')
  70. })
  71. })
  72. logger.info(`Server started on port ${process.env.PORT}`)
  73. })