import * as winston from 'winston' import Redis from 'ioredis' import { SNSClient, SNSClientConfig } from '@aws-sdk/client-sns' import { SQSClient, SQSClientConfig } from '@aws-sdk/client-sqs' import { Container } from 'inversify' import { DomainEventHandlerInterface, DomainEventMessageHandlerInterface, DomainEventPublisherInterface, DomainEventSubscriberFactoryInterface, } from '@standardnotes/domain-events' import { TimerInterface, Timer } from '@standardnotes/time' import { UAParser } from 'ua-parser-js' import { Env } from './Env' import TYPES from './Types' import { AuthenticateUser } from '../Domain/UseCase/AuthenticateUser' import { Repository } from 'typeorm' import { AppDataSource } from './DataSource' import { User } from '../Domain/User/User' import { Session } from '../Domain/Session/Session' import { SessionService } from '../Domain/Session/SessionService' import { TypeORMSessionRepository } from '../Infra/TypeORM/TypeORMSessionRepository' import { TypeORMUserRepository } from '../Infra/TypeORM/TypeORMUserRepository' import { SessionProjector } from '../Projection/SessionProjector' import { RefreshSessionToken } from '../Domain/UseCase/RefreshSessionToken' import { KeyParamsFactory } from '../Domain/User/KeyParamsFactory' import { SignIn } from '../Domain/UseCase/SignIn' import { VerifyMFA } from '../Domain/UseCase/VerifyMFA' import { UserProjector } from '../Projection/UserProjector' import { AuthResponseFactory20161215 } from '../Domain/Auth/AuthResponseFactory20161215' import { AuthResponseFactory20190520 } from '../Domain/Auth/AuthResponseFactory20190520' import { AuthResponseFactory20200115 } from '../Domain/Auth/AuthResponseFactory20200115' import { AuthResponseFactoryResolver } from '../Domain/Auth/AuthResponseFactoryResolver' import { ClearLoginAttempts } from '../Domain/UseCase/ClearLoginAttempts' import { IncreaseLoginAttempts } from '../Domain/UseCase/IncreaseLoginAttempts' import { GetUserKeyParams } from '../Domain/UseCase/GetUserKeyParams/GetUserKeyParams' import { UpdateUser } from '../Domain/UseCase/UpdateUser' import { RedisEphemeralSessionRepository } from '../Infra/Redis/RedisEphemeralSessionRepository' import { GetActiveSessionsForUser } from '../Domain/UseCase/GetActiveSessionsForUser' import { DeleteOtherSessionsForUser } from '../Domain/UseCase/DeleteOtherSessionsForUser' import { DeleteSessionForUser } from '../Domain/UseCase/DeleteSessionForUser' import { Register } from '../Domain/UseCase/Register' import { LockRepository } from '../Infra/Redis/LockRepository' import { TypeORMRevokedSessionRepository } from '../Infra/TypeORM/TypeORMRevokedSessionRepository' import { AuthenticationMethodResolver } from '../Domain/Auth/AuthenticationMethodResolver' import { RevokedSession } from '../Domain/Session/RevokedSession' import { UserRegisteredEventHandler } from '../Domain/Handler/UserRegisteredEventHandler' import { DomainEventFactory } from '../Domain/Event/DomainEventFactory' import { AuthenticateRequest } from '../Domain/UseCase/AuthenticateRequest' import { Role } from '../Domain/Role/Role' import { RoleProjector } from '../Projection/RoleProjector' import { PermissionProjector } from '../Projection/PermissionProjector' import { TypeORMRoleRepository } from '../Infra/TypeORM/TypeORMRoleRepository' import { Setting } from '../Domain/Setting/Setting' import { TypeORMSettingRepository } from '../Infra/TypeORM/TypeORMSettingRepository' import { CrypterInterface } from '../Domain/Encryption/CrypterInterface' import { CrypterNode } from '../Domain/Encryption/CrypterNode' import { CryptoNode } from '@standardnotes/sncrypto-node' import { GetSettings } from '../Domain/UseCase/GetSettings/GetSettings' import { SettingProjector } from '../Projection/SettingProjector' import { GetSetting } from '../Domain/UseCase/GetSetting/GetSetting' import { UpdateSetting } from '../Domain/UseCase/UpdateSetting/UpdateSetting' import { AccountDeletionRequestedEventHandler } from '../Domain/Handler/AccountDeletionRequestedEventHandler' import { SubscriptionPurchasedEventHandler } from '../Domain/Handler/SubscriptionPurchasedEventHandler' import { SubscriptionRenewedEventHandler } from '../Domain/Handler/SubscriptionRenewedEventHandler' import { SubscriptionRefundedEventHandler } from '../Domain/Handler/SubscriptionRefundedEventHandler' import { SubscriptionExpiredEventHandler } from '../Domain/Handler/SubscriptionExpiredEventHandler' import { DeleteAccount } from '../Domain/UseCase/DeleteAccount/DeleteAccount' import { DeleteSetting } from '../Domain/UseCase/DeleteSetting/DeleteSetting' import { SettingFactory } from '../Domain/Setting/SettingFactory' import { SettingService } from '../Domain/Setting/SettingService' // eslint-disable-next-line @typescript-eslint/no-var-requires const axios = require('axios') import { AxiosInstance } from 'axios' import { UserSubscription } from '../Domain/Subscription/UserSubscription' import { TypeORMUserSubscriptionRepository } from '../Infra/TypeORM/TypeORMUserSubscriptionRepository' import { WebSocketsClientService } from '../Infra/WebSockets/WebSocketsClientService' import { RoleService } from '../Domain/Role/RoleService' import { ClientServiceInterface } from '../Domain/Client/ClientServiceInterface' import { RoleServiceInterface } from '../Domain/Role/RoleServiceInterface' import { GetUserFeatures } from '../Domain/UseCase/GetUserFeatures/GetUserFeatures' import { RoleToSubscriptionMapInterface } from '../Domain/Role/RoleToSubscriptionMapInterface' import { RoleToSubscriptionMap } from '../Domain/Role/RoleToSubscriptionMap' import { FeatureServiceInterface } from '../Domain/Feature/FeatureServiceInterface' import { FeatureService } from '../Domain/Feature/FeatureService' import { SettingServiceInterface } from '../Domain/Setting/SettingServiceInterface' import { ExtensionKeyGrantedEventHandler } from '../Domain/Handler/ExtensionKeyGrantedEventHandler' import { DirectCallDomainEventPublisher, DirectCallEventMessageHandler, SNSDomainEventPublisher, SQSDomainEventSubscriberFactory, SQSEventMessageHandler, SQSOpenTelemetryEventMessageHandler, } from '@standardnotes/domain-events-infra' import { GetUserSubscription } from '../Domain/UseCase/GetUserSubscription/GetUserSubscription' import { ChangeCredentials } from '../Domain/UseCase/ChangeCredentials/ChangeCredentials' import { SubscriptionReassignedEventHandler } from '../Domain/Handler/SubscriptionReassignedEventHandler' import { UserSubscriptionRepositoryInterface } from '../Domain/Subscription/UserSubscriptionRepositoryInterface' import { CreateSubscriptionToken } from '../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken' import { SubscriptionTokenRepositoryInterface } from '../Domain/Subscription/SubscriptionTokenRepositoryInterface' import { RedisSubscriptionTokenRepository } from '../Infra/Redis/RedisSubscriptionTokenRepository' import { AuthenticateSubscriptionToken } from '../Domain/UseCase/AuthenticateSubscriptionToken/AuthenticateSubscriptionToken' import { OfflineSetting } from '../Domain/Setting/OfflineSetting' import { OfflineSettingServiceInterface } from '../Domain/Setting/OfflineSettingServiceInterface' import { OfflineSettingService } from '../Domain/Setting/OfflineSettingService' import { OfflineSettingRepositoryInterface } from '../Domain/Setting/OfflineSettingRepositoryInterface' import { SettingRepositoryInterface } from '../Domain/Setting/SettingRepositoryInterface' import { TypeORMOfflineSettingRepository } from '../Infra/TypeORM/TypeORMOfflineSettingRepository' import { OfflineUserSubscription } from '../Domain/Subscription/OfflineUserSubscription' import { OfflineUserSubscriptionRepositoryInterface } from '../Domain/Subscription/OfflineUserSubscriptionRepositoryInterface' import { TypeORMOfflineUserSubscriptionRepository } from '../Infra/TypeORM/TypeORMOfflineUserSubscriptionRepository' import { OfflineSubscriptionTokenRepositoryInterface } from '../Domain/Auth/OfflineSubscriptionTokenRepositoryInterface' import { RedisOfflineSubscriptionTokenRepository } from '../Infra/Redis/RedisOfflineSubscriptionTokenRepository' import { CreateOfflineSubscriptionToken } from '../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken' import { AuthenticateOfflineSubscriptionToken } from '../Domain/UseCase/AuthenticateOfflineSubscriptionToken/AuthenticateOfflineSubscriptionToken' import { SubscriptionCancelledEventHandler } from '../Domain/Handler/SubscriptionCancelledEventHandler' import { ContentDecoder, ContentDecoderInterface, ProtocolVersion } from '@standardnotes/common' import { GetUserOfflineSubscription } from '../Domain/UseCase/GetUserOfflineSubscription/GetUserOfflineSubscription' import { UserEmailChangedEventHandler } from '../Domain/Handler/UserEmailChangedEventHandler' import { SettingsAssociationServiceInterface } from '../Domain/Setting/SettingsAssociationServiceInterface' import { SettingsAssociationService } from '../Domain/Setting/SettingsAssociationService' import { SubscriptionSyncRequestedEventHandler } from '../Domain/Handler/SubscriptionSyncRequestedEventHandler' import { CrossServiceTokenData, DeterministicSelector, OfflineUserTokenData, SelectorInterface, SessionTokenData, TokenDecoder, TokenDecoderInterface, TokenEncoder, TokenEncoderInterface, ValetTokenData, WebSocketConnectionTokenData, } from '@standardnotes/security' import { FileUploadedEventHandler } from '../Domain/Handler/FileUploadedEventHandler' import { CreateValetToken } from '../Domain/UseCase/CreateValetToken/CreateValetToken' import { CreateListedAccount } from '../Domain/UseCase/CreateListedAccount/CreateListedAccount' import { ListedAccountCreatedEventHandler } from '../Domain/Handler/ListedAccountCreatedEventHandler' import { ListedAccountDeletedEventHandler } from '../Domain/Handler/ListedAccountDeletedEventHandler' import { FileRemovedEventHandler } from '../Domain/Handler/FileRemovedEventHandler' import { UserDisabledSessionUserAgentLoggingEventHandler } from '../Domain/Handler/UserDisabledSessionUserAgentLoggingEventHandler' import { SettingInterpreterInterface } from '../Domain/Setting/SettingInterpreterInterface' import { SettingInterpreter } from '../Domain/Setting/SettingInterpreter' import { SettingDecrypterInterface } from '../Domain/Setting/SettingDecrypterInterface' import { SettingDecrypter } from '../Domain/Setting/SettingDecrypter' import { SharedSubscriptionInvitationRepositoryInterface } from '../Domain/SharedSubscription/SharedSubscriptionInvitationRepositoryInterface' import { TypeORMSharedSubscriptionInvitationRepository } from '../Infra/TypeORM/TypeORMSharedSubscriptionInvitationRepository' import { InviteToSharedSubscription } from '../Domain/UseCase/InviteToSharedSubscription/InviteToSharedSubscription' import { SharedSubscriptionInvitation } from '../Domain/SharedSubscription/SharedSubscriptionInvitation' import { AcceptSharedSubscriptionInvitation } from '../Domain/UseCase/AcceptSharedSubscriptionInvitation/AcceptSharedSubscriptionInvitation' import { DeclineSharedSubscriptionInvitation } from '../Domain/UseCase/DeclineSharedSubscriptionInvitation/DeclineSharedSubscriptionInvitation' import { CancelSharedSubscriptionInvitation } from '../Domain/UseCase/CancelSharedSubscriptionInvitation/CancelSharedSubscriptionInvitation' import { SharedSubscriptionInvitationCreatedEventHandler } from '../Domain/Handler/SharedSubscriptionInvitationCreatedEventHandler' import { SubscriptionSetting } from '../Domain/Setting/SubscriptionSetting' import { SubscriptionSettingServiceInterface } from '../Domain/Setting/SubscriptionSettingServiceInterface' import { SubscriptionSettingService } from '../Domain/Setting/SubscriptionSettingService' import { SubscriptionSettingRepositoryInterface } from '../Domain/Setting/SubscriptionSettingRepositoryInterface' import { TypeORMSubscriptionSettingRepository } from '../Infra/TypeORM/TypeORMSubscriptionSettingRepository' import { SettingFactoryInterface } from '../Domain/Setting/SettingFactoryInterface' import { ListSharedSubscriptionInvitations } from '../Domain/UseCase/ListSharedSubscriptionInvitations/ListSharedSubscriptionInvitations' import { UserSubscriptionServiceInterface } from '../Domain/Subscription/UserSubscriptionServiceInterface' import { UserSubscriptionService } from '../Domain/Subscription/UserSubscriptionService' import { SubscriptionSettingProjector } from '../Projection/SubscriptionSettingProjector' import { SubscriptionSettingsAssociationService } from '../Domain/Setting/SubscriptionSettingsAssociationService' import { SubscriptionSettingsAssociationServiceInterface } from '../Domain/Setting/SubscriptionSettingsAssociationServiceInterface' import { PKCERepositoryInterface } from '../Domain/User/PKCERepositoryInterface' import { LockRepositoryInterface } from '../Domain/User/LockRepositoryInterface' import { RedisPKCERepository } from '../Infra/Redis/RedisPKCERepository' import { RoleRepositoryInterface } from '../Domain/Role/RoleRepositoryInterface' import { RevokedSessionRepositoryInterface } from '../Domain/Session/RevokedSessionRepositoryInterface' import { SessionRepositoryInterface } from '../Domain/Session/SessionRepositoryInterface' import { UserRepositoryInterface } from '../Domain/User/UserRepositoryInterface' import { AuthController } from '../Controller/AuthController' import { VerifyPredicate } from '../Domain/UseCase/VerifyPredicate/VerifyPredicate' import { PredicateVerificationRequestedEventHandler } from '../Domain/Handler/PredicateVerificationRequestedEventHandler' import { SubscriptionInvitesController } from '../Controller/SubscriptionInvitesController' import { CreateCrossServiceToken } from '../Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken' import { ProcessUserRequest } from '../Domain/UseCase/ProcessUserRequest/ProcessUserRequest' import { UserRequestsController } from '../Controller/UserRequestsController' import { EmailSubscriptionUnsubscribedEventHandler } from '../Domain/Handler/EmailSubscriptionUnsubscribedEventHandler' import { SessionTraceRepositoryInterface } from '../Domain/Session/SessionTraceRepositoryInterface' import { TypeORMSessionTraceRepository } from '../Infra/TypeORM/TypeORMSessionTraceRepository' import { CacheEntry, CacheEntryRepositoryInterface, ControllerContainer, ControllerContainerInterface, MapperInterface, ServiceIdentifier, SharedVaultUser, } from '@standardnotes/domain-core' import { SessionTracePersistenceMapper } from '../Mapping/SessionTracePersistenceMapper' import { SessionTrace } from '../Domain/Session/SessionTrace' import { TypeORMSessionTrace } from '../Infra/TypeORM/TypeORMSessionTrace' import { TraceSession } from '../Domain/UseCase/TraceSession/TraceSession' import { CleanupSessionTraces } from '../Domain/UseCase/CleanupSessionTraces/CleanupSessionTraces' import { PersistStatistics } from '../Domain/UseCase/PersistStatistics/PersistStatistics' import { TypeORMAuthenticator } from '../Infra/TypeORM/TypeORMAuthenticator' import { Authenticator } from '../Domain/Authenticator/Authenticator' import { AuthenticatorPersistenceMapper } from '../Mapping/AuthenticatorPersistenceMapper' import { AuthenticatorChallenge } from '../Domain/Authenticator/AuthenticatorChallenge' import { TypeORMAuthenticatorChallenge } from '../Infra/TypeORM/TypeORMAuthenticatorChallenge' import { AuthenticatorChallengePersistenceMapper } from '../Mapping/AuthenticatorChallengePersistenceMapper' import { AuthenticatorRepositoryInterface } from '../Domain/Authenticator/AuthenticatorRepositoryInterface' import { TypeORMAuthenticatorRepository } from '../Infra/TypeORM/TypeORMAuthenticatorRepository' import { AuthenticatorChallengeRepositoryInterface } from '../Domain/Authenticator/AuthenticatorChallengeRepositoryInterface' import { TypeORMAuthenticatorChallengeRepository } from '../Infra/TypeORM/TypeORMAuthenticatorChallengeRepository' import { GenerateAuthenticatorRegistrationOptions } from '../Domain/UseCase/GenerateAuthenticatorRegistrationOptions/GenerateAuthenticatorRegistrationOptions' import { VerifyAuthenticatorRegistrationResponse } from '../Domain/UseCase/VerifyAuthenticatorRegistrationResponse/VerifyAuthenticatorRegistrationResponse' import { GenerateAuthenticatorAuthenticationOptions } from '../Domain/UseCase/GenerateAuthenticatorAuthenticationOptions/GenerateAuthenticatorAuthenticationOptions' import { VerifyAuthenticatorAuthenticationResponse } from '../Domain/UseCase/VerifyAuthenticatorAuthenticationResponse/VerifyAuthenticatorAuthenticationResponse' import { AuthenticatorsController } from '../Controller/AuthenticatorsController' import { ListAuthenticators } from '../Domain/UseCase/ListAuthenticators/ListAuthenticators' import { AuthenticatorHttpProjection } from '../Infra/Http/Projection/AuthenticatorHttpProjection' import { AuthenticatorHttpMapper } from '../Mapping/AuthenticatorHttpMapper' import { DeleteAuthenticator } from '../Domain/UseCase/DeleteAuthenticator/DeleteAuthenticator' import { GenerateRecoveryCodes } from '../Domain/UseCase/GenerateRecoveryCodes/GenerateRecoveryCodes' import { SignInWithRecoveryCodes } from '../Domain/UseCase/SignInWithRecoveryCodes/SignInWithRecoveryCodes' import { GetUserKeyParamsRecovery } from '../Domain/UseCase/GetUserKeyParamsRecovery/GetUserKeyParamsRecovery' import { CleanupExpiredSessions } from '../Domain/UseCase/CleanupExpiredSessions/CleanupExpiredSessions' import { TypeORMCacheEntry } from '../Infra/TypeORM/TypeORMCacheEntry' import { TypeORMCacheEntryRepository } from '../Infra/TypeORM/TypeORMCacheEntryRepository' import { CacheEntryPersistenceMapper } from '../Mapping/CacheEntryPersistenceMapper' import { TypeORMLockRepository } from '../Infra/TypeORM/TypeORMLockRepository' import { EphemeralSessionRepositoryInterface } from '../Domain/Session/EphemeralSessionRepositoryInterface' import { TypeORMEphemeralSessionRepository } from '../Infra/TypeORM/TypeORMEphemeralSessionRepository' import { TypeORMOfflineSubscriptionTokenRepository } from '../Infra/TypeORM/TypeORMOfflineSubscriptionTokenRepository' import { TypeORMPKCERepository } from '../Infra/TypeORM/TypeORMPKCERepository' import { TypeORMSubscriptionTokenRepository } from '../Infra/TypeORM/TypeORMSubscriptionTokenRepository' import { SessionMiddleware } from '../Infra/InversifyExpressUtils/Middleware/SessionMiddleware' import { ApiGatewayOfflineAuthMiddleware } from '../Infra/InversifyExpressUtils/Middleware/ApiGatewayOfflineAuthMiddleware' import { OfflineUserAuthMiddleware } from '../Infra/InversifyExpressUtils/Middleware/OfflineUserAuthMiddleware' import { LockMiddleware } from '../Infra/InversifyExpressUtils/Middleware/LockMiddleware' import { RequiredCrossServiceTokenMiddleware } from '../Infra/InversifyExpressUtils/Middleware/RequiredCrossServiceTokenMiddleware' import { OptionalCrossServiceTokenMiddleware } from '../Infra/InversifyExpressUtils/Middleware/OptionalCrossServiceTokenMiddleware' import { BaseSettingsController } from '../Infra/InversifyExpressUtils/Base/BaseSettingsController' import { BaseAdminController } from '../Infra/InversifyExpressUtils/Base/BaseAdminController' import { BaseAuthController } from '../Infra/InversifyExpressUtils/Base/BaseAuthController' import { BaseAuthenticatorsController } from '../Infra/InversifyExpressUtils/Base/BaseAuthenticatorsController' import { BaseFeaturesController } from '../Infra/InversifyExpressUtils/Base/BaseFeaturesController' import { BaseListedController } from '../Infra/InversifyExpressUtils/Base/BaseListedController' import { BaseOfflineController } from '../Infra/InversifyExpressUtils/Base/BaseOfflineController' import { BaseSessionController } from '../Infra/InversifyExpressUtils/Base/BaseSessionController' import { BaseSubscriptionInvitesController } from '../Infra/InversifyExpressUtils/Base/BaseSubscriptionInvitesController' import { BaseSubscriptionSettingsController } from '../Infra/InversifyExpressUtils/Base/BaseSubscriptionSettingsController' import { BaseSubscriptionTokensController } from '../Infra/InversifyExpressUtils/Base/BaseSubscriptionTokensController' import { BaseUserRequestsController } from '../Infra/InversifyExpressUtils/Base/BaseUserRequestsController' import { BaseUsersController } from '../Infra/InversifyExpressUtils/Base/BaseUsersController' import { BaseValetTokenController } from '../Infra/InversifyExpressUtils/Base/BaseValetTokenController' import { BaseWebSocketsController } from '../Infra/InversifyExpressUtils/Base/BaseWebSocketsController' import { BaseSessionsController } from '../Infra/InversifyExpressUtils/Base/BaseSessionsController' import { Transform } from 'stream' import { ActivatePremiumFeatures } from '../Domain/UseCase/ActivatePremiumFeatures/ActivatePremiumFeatures' import { PaymentsAccountDeletedEventHandler } from '../Domain/Handler/PaymentsAccountDeletedEventHandler' import { UpdateStorageQuotaUsedForUser } from '../Domain/UseCase/UpdateStorageQuotaUsedForUser/UpdateStorageQuotaUsedForUser' import { SharedVaultFileUploadedEventHandler } from '../Domain/Handler/SharedVaultFileUploadedEventHandler' import { SharedVaultFileRemovedEventHandler } from '../Domain/Handler/SharedVaultFileRemovedEventHandler' import { SharedVaultFileMovedEventHandler } from '../Domain/Handler/SharedVaultFileMovedEventHandler' import { TransitionStatusRepositoryInterface } from '../Domain/Transition/TransitionStatusRepositoryInterface' import { RedisTransitionStatusRepository } from '../Infra/Redis/RedisTransitionStatusRepository' import { InMemoryTransitionStatusRepository } from '../Infra/InMemory/InMemoryTransitionStatusRepository' import { TransitionStatusUpdatedEventHandler } from '../Domain/Handler/TransitionStatusUpdatedEventHandler' import { UpdateTransitionStatus } from '../Domain/UseCase/UpdateTransitionStatus/UpdateTransitionStatus' import { TypeORMSharedVaultUser } from '../Infra/TypeORM/TypeORMSharedVaultUser' import { SharedVaultUserPersistenceMapper } from '../Mapping/SharedVaultUserPersistenceMapper' import { SharedVaultUserRepositoryInterface } from '../Domain/SharedVault/SharedVaultUserRepositoryInterface' import { TypeORMSharedVaultUserRepository } from '../Infra/TypeORM/TypeORMSharedVaultUserRepository' import { AddSharedVaultUser } from '../Domain/UseCase/AddSharedVaultUser/AddSharedVaultUser' import { RemoveSharedVaultUser } from '../Domain/UseCase/RemoveSharedVaultUser/RemoveSharedVaultUser' import { UserAddedToSharedVaultEventHandler } from '../Domain/Handler/UserAddedToSharedVaultEventHandler' import { UserRemovedFromSharedVaultEventHandler } from '../Domain/Handler/UserRemovedFromSharedVaultEventHandler' import { DesignateSurvivor } from '../Domain/UseCase/DesignateSurvivor/DesignateSurvivor' import { UserDesignatedAsSurvivorInSharedVaultEventHandler } from '../Domain/Handler/UserDesignatedAsSurvivorInSharedVaultEventHandler' import { DisableEmailSettingBasedOnEmailSubscription } from '../Domain/UseCase/DisableEmailSettingBasedOnEmailSubscription/DisableEmailSettingBasedOnEmailSubscription' export class ContainerConfigLoader { constructor(private mode: 'server' | 'worker' = 'server') {} async load(configuration?: { controllerConatiner?: ControllerContainerInterface directCallDomainEventPublisher?: DirectCallDomainEventPublisher logger?: Transform environmentOverrides?: { [name: string]: string } }): Promise { const directCallDomainEventPublisher = configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher() const env: Env = new Env(configuration?.environmentOverrides) env.load() const container = new Container() const winstonFormatters = [winston.format.splat(), winston.format.json()] if (env.get('NEW_RELIC_ENABLED', true) === 'true') { await import('newrelic') // eslint-disable-next-line @typescript-eslint/no-var-requires const newrelicFormatter = require('@newrelic/winston-enricher') const newrelicWinstonFormatter = newrelicFormatter(winston) winstonFormatters.push(newrelicWinstonFormatter()) } let logger: winston.Logger if (configuration?.logger) { logger = configuration.logger as winston.Logger } else { logger = winston.createLogger({ level: env.get('LOG_LEVEL', true) || 'info', format: winston.format.combine(...winstonFormatters), transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })], defaultMeta: { service: 'auth' }, }) } container.bind(TYPES.Auth_Logger).toConstantValue(logger) const appDataSource = new AppDataSource({ env, runMigrations: this.mode === 'server' }) await appDataSource.initialize() logger.debug('Database initialized') const isConfiguredForHomeServer = env.get('MODE', true) === 'home-server' const isConfiguredForSelfHosting = env.get('MODE', true) === 'self-hosted' const isConfiguredForHomeServerOrSelfHosting = isConfiguredForHomeServer || isConfiguredForSelfHosting const isConfiguredForInMemoryCache = env.get('CACHE_TYPE', true) === 'memory' container .bind(TYPES.Auth_IS_CONFIGURED_FOR_HOME_SERVER_OR_SELF_HOSTING) .toConstantValue(isConfiguredForHomeServerOrSelfHosting) if (!isConfiguredForInMemoryCache) { 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.Auth_Redis).toConstantValue(redis) } container.bind(TYPES.Auth_Timer).toConstantValue(new Timer()) if (!isConfiguredForHomeServer) { const snsConfig: SNSClientConfig = { region: env.get('SNS_AWS_REGION', true), } if (env.get('SNS_ENDPOINT', true)) { snsConfig.endpoint = env.get('SNS_ENDPOINT', true) } if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) { snsConfig.credentials = { accessKeyId: env.get('SNS_ACCESS_KEY_ID', true), secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true), } } const snsClient = new SNSClient(snsConfig) container.bind(TYPES.Auth_SNS).toConstantValue(snsClient) const sqsConfig: SQSClientConfig = { region: env.get('SQS_AWS_REGION', true), } if (env.get('SQS_ENDPOINT', true)) { sqsConfig.endpoint = env.get('SQS_ENDPOINT', true) } if (env.get('SQS_ACCESS_KEY_ID', true) && env.get('SQS_SECRET_ACCESS_KEY', true)) { sqsConfig.credentials = { accessKeyId: env.get('SQS_ACCESS_KEY_ID', true), secretAccessKey: env.get('SQS_SECRET_ACCESS_KEY', true), } } const sqsClient = new SQSClient(sqsConfig) container.bind(TYPES.Auth_SQS).toConstantValue(sqsClient) } // Mapping container .bind>(TYPES.Auth_SessionTracePersistenceMapper) .toConstantValue(new SessionTracePersistenceMapper(container.get(TYPES.Auth_Timer))) container .bind>(TYPES.Auth_AuthenticatorPersistenceMapper) .toConstantValue(new AuthenticatorPersistenceMapper()) container .bind>(TYPES.Auth_AuthenticatorHttpMapper) .toConstantValue(new AuthenticatorHttpMapper()) container .bind>( TYPES.Auth_AuthenticatorChallengePersistenceMapper, ) .toConstantValue(new AuthenticatorChallengePersistenceMapper()) container .bind>(TYPES.Auth_CacheEntryPersistenceMapper) .toConstantValue(new CacheEntryPersistenceMapper()) container .bind>(TYPES.Auth_SharedVaultUserPersistenceMapper) .toConstantValue(new SharedVaultUserPersistenceMapper()) // ORM container .bind>(TYPES.Auth_ORMOfflineSettingRepository) .toConstantValue(appDataSource.getRepository(OfflineSetting)) container .bind>(TYPES.Auth_ORMOfflineUserSubscriptionRepository) .toConstantValue(appDataSource.getRepository(OfflineUserSubscription)) container .bind>(TYPES.Auth_ORMRevokedSessionRepository) .toConstantValue(appDataSource.getRepository(RevokedSession)) container.bind>(TYPES.Auth_ORMRoleRepository).toConstantValue(appDataSource.getRepository(Role)) container .bind>(TYPES.Auth_ORMSessionRepository) .toConstantValue(appDataSource.getRepository(Session)) container .bind>(TYPES.Auth_ORMSettingRepository) .toConstantValue(appDataSource.getRepository(Setting)) container .bind>(TYPES.Auth_ORMSharedSubscriptionInvitationRepository) .toConstantValue(appDataSource.getRepository(SharedSubscriptionInvitation)) container .bind>(TYPES.Auth_ORMSubscriptionSettingRepository) .toConstantValue(appDataSource.getRepository(SubscriptionSetting)) container.bind>(TYPES.Auth_ORMUserRepository).toConstantValue(appDataSource.getRepository(User)) container .bind>(TYPES.Auth_ORMUserSubscriptionRepository) .toConstantValue(appDataSource.getRepository(UserSubscription)) container .bind>(TYPES.Auth_ORMSessionTraceRepository) .toConstantValue(appDataSource.getRepository(TypeORMSessionTrace)) container .bind>(TYPES.Auth_ORMAuthenticatorRepository) .toConstantValue(appDataSource.getRepository(TypeORMAuthenticator)) container .bind>(TYPES.Auth_ORMAuthenticatorChallengeRepository) .toConstantValue(appDataSource.getRepository(TypeORMAuthenticatorChallenge)) container .bind>(TYPES.Auth_ORMCacheEntryRepository) .toConstantValue(appDataSource.getRepository(TypeORMCacheEntry)) container .bind>(TYPES.Auth_ORMSharedVaultUserRepository) .toConstantValue(appDataSource.getRepository(TypeORMSharedVaultUser)) // Repositories container.bind(TYPES.Auth_SessionRepository).to(TypeORMSessionRepository) container .bind(TYPES.Auth_RevokedSessionRepository) .to(TypeORMRevokedSessionRepository) container.bind(TYPES.Auth_UserRepository).to(TypeORMUserRepository) container.bind(TYPES.Auth_SettingRepository).to(TypeORMSettingRepository) container .bind(TYPES.Auth_SubscriptionSettingRepository) .to(TypeORMSubscriptionSettingRepository) container .bind(TYPES.Auth_OfflineSettingRepository) .to(TypeORMOfflineSettingRepository) container.bind(TYPES.Auth_RoleRepository).to(TypeORMRoleRepository) container .bind(TYPES.Auth_UserSubscriptionRepository) .to(TypeORMUserSubscriptionRepository) container .bind(TYPES.Auth_OfflineUserSubscriptionRepository) .to(TypeORMOfflineUserSubscriptionRepository) container .bind(TYPES.Auth_SharedSubscriptionInvitationRepository) .to(TypeORMSharedSubscriptionInvitationRepository) container .bind(TYPES.Auth_SessionTraceRepository) .toConstantValue( new TypeORMSessionTraceRepository( container.get>(TYPES.Auth_ORMSessionTraceRepository), container.get>(TYPES.Auth_SessionTracePersistenceMapper), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_AuthenticatorRepository) .toConstantValue( new TypeORMAuthenticatorRepository( container.get(TYPES.Auth_ORMAuthenticatorRepository), container.get(TYPES.Auth_AuthenticatorPersistenceMapper), ), ) container .bind(TYPES.Auth_AuthenticatorChallengeRepository) .toConstantValue( new TypeORMAuthenticatorChallengeRepository( container.get(TYPES.Auth_ORMAuthenticatorChallengeRepository), container.get(TYPES.Auth_AuthenticatorChallengePersistenceMapper), ), ) container .bind(TYPES.Auth_CacheEntryRepository) .toConstantValue( new TypeORMCacheEntryRepository( container.get(TYPES.Auth_ORMCacheEntryRepository), container.get(TYPES.Auth_CacheEntryPersistenceMapper), ), ) container .bind(TYPES.Auth_SharedVaultUserRepository) .toConstantValue( new TypeORMSharedVaultUserRepository( container.get>(TYPES.Auth_ORMSharedVaultUserRepository), container.get>( TYPES.Auth_SharedVaultUserPersistenceMapper, ), ), ) // Projectors container.bind(TYPES.Auth_SessionProjector).to(SessionProjector) container.bind(TYPES.Auth_UserProjector).to(UserProjector) container.bind(TYPES.Auth_RoleProjector).to(RoleProjector) container.bind(TYPES.Auth_PermissionProjector).to(PermissionProjector) container.bind(TYPES.Auth_SettingProjector).to(SettingProjector) container .bind(TYPES.Auth_SubscriptionSettingProjector) .to(SubscriptionSettingProjector) // Factories container.bind(TYPES.Auth_SettingFactory).to(SettingFactory) // env vars container.bind(TYPES.Auth_JWT_SECRET).toConstantValue(env.get('JWT_SECRET')) container.bind(TYPES.Auth_LEGACY_JWT_SECRET).toConstantValue(env.get('LEGACY_JWT_SECRET', true)) container.bind(TYPES.Auth_AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET')) container .bind(TYPES.Auth_AUTH_JWT_TTL) .toConstantValue(env.get('AUTH_JWT_TTL', true) ? +env.get('AUTH_JWT_TTL') : 60_000) container.bind(TYPES.Auth_VALET_TOKEN_SECRET).toConstantValue(env.get('VALET_TOKEN_SECRET', true)) container .bind(TYPES.Auth_VALET_TOKEN_TTL) .toConstantValue(env.get('VALET_TOKEN_TTL', true) ? +env.get('VALET_TOKEN_TTL', true) : 7200) container .bind(TYPES.Auth_WEB_SOCKET_CONNECTION_TOKEN_SECRET) .toConstantValue(env.get('WEB_SOCKET_CONNECTION_TOKEN_SECRET', true)) container.bind(TYPES.Auth_ENCRYPTION_SERVER_KEY).toConstantValue(env.get('ENCRYPTION_SERVER_KEY')) container .bind(TYPES.Auth_ACCESS_TOKEN_AGE) .toConstantValue(env.get('ACCESS_TOKEN_AGE', true) ? +env.get('ACCESS_TOKEN_AGE', true) : 5184000) container .bind(TYPES.Auth_REFRESH_TOKEN_AGE) .toConstantValue(env.get('REFRESH_TOKEN_AGE', true) ? +env.get('REFRESH_TOKEN_AGE', true) : 31556926) container .bind(TYPES.Auth_MAX_LOGIN_ATTEMPTS) .toConstantValue(env.get('MAX_LOGIN_ATTEMPTS', true) ? +env.get('MAX_LOGIN_ATTEMPTS', true) : 6) container .bind(TYPES.Auth_FAILED_LOGIN_LOCKOUT) .toConstantValue(env.get('FAILED_LOGIN_LOCKOUT', true) ? +env.get('FAILED_LOGIN_LOCKOUT', true) : 3600) container.bind(TYPES.Auth_PSEUDO_KEY_PARAMS_KEY).toConstantValue(env.get('PSEUDO_KEY_PARAMS_KEY')) container .bind(TYPES.Auth_EPHEMERAL_SESSION_AGE) .toConstantValue(env.get('EPHEMERAL_SESSION_AGE', true) ? +env.get('EPHEMERAL_SESSION_AGE', true) : 259200) container.bind(TYPES.Auth_REDIS_URL).toConstantValue(env.get('REDIS_URL', true)) container .bind(TYPES.Auth_DISABLE_USER_REGISTRATION) .toConstantValue(env.get('DISABLE_USER_REGISTRATION', true) === 'true') container.bind(TYPES.Auth_SNS_TOPIC_ARN).toConstantValue(env.get('SNS_TOPIC_ARN', true)) container.bind(TYPES.Auth_SNS_AWS_REGION).toConstantValue(env.get('SNS_AWS_REGION', true)) container.bind(TYPES.Auth_SQS_QUEUE_URL).toConstantValue(env.get('SQS_QUEUE_URL', true)) container .bind(TYPES.Auth_USER_SERVER_REGISTRATION_URL) .toConstantValue(env.get('USER_SERVER_REGISTRATION_URL', true)) container.bind(TYPES.Auth_USER_SERVER_AUTH_KEY).toConstantValue(env.get('USER_SERVER_AUTH_KEY', true)) container .bind(TYPES.Auth_USER_SERVER_CHANGE_EMAIL_URL) .toConstantValue(env.get('USER_SERVER_CHANGE_EMAIL_URL', true)) container.bind(TYPES.Auth_NEW_RELIC_ENABLED).toConstantValue(env.get('NEW_RELIC_ENABLED', true)) container.bind(TYPES.Auth_SYNCING_SERVER_URL).toConstantValue(env.get('SYNCING_SERVER_URL', true)) container.bind(TYPES.Auth_VERSION).toConstantValue(env.get('VERSION', true) ?? 'development') container.bind(TYPES.Auth_PAYMENTS_SERVER_URL).toConstantValue(env.get('PAYMENTS_SERVER_URL', true)) container .bind(TYPES.Auth_SESSION_TRACE_DAYS_TTL) .toConstantValue(env.get('SESSION_TRACE_DAYS_TTL', true) ? +env.get('SESSION_TRACE_DAYS_TTL', true) : 90) container .bind(TYPES.Auth_U2F_RELYING_PARTY_NAME) .toConstantValue(env.get('U2F_RELYING_PARTY_NAME', true) ?? 'Standard Notes') container .bind(TYPES.Auth_U2F_RELYING_PARTY_ID) .toConstantValue(env.get('U2F_RELYING_PARTY_ID', true) ?? 'app.standardnotes.com') container .bind(TYPES.Auth_U2F_EXPECTED_ORIGIN) .toConstantValue( env.get('U2F_EXPECTED_ORIGIN', true) ? env.get('U2F_EXPECTED_ORIGIN', true).split(',') : ['https://app.standardnotes.com'], ) container .bind(TYPES.Auth_U2F_REQUIRE_USER_VERIFICATION) .toConstantValue(env.get('U2F_REQUIRE_USER_VERIFICATION', true) === 'true') container .bind(TYPES.Auth_READONLY_USERS) .toConstantValue(env.get('READONLY_USERS', true) ? env.get('READONLY_USERS', true).split(',') : []) if (isConfiguredForInMemoryCache) { container .bind(TYPES.Auth_PKCERepository) .toConstantValue( new TypeORMPKCERepository( container.get(TYPES.Auth_CacheEntryRepository), container.get(TYPES.Auth_Logger), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_LockRepository) .toConstantValue( new TypeORMLockRepository( container.get(TYPES.Auth_CacheEntryRepository), container.get(TYPES.Auth_Timer), container.get(TYPES.Auth_MAX_LOGIN_ATTEMPTS), container.get(TYPES.Auth_FAILED_LOGIN_LOCKOUT), ), ) container .bind(TYPES.Auth_EphemeralSessionRepository) .toConstantValue( new TypeORMEphemeralSessionRepository( container.get(TYPES.Auth_CacheEntryRepository), container.get(TYPES.Auth_EPHEMERAL_SESSION_AGE), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_OfflineSubscriptionTokenRepository) .toConstantValue( new TypeORMOfflineSubscriptionTokenRepository( container.get(TYPES.Auth_CacheEntryRepository), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_SubscriptionTokenRepository) .toConstantValue( new TypeORMSubscriptionTokenRepository( container.get(TYPES.Auth_CacheEntryRepository), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_TransitionStatusRepository) .toConstantValue(new InMemoryTransitionStatusRepository()) } else { container.bind(TYPES.Auth_PKCERepository).to(RedisPKCERepository) container.bind(TYPES.Auth_LockRepository).to(LockRepository) container .bind(TYPES.Auth_EphemeralSessionRepository) .to(RedisEphemeralSessionRepository) container .bind(TYPES.Auth_OfflineSubscriptionTokenRepository) .to(RedisOfflineSubscriptionTokenRepository) container .bind(TYPES.Auth_SubscriptionTokenRepository) .to(RedisSubscriptionTokenRepository) container .bind(TYPES.Auth_TransitionStatusRepository) .toConstantValue(new RedisTransitionStatusRepository(container.get(TYPES.Auth_Redis))) } // Services container.bind(TYPES.Auth_DeviceDetector).toConstantValue(new UAParser()) container.bind(TYPES.Auth_SessionService).to(SessionService) container.bind(TYPES.Auth_AuthResponseFactory20161215).to(AuthResponseFactory20161215) container.bind(TYPES.Auth_AuthResponseFactory20190520).to(AuthResponseFactory20190520) container.bind(TYPES.Auth_AuthResponseFactory20200115).to(AuthResponseFactory20200115) container.bind(TYPES.Auth_AuthResponseFactoryResolver).to(AuthResponseFactoryResolver) container.bind(TYPES.Auth_KeyParamsFactory).to(KeyParamsFactory) container .bind>(TYPES.Auth_SessionTokenDecoder) .toConstantValue(new TokenDecoder(container.get(TYPES.Auth_JWT_SECRET))) container .bind>(TYPES.Auth_FallbackSessionTokenDecoder) .toConstantValue(new TokenDecoder(container.get(TYPES.Auth_LEGACY_JWT_SECRET))) container .bind>(TYPES.Auth_CrossServiceTokenDecoder) .toConstantValue(new TokenDecoder(container.get(TYPES.Auth_AUTH_JWT_SECRET))) container .bind>(TYPES.Auth_OfflineUserTokenDecoder) .toConstantValue(new TokenDecoder(container.get(TYPES.Auth_AUTH_JWT_SECRET))) container .bind>(TYPES.Auth_WebSocketConnectionTokenDecoder) .toConstantValue( new TokenDecoder(container.get(TYPES.Auth_WEB_SOCKET_CONNECTION_TOKEN_SECRET)), ) container .bind>(TYPES.Auth_OfflineUserTokenEncoder) .toConstantValue(new TokenEncoder(container.get(TYPES.Auth_AUTH_JWT_SECRET))) container .bind>(TYPES.Auth_SessionTokenEncoder) .toConstantValue(new TokenEncoder(container.get(TYPES.Auth_JWT_SECRET))) container .bind>(TYPES.Auth_CrossServiceTokenEncoder) .toConstantValue(new TokenEncoder(container.get(TYPES.Auth_AUTH_JWT_SECRET))) container .bind>(TYPES.Auth_ValetTokenEncoder) .toConstantValue(new TokenEncoder(container.get(TYPES.Auth_VALET_TOKEN_SECRET))) container .bind(TYPES.Auth_AuthenticationMethodResolver) .to(AuthenticationMethodResolver) container.bind(TYPES.Auth_DomainEventFactory).to(DomainEventFactory) container.bind(TYPES.Auth_HTTPClient).toConstantValue(axios.create()) container.bind(TYPES.Auth_Crypter).to(CrypterNode) container.bind(TYPES.Auth_SettingService).to(SettingService) container .bind(TYPES.Auth_SubscriptionSettingService) .to(SubscriptionSettingService) container.bind(TYPES.Auth_OfflineSettingService).to(OfflineSettingService) container.bind(TYPES.Auth_CryptoNode).toConstantValue(new CryptoNode()) container.bind(TYPES.Auth_ContenDecoder).toConstantValue(new ContentDecoder()) container.bind(TYPES.Auth_WebSocketsClientService).to(WebSocketsClientService) container.bind(TYPES.Auth_RoleService).to(RoleService) container.bind(TYPES.Auth_RoleToSubscriptionMap).to(RoleToSubscriptionMap) container .bind(TYPES.Auth_SettingsAssociationService) .to(SettingsAssociationService) container .bind(TYPES.Auth_SubscriptionSettingsAssociationService) .to(SubscriptionSettingsAssociationService) container.bind(TYPES.Auth_FeatureService).to(FeatureService) container.bind(TYPES.Auth_SettingInterpreter).to(SettingInterpreter) container.bind(TYPES.Auth_SettingDecrypter).to(SettingDecrypter) container .bind>(TYPES.Auth_ProtocolVersionSelector) .toConstantValue(new DeterministicSelector()) container .bind>(TYPES.Auth_BooleanSelector) .toConstantValue(new DeterministicSelector()) container.bind(TYPES.Auth_UserSubscriptionService).to(UserSubscriptionService) container .bind(TYPES.Auth_DomainEventPublisher) .toConstantValue( isConfiguredForHomeServer ? directCallDomainEventPublisher : new SNSDomainEventPublisher(container.get(TYPES.Auth_SNS), container.get(TYPES.Auth_SNS_TOPIC_ARN)), ) // Middleware container.bind(TYPES.Auth_SessionMiddleware).to(SessionMiddleware) container.bind(TYPES.Auth_LockMiddleware).to(LockMiddleware) container .bind(TYPES.Auth_RequiredCrossServiceTokenMiddleware) .toConstantValue( new RequiredCrossServiceTokenMiddleware( container.get>(TYPES.Auth_CrossServiceTokenDecoder), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_OptionalCrossServiceTokenMiddleware) .toConstantValue( new OptionalCrossServiceTokenMiddleware( container.get>(TYPES.Auth_CrossServiceTokenDecoder), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_ApiGatewayOfflineAuthMiddleware) .to(ApiGatewayOfflineAuthMiddleware) container.bind(TYPES.Auth_OfflineUserAuthMiddleware).to(OfflineUserAuthMiddleware) // use cases container .bind(TYPES.Auth_TraceSession) .toConstantValue( new TraceSession( container.get(TYPES.Auth_SessionTraceRepository), container.get(TYPES.Auth_Timer), container.get(TYPES.Auth_SESSION_TRACE_DAYS_TTL), ), ) container .bind(TYPES.Auth_PersistStatistics) .toConstantValue( new PersistStatistics( container.get(TYPES.Auth_SessionTraceRepository), container.get(TYPES.Auth_DomainEventPublisher), container.get(TYPES.Auth_DomainEventFactory), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_GenerateAuthenticatorRegistrationOptions) .toConstantValue( new GenerateAuthenticatorRegistrationOptions( container.get(TYPES.Auth_AuthenticatorRepository), container.get(TYPES.Auth_AuthenticatorChallengeRepository), container.get(TYPES.Auth_U2F_RELYING_PARTY_NAME), container.get(TYPES.Auth_U2F_RELYING_PARTY_ID), container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_FeatureService), ), ) container .bind(TYPES.Auth_VerifyAuthenticatorRegistrationResponse) .toConstantValue( new VerifyAuthenticatorRegistrationResponse( container.get(TYPES.Auth_AuthenticatorRepository), container.get(TYPES.Auth_AuthenticatorChallengeRepository), container.get(TYPES.Auth_U2F_RELYING_PARTY_ID), container.get(TYPES.Auth_U2F_EXPECTED_ORIGIN), container.get(TYPES.Auth_U2F_REQUIRE_USER_VERIFICATION), container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_FeatureService), ), ) container .bind(TYPES.Auth_GenerateAuthenticatorAuthenticationOptions) .toConstantValue( new GenerateAuthenticatorAuthenticationOptions( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_AuthenticatorRepository), container.get(TYPES.Auth_AuthenticatorChallengeRepository), container.get(TYPES.Auth_PSEUDO_KEY_PARAMS_KEY), ), ) container .bind(TYPES.Auth_VerifyAuthenticatorAuthenticationResponse) .toConstantValue( new VerifyAuthenticatorAuthenticationResponse( container.get(TYPES.Auth_AuthenticatorRepository), container.get(TYPES.Auth_AuthenticatorChallengeRepository), container.get(TYPES.Auth_U2F_RELYING_PARTY_ID), container.get(TYPES.Auth_U2F_EXPECTED_ORIGIN), container.get(TYPES.Auth_U2F_REQUIRE_USER_VERIFICATION), ), ) container .bind(TYPES.Auth_ListAuthenticators) .toConstantValue( new ListAuthenticators( container.get(TYPES.Auth_AuthenticatorRepository), container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_FeatureService), ), ) container .bind(TYPES.Auth_DeleteAuthenticator) .toConstantValue( new DeleteAuthenticator( container.get(TYPES.Auth_AuthenticatorRepository), container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_FeatureService), ), ) container .bind(TYPES.Auth_GenerateRecoveryCodes) .toConstantValue( new GenerateRecoveryCodes( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_SettingService), container.get(TYPES.Auth_CryptoNode), ), ) container .bind(TYPES.Auth_ActivatePremiumFeatures) .toConstantValue( new ActivatePremiumFeatures( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_UserSubscriptionRepository), container.get(TYPES.Auth_SubscriptionSettingService), container.get(TYPES.Auth_RoleService), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_CleanupSessionTraces) .toConstantValue(new CleanupSessionTraces(container.get(TYPES.Auth_SessionTraceRepository))) container .bind(TYPES.Auth_CleanupExpiredSessions) .toConstantValue(new CleanupExpiredSessions(container.get(TYPES.Auth_SessionRepository))) container.bind(TYPES.Auth_AuthenticateUser).to(AuthenticateUser) container.bind(TYPES.Auth_AuthenticateRequest).to(AuthenticateRequest) container.bind(TYPES.Auth_RefreshSessionToken).to(RefreshSessionToken) container.bind(TYPES.Auth_SignIn).to(SignIn) container.bind(TYPES.Auth_VerifyMFA).to(VerifyMFA) container.bind(TYPES.Auth_ClearLoginAttempts).to(ClearLoginAttempts) container.bind(TYPES.Auth_IncreaseLoginAttempts).to(IncreaseLoginAttempts) container .bind(TYPES.Auth_GetUserKeyParamsRecovery) .toConstantValue( new GetUserKeyParamsRecovery( container.get(TYPES.Auth_KeyParamsFactory), container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_PKCERepository), container.get(TYPES.Auth_SettingService), ), ) container.bind(TYPES.Auth_GetUserKeyParams).to(GetUserKeyParams) container.bind(TYPES.Auth_UpdateUser).to(UpdateUser) container.bind(TYPES.Auth_Register).to(Register) container.bind(TYPES.Auth_GetActiveSessionsForUser).to(GetActiveSessionsForUser) container.bind(TYPES.Auth_DeleteOtherSessionsForUser).to(DeleteOtherSessionsForUser) container.bind(TYPES.Auth_DeleteSessionForUser).to(DeleteSessionForUser) container.bind(TYPES.Auth_ChangeCredentials).to(ChangeCredentials) container.bind(TYPES.Auth_GetSettings).to(GetSettings) container.bind(TYPES.Auth_GetSetting).to(GetSetting) container.bind(TYPES.Auth_GetUserFeatures).to(GetUserFeatures) container.bind(TYPES.Auth_UpdateSetting).to(UpdateSetting) container.bind(TYPES.Auth_DeleteSetting).to(DeleteSetting) container .bind(TYPES.Auth_SignInWithRecoveryCodes) .toConstantValue( new SignInWithRecoveryCodes( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_AuthResponseFactory20200115), container.get(TYPES.Auth_PKCERepository), container.get(TYPES.Auth_Crypter), container.get(TYPES.Auth_SettingService), container.get(TYPES.Auth_GenerateRecoveryCodes), container.get(TYPES.Auth_IncreaseLoginAttempts), container.get(TYPES.Auth_ClearLoginAttempts), container.get(TYPES.Auth_DeleteSetting), container.get(TYPES.Auth_AuthenticatorRepository), ), ) container.bind(TYPES.Auth_DeleteAccount).to(DeleteAccount) container.bind(TYPES.Auth_GetUserSubscription).to(GetUserSubscription) container.bind(TYPES.Auth_GetUserOfflineSubscription).to(GetUserOfflineSubscription) container.bind(TYPES.Auth_CreateSubscriptionToken).to(CreateSubscriptionToken) container .bind(TYPES.Auth_AuthenticateSubscriptionToken) .to(AuthenticateSubscriptionToken) container .bind(TYPES.Auth_AuthenticateOfflineSubscriptionToken) .to(AuthenticateOfflineSubscriptionToken) container .bind(TYPES.Auth_CreateOfflineSubscriptionToken) .to(CreateOfflineSubscriptionToken) container.bind(TYPES.Auth_CreateValetToken).to(CreateValetToken) container.bind(TYPES.Auth_CreateListedAccount).to(CreateListedAccount) container.bind(TYPES.Auth_InviteToSharedSubscription).to(InviteToSharedSubscription) container .bind(TYPES.Auth_AcceptSharedSubscriptionInvitation) .to(AcceptSharedSubscriptionInvitation) container .bind(TYPES.Auth_DeclineSharedSubscriptionInvitation) .to(DeclineSharedSubscriptionInvitation) container .bind(TYPES.Auth_CancelSharedSubscriptionInvitation) .to(CancelSharedSubscriptionInvitation) container .bind(TYPES.Auth_ListSharedSubscriptionInvitations) .to(ListSharedSubscriptionInvitations) container.bind(TYPES.Auth_VerifyPredicate).to(VerifyPredicate) container.bind(TYPES.Auth_CreateCrossServiceToken).to(CreateCrossServiceToken) container.bind(TYPES.Auth_ProcessUserRequest).to(ProcessUserRequest) container .bind(TYPES.Auth_UpdateStorageQuotaUsedForUser) .toConstantValue( new UpdateStorageQuotaUsedForUser( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_UserSubscriptionService), container.get(TYPES.Auth_SubscriptionSettingService), ), ) container .bind(TYPES.Auth_UpdateTransitionStatus) .toConstantValue( new UpdateTransitionStatus( container.get(TYPES.Auth_TransitionStatusRepository), container.get(TYPES.Auth_RoleService), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_AddSharedVaultUser) .toConstantValue( new AddSharedVaultUser(container.get(TYPES.Auth_SharedVaultUserRepository)), ) container .bind(TYPES.Auth_RemoveSharedVaultUser) .toConstantValue( new RemoveSharedVaultUser( container.get(TYPES.Auth_SharedVaultUserRepository), ), ) container .bind(TYPES.Auth_DesignateSurvivor) .toConstantValue( new DesignateSurvivor( container.get(TYPES.Auth_SharedVaultUserRepository), container.get(TYPES.Auth_Timer), ), ) container .bind(TYPES.Auth_DisableEmailSettingBasedOnEmailSubscription) .toConstantValue( new DisableEmailSettingBasedOnEmailSubscription( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_SettingRepository), container.get(TYPES.Auth_SettingFactory), ), ) // Controller container .bind(TYPES.Auth_ControllerContainer) .toConstantValue(configuration?.controllerConatiner ?? new ControllerContainer()) container .bind(TYPES.Auth_AuthController) .toConstantValue( new AuthController( container.get(TYPES.Auth_ClearLoginAttempts), container.get(TYPES.Auth_Register), container.get(TYPES.Auth_DomainEventPublisher), container.get(TYPES.Auth_DomainEventFactory), container.get(TYPES.Auth_SignInWithRecoveryCodes), container.get(TYPES.Auth_GetUserKeyParamsRecovery), container.get(TYPES.Auth_GenerateRecoveryCodes), container.get(TYPES.Auth_Logger), container.get(TYPES.Auth_SessionService), ), ) container .bind(TYPES.Auth_AuthenticatorsController) .toConstantValue( new AuthenticatorsController( container.get(TYPES.Auth_GenerateAuthenticatorRegistrationOptions), container.get(TYPES.Auth_VerifyAuthenticatorRegistrationResponse), container.get(TYPES.Auth_GenerateAuthenticatorAuthenticationOptions), container.get(TYPES.Auth_ListAuthenticators), container.get(TYPES.Auth_DeleteAuthenticator), container.get(TYPES.Auth_AuthenticatorHttpMapper), ), ) container .bind(TYPES.Auth_SubscriptionInvitesController) .to(SubscriptionInvitesController) container.bind(TYPES.Auth_UserRequestsController).to(UserRequestsController) // Handlers container.bind(TYPES.Auth_UserRegisteredEventHandler).to(UserRegisteredEventHandler) container .bind(TYPES.Auth_AccountDeletionRequestedEventHandler) .toConstantValue( new AccountDeletionRequestedEventHandler( container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_SessionRepository), container.get(TYPES.Auth_EphemeralSessionRepository), container.get(TYPES.Auth_RevokedSessionRepository), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_SubscriptionPurchasedEventHandler) .to(SubscriptionPurchasedEventHandler) container .bind(TYPES.Auth_SubscriptionCancelledEventHandler) .to(SubscriptionCancelledEventHandler) container .bind(TYPES.Auth_SubscriptionRenewedEventHandler) .to(SubscriptionRenewedEventHandler) container .bind(TYPES.Auth_SubscriptionRefundedEventHandler) .to(SubscriptionRefundedEventHandler) container .bind(TYPES.Auth_SubscriptionExpiredEventHandler) .to(SubscriptionExpiredEventHandler) container .bind(TYPES.Auth_SubscriptionSyncRequestedEventHandler) .to(SubscriptionSyncRequestedEventHandler) container .bind(TYPES.Auth_ExtensionKeyGrantedEventHandler) .to(ExtensionKeyGrantedEventHandler) container .bind(TYPES.Auth_SubscriptionReassignedEventHandler) .to(SubscriptionReassignedEventHandler) container .bind(TYPES.Auth_UserEmailChangedEventHandler) .to(UserEmailChangedEventHandler) container .bind(TYPES.Auth_FileUploadedEventHandler) .toConstantValue( new FileUploadedEventHandler( container.get(TYPES.Auth_UpdateStorageQuotaUsedForUser), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_SharedVaultFileUploadedEventHandler) .toConstantValue( new SharedVaultFileUploadedEventHandler( container.get(TYPES.Auth_UpdateStorageQuotaUsedForUser), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_SharedVaultFileMovedEventHandler) .toConstantValue( new SharedVaultFileMovedEventHandler( container.get(TYPES.Auth_UpdateStorageQuotaUsedForUser), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_FileRemovedEventHandler) .toConstantValue( new FileRemovedEventHandler( container.get(TYPES.Auth_UpdateStorageQuotaUsedForUser), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_SharedVaultFileRemovedEventHandler) .toConstantValue( new SharedVaultFileRemovedEventHandler( container.get(TYPES.Auth_UpdateStorageQuotaUsedForUser), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_ListedAccountCreatedEventHandler) .to(ListedAccountCreatedEventHandler) container .bind(TYPES.Auth_ListedAccountDeletedEventHandler) .to(ListedAccountDeletedEventHandler) container .bind(TYPES.Auth_UserDisabledSessionUserAgentLoggingEventHandler) .to(UserDisabledSessionUserAgentLoggingEventHandler) container .bind(TYPES.Auth_SharedSubscriptionInvitationCreatedEventHandler) .to(SharedSubscriptionInvitationCreatedEventHandler) container .bind(TYPES.Auth_PredicateVerificationRequestedEventHandler) .to(PredicateVerificationRequestedEventHandler) container .bind(TYPES.Auth_EmailSubscriptionUnsubscribedEventHandler) .toConstantValue( new EmailSubscriptionUnsubscribedEventHandler( container.get( TYPES.Auth_DisableEmailSettingBasedOnEmailSubscription, ), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_PaymentsAccountDeletedEventHandler) .toConstantValue( new PaymentsAccountDeletedEventHandler( container.get(TYPES.Auth_DeleteAccount), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_TransitionStatusUpdatedEventHandler) .toConstantValue( new TransitionStatusUpdatedEventHandler( container.get(TYPES.Auth_UpdateTransitionStatus), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_UserAddedToSharedVaultEventHandler) .toConstantValue( new UserAddedToSharedVaultEventHandler( container.get(TYPES.Auth_AddSharedVaultUser), container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_UserRemovedFromSharedVaultEventHandler) .toConstantValue( new UserRemovedFromSharedVaultEventHandler( container.get(TYPES.Auth_RemoveSharedVaultUser), container.get(TYPES.Auth_Logger), ), ) container .bind( TYPES.Auth_UserDesignatedAsSurvivorInSharedVaultEventHandler, ) .toConstantValue( new UserDesignatedAsSurvivorInSharedVaultEventHandler( container.get(TYPES.Auth_DesignateSurvivor), container.get(TYPES.Auth_Logger), ), ) const eventHandlers: Map = new Map([ ['USER_REGISTERED', container.get(TYPES.Auth_UserRegisteredEventHandler)], ['ACCOUNT_DELETION_REQUESTED', container.get(TYPES.Auth_AccountDeletionRequestedEventHandler)], ['SUBSCRIPTION_PURCHASED', container.get(TYPES.Auth_SubscriptionPurchasedEventHandler)], ['SUBSCRIPTION_CANCELLED', container.get(TYPES.Auth_SubscriptionCancelledEventHandler)], ['SUBSCRIPTION_RENEWED', container.get(TYPES.Auth_SubscriptionRenewedEventHandler)], ['SUBSCRIPTION_REFUNDED', container.get(TYPES.Auth_SubscriptionRefundedEventHandler)], ['SUBSCRIPTION_EXPIRED', container.get(TYPES.Auth_SubscriptionExpiredEventHandler)], ['SUBSCRIPTION_SYNC_REQUESTED', container.get(TYPES.Auth_SubscriptionSyncRequestedEventHandler)], ['EXTENSION_KEY_GRANTED', container.get(TYPES.Auth_ExtensionKeyGrantedEventHandler)], ['SUBSCRIPTION_REASSIGNED', container.get(TYPES.Auth_SubscriptionReassignedEventHandler)], ['USER_EMAIL_CHANGED', container.get(TYPES.Auth_UserEmailChangedEventHandler)], ['FILE_UPLOADED', container.get(TYPES.Auth_FileUploadedEventHandler)], ['SHARED_VAULT_FILE_UPLOADED', container.get(TYPES.Auth_SharedVaultFileUploadedEventHandler)], ['SHARED_VAULT_FILE_MOVED', container.get(TYPES.Auth_SharedVaultFileMovedEventHandler)], ['FILE_REMOVED', container.get(TYPES.Auth_FileRemovedEventHandler)], ['SHARED_VAULT_FILE_REMOVED', container.get(TYPES.Auth_SharedVaultFileRemovedEventHandler)], ['LISTED_ACCOUNT_CREATED', container.get(TYPES.Auth_ListedAccountCreatedEventHandler)], ['LISTED_ACCOUNT_DELETED', container.get(TYPES.Auth_ListedAccountDeletedEventHandler)], [ 'USER_DISABLED_SESSION_USER_AGENT_LOGGING', container.get(TYPES.Auth_UserDisabledSessionUserAgentLoggingEventHandler), ], [ 'SHARED_SUBSCRIPTION_INVITATION_CREATED', container.get(TYPES.Auth_SharedSubscriptionInvitationCreatedEventHandler), ], ['PREDICATE_VERIFICATION_REQUESTED', container.get(TYPES.Auth_PredicateVerificationRequestedEventHandler)], ['EMAIL_SUBSCRIPTION_UNSUBSCRIBED', container.get(TYPES.Auth_EmailSubscriptionUnsubscribedEventHandler)], ['PAYMENTS_ACCOUNT_DELETED', container.get(TYPES.Auth_PaymentsAccountDeletedEventHandler)], ['TRANSITION_STATUS_UPDATED', container.get(TYPES.Auth_TransitionStatusUpdatedEventHandler)], ['USER_ADDED_TO_SHARED_VAULT', container.get(TYPES.Auth_UserAddedToSharedVaultEventHandler)], ['USER_REMOVED_FROM_SHARED_VAULT', container.get(TYPES.Auth_UserRemovedFromSharedVaultEventHandler)], [ 'USER_DESIGNATED_AS_SURVIVOR_IN_SHARED_VAULT', container.get(TYPES.Auth_UserDesignatedAsSurvivorInSharedVaultEventHandler), ], ]) if (isConfiguredForHomeServer) { const directCallEventMessageHandler = new DirectCallEventMessageHandler( eventHandlers, container.get(TYPES.Auth_Logger), ) directCallDomainEventPublisher.register(directCallEventMessageHandler) container .bind(TYPES.Auth_DomainEventMessageHandler) .toConstantValue(directCallEventMessageHandler) } else { container .bind(TYPES.Auth_DomainEventMessageHandler) .toConstantValue( isConfiguredForHomeServerOrSelfHosting ? new SQSEventMessageHandler(eventHandlers, container.get(TYPES.Auth_Logger)) : new SQSOpenTelemetryEventMessageHandler( ServiceIdentifier.NAMES.AuthWorker, eventHandlers, container.get(TYPES.Auth_Logger), ), ) container .bind(TYPES.Auth_DomainEventSubscriberFactory) .toConstantValue( new SQSDomainEventSubscriberFactory( container.get(TYPES.Auth_SQS), container.get(TYPES.Auth_SQS_QUEUE_URL), container.get(TYPES.Auth_DomainEventMessageHandler), ), ) } container .bind(TYPES.Auth_BaseAuthController) .toConstantValue( new BaseAuthController( container.get(TYPES.Auth_VerifyMFA), container.get(TYPES.Auth_SignIn), container.get(TYPES.Auth_GetUserKeyParams), container.get(TYPES.Auth_ClearLoginAttempts), container.get(TYPES.Auth_IncreaseLoginAttempts), container.get(TYPES.Auth_Logger), container.get(TYPES.Auth_AuthController), container.get(TYPES.Auth_ControllerContainer), ), ) // Inversify Controllers if (isConfiguredForHomeServer) { container .bind(TYPES.Auth_BaseAuthenticatorsController) .toConstantValue( new BaseAuthenticatorsController( container.get(TYPES.Auth_AuthenticatorsController), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseSubscriptionInvitesController) .toConstantValue( new BaseSubscriptionInvitesController( container.get(TYPES.Auth_SubscriptionInvitesController), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseUserRequestsController) .toConstantValue( new BaseUserRequestsController( container.get(TYPES.Auth_UserRequestsController), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseWebSocketsController) .toConstantValue( new BaseWebSocketsController( container.get(TYPES.Auth_CreateCrossServiceToken), container.get(TYPES.Auth_WebSocketConnectionTokenDecoder), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseSessionsController) .toConstantValue( new BaseSessionsController( container.get(TYPES.Auth_GetActiveSessionsForUser), container.get(TYPES.Auth_AuthenticateRequest), container.get(TYPES.Auth_SessionProjector), container.get(TYPES.Auth_CreateCrossServiceToken), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseValetTokenController) .toConstantValue( new BaseValetTokenController( container.get(TYPES.Auth_CreateValetToken), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseUsersController) .toConstantValue( new BaseUsersController( container.get(TYPES.Auth_UpdateUser), container.get(TYPES.Auth_GetUserKeyParams), container.get(TYPES.Auth_DeleteAccount), container.get(TYPES.Auth_GetUserSubscription), container.get(TYPES.Auth_ClearLoginAttempts), container.get(TYPES.Auth_IncreaseLoginAttempts), container.get(TYPES.Auth_ChangeCredentials), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseAdminController) .toConstantValue( new BaseAdminController( container.get(TYPES.Auth_DeleteSetting), container.get(TYPES.Auth_UserRepository), container.get(TYPES.Auth_CreateSubscriptionToken), container.get(TYPES.Auth_CreateOfflineSubscriptionToken), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseSubscriptionTokensController) .toConstantValue( new BaseSubscriptionTokensController( container.get(TYPES.Auth_CreateSubscriptionToken), container.get(TYPES.Auth_AuthenticateSubscriptionToken), container.get(TYPES.Auth_SettingService), container.get(TYPES.Auth_UserProjector), container.get(TYPES.Auth_RoleProjector), container.get(TYPES.Auth_CrossServiceTokenEncoder), container.get(TYPES.Auth_AUTH_JWT_TTL), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseSubscriptionSettingsController) .toConstantValue( new BaseSubscriptionSettingsController( container.get(TYPES.Auth_GetSetting), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseSettingsController) .toConstantValue( new BaseSettingsController( container.get(TYPES.Auth_GetSettings), container.get(TYPES.Auth_GetSetting), container.get(TYPES.Auth_UpdateSetting), container.get(TYPES.Auth_DeleteSetting), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseSessionController) .toConstantValue( new BaseSessionController( container.get(TYPES.Auth_DeleteSessionForUser), container.get(TYPES.Auth_DeleteOtherSessionsForUser), container.get(TYPES.Auth_RefreshSessionToken), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseOfflineController) .toConstantValue( new BaseOfflineController( container.get(TYPES.Auth_GetUserFeatures), container.get(TYPES.Auth_GetUserOfflineSubscription), container.get(TYPES.Auth_CreateOfflineSubscriptionToken), container.get(TYPES.Auth_AuthenticateOfflineSubscriptionToken), container.get(TYPES.Auth_OfflineUserTokenEncoder), container.get(TYPES.Auth_AUTH_JWT_TTL), container.get(TYPES.Auth_Logger), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseListedController) .toConstantValue( new BaseListedController( container.get(TYPES.Auth_CreateListedAccount), container.get(TYPES.Auth_ControllerContainer), ), ) container .bind(TYPES.Auth_BaseFeaturesController) .toConstantValue( new BaseFeaturesController( container.get(TYPES.Auth_GetUserFeatures), container.get(TYPES.Auth_ControllerContainer), ), ) } logger.debug('Configuration complete') return container } }