Container.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import * as winston from 'winston'
  2. // eslint-disable-next-line @typescript-eslint/no-var-requires
  3. const axios = require('axios')
  4. import { AxiosInstance } from 'axios'
  5. import Redis from 'ioredis'
  6. import { Container } from 'inversify'
  7. import { Timer, TimerInterface } from '@standardnotes/time'
  8. import { Env } from './Env'
  9. import TYPES from './Types'
  10. import { AuthMiddleware } from '../Controller/AuthMiddleware'
  11. import { HttpServiceInterface } from '../Service/Http/HttpServiceInterface'
  12. import { HttpService } from '../Service/Http/HttpService'
  13. import { SubscriptionTokenAuthMiddleware } from '../Controller/SubscriptionTokenAuthMiddleware'
  14. import { CrossServiceTokenCacheInterface } from '../Service/Cache/CrossServiceTokenCacheInterface'
  15. import { RedisCrossServiceTokenCache } from '../Infra/Redis/RedisCrossServiceTokenCache'
  16. import { WebSocketAuthMiddleware } from '../Controller/WebSocketAuthMiddleware'
  17. // eslint-disable-next-line @typescript-eslint/no-var-requires
  18. const newrelicFormatter = require('@newrelic/winston-enricher')
  19. export class ContainerConfigLoader {
  20. async load(): Promise<Container> {
  21. const env: Env = new Env()
  22. env.load()
  23. const container = new Container()
  24. const newrelicWinstonFormatter = newrelicFormatter(winston)
  25. const winstonFormatters = [winston.format.splat(), winston.format.json()]
  26. if (env.get('NEW_RELIC_ENABLED', true) === 'true') {
  27. winstonFormatters.push(newrelicWinstonFormatter())
  28. }
  29. const logger = winston.createLogger({
  30. level: env.get('LOG_LEVEL') || 'info',
  31. format: winston.format.combine(...winstonFormatters),
  32. transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })],
  33. })
  34. container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
  35. const redisUrl = env.get('REDIS_URL')
  36. const isRedisInClusterMode = redisUrl.indexOf(',') > 0
  37. let redis
  38. if (isRedisInClusterMode) {
  39. redis = new Redis.Cluster(redisUrl.split(','))
  40. } else {
  41. redis = new Redis(redisUrl)
  42. }
  43. container.bind(TYPES.Redis).toConstantValue(redis)
  44. container.bind<AxiosInstance>(TYPES.HTTPClient).toConstantValue(axios.create())
  45. // env vars
  46. container.bind(TYPES.SYNCING_SERVER_JS_URL).toConstantValue(env.get('SYNCING_SERVER_JS_URL'))
  47. container.bind(TYPES.AUTH_SERVER_URL).toConstantValue(env.get('AUTH_SERVER_URL'))
  48. container.bind(TYPES.REVISIONS_SERVER_URL).toConstantValue(env.get('REVISIONS_SERVER_URL', true))
  49. container.bind(TYPES.EMAIL_SERVER_URL).toConstantValue(env.get('EMAIL_SERVER_URL', true))
  50. container.bind(TYPES.PAYMENTS_SERVER_URL).toConstantValue(env.get('PAYMENTS_SERVER_URL', true))
  51. container.bind(TYPES.FILES_SERVER_URL).toConstantValue(env.get('FILES_SERVER_URL', true))
  52. container.bind(TYPES.AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET'))
  53. container.bind(TYPES.WORKSPACE_SERVER_URL).toConstantValue(env.get('WORKSPACE_SERVER_URL', true))
  54. container.bind(TYPES.WEB_SOCKET_SERVER_URL).toConstantValue(env.get('WEB_SOCKET_SERVER_URL', true))
  55. container
  56. .bind(TYPES.HTTP_CALL_TIMEOUT)
  57. .toConstantValue(env.get('HTTP_CALL_TIMEOUT', true) ? +env.get('HTTP_CALL_TIMEOUT', true) : 60_000)
  58. container.bind(TYPES.VERSION).toConstantValue(env.get('VERSION'))
  59. container.bind(TYPES.CROSS_SERVICE_TOKEN_CACHE_TTL).toConstantValue(+env.get('CROSS_SERVICE_TOKEN_CACHE_TTL', true))
  60. // Middleware
  61. container.bind<AuthMiddleware>(TYPES.AuthMiddleware).to(AuthMiddleware)
  62. container.bind<WebSocketAuthMiddleware>(TYPES.WebSocketAuthMiddleware).to(WebSocketAuthMiddleware)
  63. container
  64. .bind<SubscriptionTokenAuthMiddleware>(TYPES.SubscriptionTokenAuthMiddleware)
  65. .to(SubscriptionTokenAuthMiddleware)
  66. // Services
  67. container.bind<HttpServiceInterface>(TYPES.HTTPService).to(HttpService)
  68. container.bind<CrossServiceTokenCacheInterface>(TYPES.CrossServiceTokenCache).to(RedisCrossServiceTokenCache)
  69. container.bind<TimerInterface>(TYPES.Timer).toConstantValue(new Timer())
  70. return container
  71. }
  72. }