import { APP_INITIALIZER, LOCALE_ID, NgModule } from "@angular/core"; import { LockGuard as BaseLockGuardService } from "@bitwarden/angular/guards/lock.guard"; import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/guards/unauth.guard"; import { JslibServicesModule, MEMORY_STORAGE, SECURE_STORAGE, } from "@bitwarden/angular/services/jslib-services.module"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AppIdService } from "@bitwarden/common/abstractions/appId.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/abstractions/auth.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; import { ExportService } from "@bitwarden/common/abstractions/export.service"; import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service"; import { FileUploadService } from "@bitwarden/common/abstractions/fileUpload.service"; import { FolderService } from "@bitwarden/common/abstractions/folder.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector.service"; import { LogService as LogServiceAbstraction } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization.service"; import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; import { PasswordRepromptService as PasswordRepromptServiceAbstraction } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy.service"; import { ProviderService } from "@bitwarden/common/abstractions/provider.service"; import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/abstractions/state.service"; import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service"; import { SyncService } from "@bitwarden/common/abstractions/sync.service"; import { TokenService } from "@bitwarden/common/abstractions/token.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { TwoFactorService } from "@bitwarden/common/abstractions/twoFactor.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification.service"; import { UsernameGenerationService } from "@bitwarden/common/abstractions/usernameGeneration.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout.service"; import { AuthService } from "@bitwarden/common/services/auth.service"; import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service"; import { SearchService } from "@bitwarden/common/services/search.service"; import MainBackground from "../../background/main.background"; import { BrowserApi } from "../../browser/browserApi"; import { AutofillService } from "../../services/abstractions/autofill.service"; import { StateService as StateServiceAbstraction } from "../../services/abstractions/state.service"; import { BrowserFileDownloadService } from "../../services/browserFileDownloadService"; import BrowserMessagingService from "../../services/browserMessaging.service"; import BrowserMessagingPrivateModePopupService from "../../services/browserMessagingPrivateModePopup.service"; import { VaultFilterService } from "../../services/vaultFilter.service"; import { DebounceNavigationService } from "./debounceNavigationService"; import { InitService } from "./init.service"; import { LockGuardService } from "./lock-guard.service"; import { PasswordRepromptService } from "./password-reprompt.service"; import { PopupSearchService } from "./popup-search.service"; import { PopupUtilsService } from "./popup-utils.service"; import { UnauthGuardService } from "./unauth-guard.service"; const isPrivateMode = BrowserApi.getBackgroundPage() == null; const mainBackground: MainBackground = isPrivateMode ? createLocalBgService() : BrowserApi.getBackgroundPage().bitwardenMain; function createLocalBgService() { const localBgService = new MainBackground(true); localBgService.bootstrap(); return localBgService; } function getBgService(service: keyof MainBackground) { return (): T => { return mainBackground ? (mainBackground[service] as any as T) : null; }; } @NgModule({ imports: [JslibServicesModule], declarations: [], providers: [ InitService, DebounceNavigationService, { provide: LOCALE_ID, useFactory: () => getBgService("i18nService")().translationLocale, deps: [], }, { provide: APP_INITIALIZER, useFactory: (initService: InitService) => initService.init(), deps: [InitService], multi: true, }, { provide: BaseLockGuardService, useClass: LockGuardService }, { provide: BaseUnauthGuardService, useClass: UnauthGuardService }, { provide: PopupUtilsService, useFactory: () => new PopupUtilsService(isPrivateMode) }, { provide: MessagingService, useFactory: () => { return isPrivateMode ? new BrowserMessagingPrivateModePopupService() : new BrowserMessagingService(); }, }, { provide: TwoFactorService, useFactory: getBgService("twoFactorService"), deps: [], }, { provide: AuthServiceAbstraction, useFactory: getBgService("authService"), deps: [], }, { provide: SearchServiceAbstraction, useFactory: ( cipherService: CipherService, logService: ConsoleLogService, i18nService: I18nService ) => { return new PopupSearchService( getBgService("searchService")(), cipherService, logService, i18nService ); }, deps: [CipherService, LogServiceAbstraction, I18nService], }, { provide: AuditService, useFactory: getBgService("auditService"), deps: [] }, { provide: FileUploadService, useFactory: getBgService("fileUploadService"), deps: [], }, { provide: CipherService, useFactory: getBgService("cipherService"), deps: [] }, { provide: CryptoFunctionService, useFactory: getBgService("cryptoFunctionService"), deps: [], }, { provide: FolderService, useFactory: getBgService("folderService"), deps: [] }, { provide: CollectionService, useFactory: getBgService("collectionService"), deps: [], }, { provide: LogServiceAbstraction, useFactory: getBgService("logService"), deps: [], }, { provide: EnvironmentService, useFactory: getBgService("environmentService"), deps: [], }, { provide: TotpService, useFactory: getBgService("totpService"), deps: [] }, { provide: TokenService, useFactory: getBgService("tokenService"), deps: [] }, { provide: I18nService, useFactory: getBgService("i18nService"), deps: [] }, { provide: CryptoService, useFactory: getBgService("cryptoService"), deps: [] }, { provide: EventService, useFactory: getBgService("eventService"), deps: [] }, { provide: PolicyService, useFactory: getBgService("policyService"), deps: [] }, { provide: PlatformUtilsService, useFactory: getBgService("platformUtilsService"), deps: [], }, { provide: PasswordGenerationService, useFactory: getBgService("passwordGenerationService"), deps: [], }, { provide: ApiService, useFactory: getBgService("apiService"), deps: [] }, { provide: SyncService, useFactory: getBgService("syncService"), deps: [] }, { provide: SettingsService, useFactory: getBgService("settingsService"), deps: [], }, { provide: AbstractStorageService, useFactory: getBgService("storageService"), deps: [], }, { provide: AppIdService, useFactory: getBgService("appIdService"), deps: [] }, { provide: AutofillService, useFactory: getBgService("autofillService"), deps: [], }, { provide: ExportService, useFactory: getBgService("exportService"), deps: [] }, { provide: SendService, useFactory: getBgService("sendService"), deps: [] }, { provide: KeyConnectorService, useFactory: getBgService("keyConnectorService"), deps: [], }, { provide: UserVerificationService, useFactory: getBgService("userVerificationService"), deps: [], }, { provide: VaultTimeoutService, useFactory: getBgService("vaultTimeoutService"), deps: [], }, { provide: NotificationsService, useFactory: getBgService("notificationsService"), deps: [], }, { provide: LogServiceAbstraction, useFactory: getBgService("logService"), deps: [], }, { provide: PasswordRepromptServiceAbstraction, useClass: PasswordRepromptService }, { provide: OrganizationService, useFactory: getBgService("organizationService"), deps: [], }, { provide: VaultFilterService, useFactory: () => { return new VaultFilterService( getBgService("stateService")(), getBgService("organizationService")(), getBgService("folderService")(), getBgService("cipherService")(), getBgService("collectionService")(), getBgService("policyService")() ); }, deps: [], }, { provide: ProviderService, useFactory: getBgService("providerService"), deps: [], }, { provide: SECURE_STORAGE, useFactory: getBgService("secureStorageService"), deps: [], }, { provide: MEMORY_STORAGE, useFactory: getBgService("memoryStorageService"), }, { provide: StateServiceAbstraction, useFactory: getBgService("stateService"), deps: [], }, { provide: UsernameGenerationService, useFactory: getBgService("usernameGenerationService"), deps: [], }, { provide: BaseStateServiceAbstraction, useExisting: StateServiceAbstraction, deps: [], }, { provide: FileDownloadService, useClass: BrowserFileDownloadService, }, ], }) export class ServicesModule {}