server.ts 2.8 KB

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