import * as winston from 'winston' // eslint-disable-next-line @typescript-eslint/no-var-requires const axios = require('axios') import { AxiosInstance } from 'axios' import Redis from 'ioredis' import { Container } from 'inversify' import { Timer, TimerInterface } from '@standardnotes/time' import { Env } from './Env' import TYPES from './Types' import { AuthMiddleware } from '../Controller/AuthMiddleware' import { HttpServiceInterface } from '../Service/Http/HttpServiceInterface' import { HttpService } from '../Service/Http/HttpService' import { SubscriptionTokenAuthMiddleware } from '../Controller/SubscriptionTokenAuthMiddleware' import { CrossServiceTokenCacheInterface } from '../Service/Cache/CrossServiceTokenCacheInterface' import { RedisCrossServiceTokenCache } from '../Infra/Redis/RedisCrossServiceTokenCache' import { WebSocketAuthMiddleware } from '../Controller/WebSocketAuthMiddleware' // eslint-disable-next-line @typescript-eslint/no-var-requires const newrelicFormatter = require('@newrelic/winston-enricher') export class ContainerConfigLoader { async load(): Promise { const env: Env = new Env() env.load() const container = new Container() const newrelicWinstonFormatter = newrelicFormatter(winston) const winstonFormatters = [winston.format.splat(), winston.format.json()] if (env.get('NEW_RELIC_ENABLED', true) === 'true') { winstonFormatters.push(newrelicWinstonFormatter()) } const logger = winston.createLogger({ level: env.get('LOG_LEVEL') || 'info', format: winston.format.combine(...winstonFormatters), transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL') || 'info' })], }) container.bind(TYPES.Logger).toConstantValue(logger) const redisUrl = env.get('REDIS_URL') const isRedisInClusterMode = redisUrl.indexOf(',') > 0 let redis if (isRedisInClusterMode) { redis = new Redis.Cluster(redisUrl.split(',')) } else { redis = new Redis(redisUrl) } container.bind(TYPES.Redis).toConstantValue(redis) container.bind(TYPES.HTTPClient).toConstantValue(axios.create()) // env vars container.bind(TYPES.SYNCING_SERVER_JS_URL).toConstantValue(env.get('SYNCING_SERVER_JS_URL')) container.bind(TYPES.AUTH_SERVER_URL).toConstantValue(env.get('AUTH_SERVER_URL')) container.bind(TYPES.REVISIONS_SERVER_URL).toConstantValue(env.get('REVISIONS_SERVER_URL', true)) container.bind(TYPES.EMAIL_SERVER_URL).toConstantValue(env.get('EMAIL_SERVER_URL', true)) container.bind(TYPES.PAYMENTS_SERVER_URL).toConstantValue(env.get('PAYMENTS_SERVER_URL', true)) container.bind(TYPES.FILES_SERVER_URL).toConstantValue(env.get('FILES_SERVER_URL', true)) container.bind(TYPES.AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET')) container.bind(TYPES.WORKSPACE_SERVER_URL).toConstantValue(env.get('WORKSPACE_SERVER_URL', true)) container.bind(TYPES.WEB_SOCKET_SERVER_URL).toConstantValue(env.get('WEB_SOCKET_SERVER_URL', true)) container .bind(TYPES.HTTP_CALL_TIMEOUT) .toConstantValue(env.get('HTTP_CALL_TIMEOUT', true) ? +env.get('HTTP_CALL_TIMEOUT', true) : 60_000) container.bind(TYPES.VERSION).toConstantValue(env.get('VERSION')) container.bind(TYPES.CROSS_SERVICE_TOKEN_CACHE_TTL).toConstantValue(+env.get('CROSS_SERVICE_TOKEN_CACHE_TTL', true)) // Middleware container.bind(TYPES.AuthMiddleware).to(AuthMiddleware) container.bind(TYPES.WebSocketAuthMiddleware).to(WebSocketAuthMiddleware) container .bind(TYPES.SubscriptionTokenAuthMiddleware) .to(SubscriptionTokenAuthMiddleware) // Services container.bind(TYPES.HTTPService).to(HttpService) container.bind(TYPES.CrossServiceTokenCache).to(RedisCrossServiceTokenCache) container.bind(TYPES.Timer).toConstantValue(new Timer()) return container } }