{"version":3,"file":"vendors-28931c4b.xxxxxxxx.bundle.js","mappings":"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","sources":["webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/AccountManager.mjs","webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/DatabaseStorage.mjs","webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/AsyncMemoryStorage.mjs","webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/BrowserStorage.mjs","webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/BrowserCacheManager.mjs","webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/MemoryStorage.mjs","webpack://iadviser/./node_modules/@azure/msal-browser/dist/cache/TokenCache.mjs"],"sourcesContent":["/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\nfunction getAllAccounts(logger, browserStorage, isInBrowser, accountFilter) {\r\n logger.verbose(\"getAllAccounts called\");\r\n return isInBrowser ? browserStorage.getAllAccounts(accountFilter) : [];\r\n}\r\n/**\r\n * Returns the first account found in the cache that matches the account filter passed in.\r\n * @param accountFilter\r\n * @returns The first account found in the cache matching the provided filter or null if no account could be found.\r\n */\r\nfunction getAccount(accountFilter, logger, browserStorage) {\r\n logger.trace(\"getAccount called\");\r\n if (Object.keys(accountFilter).length === 0) {\r\n logger.warning(\"getAccount: No accountFilter provided\");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy(accountFilter);\r\n if (account) {\r\n logger.verbose(\"getAccount: Account matching provided filter found, returning\");\r\n return account;\r\n }\r\n else {\r\n logger.verbose(\"getAccount: No matching account found, returning null\");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns the signed in account matching username.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found.\r\n * This API is provided for convenience but getAccountById should be used for best reliability\r\n * @param username\r\n * @returns The account object stored in MSAL\r\n */\r\nfunction getAccountByUsername(username, logger, browserStorage) {\r\n logger.trace(\"getAccountByUsername called\");\r\n if (!username) {\r\n logger.warning(\"getAccountByUsername: No username provided\");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy({\r\n username,\r\n });\r\n if (account) {\r\n logger.verbose(\"getAccountByUsername: Account matching username found, returning\");\r\n logger.verbosePii(`getAccountByUsername: Returning signed-in accounts matching username: ${username}`);\r\n return account;\r\n }\r\n else {\r\n logger.verbose(\"getAccountByUsername: No matching account found, returning null\");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns the signed in account matching homeAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param homeAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\nfunction getAccountByHomeId(homeAccountId, logger, browserStorage) {\r\n logger.trace(\"getAccountByHomeId called\");\r\n if (!homeAccountId) {\r\n logger.warning(\"getAccountByHomeId: No homeAccountId provided\");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy({\r\n homeAccountId,\r\n });\r\n if (account) {\r\n logger.verbose(\"getAccountByHomeId: Account matching homeAccountId found, returning\");\r\n logger.verbosePii(`getAccountByHomeId: Returning signed-in accounts matching homeAccountId: ${homeAccountId}`);\r\n return account;\r\n }\r\n else {\r\n logger.verbose(\"getAccountByHomeId: No matching account found, returning null\");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns the signed in account matching localAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param localAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\nfunction getAccountByLocalId(localAccountId, logger, browserStorage) {\r\n logger.trace(\"getAccountByLocalId called\");\r\n if (!localAccountId) {\r\n logger.warning(\"getAccountByLocalId: No localAccountId provided\");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy({\r\n localAccountId,\r\n });\r\n if (account) {\r\n logger.verbose(\"getAccountByLocalId: Account matching localAccountId found, returning\");\r\n logger.verbosePii(`getAccountByLocalId: Returning signed-in accounts matching localAccountId: ${localAccountId}`);\r\n return account;\r\n }\r\n else {\r\n logger.verbose(\"getAccountByLocalId: No matching account found, returning null\");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n * @param account\r\n */\r\nfunction setActiveAccount(account, browserStorage) {\r\n browserStorage.setActiveAccount(account);\r\n}\r\n/**\r\n * Gets the currently active account\r\n */\r\nfunction getActiveAccount(browserStorage) {\r\n return browserStorage.getActiveAccount();\r\n}\n\nexport { getAccount, getAccountByHomeId, getAccountByLocalId, getAccountByUsername, getActiveAccount, getAllAccounts, setActiveAccount };\n//# sourceMappingURL=AccountManager.mjs.map\n","/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\nimport { createBrowserAuthError } from '../error/BrowserAuthError.mjs';\nimport { DB_NAME, DB_VERSION, DB_TABLE_NAME } from '../utils/BrowserConstants.mjs';\nimport { databaseUnavailable, databaseNotOpen } from '../error/BrowserAuthErrorCodes.mjs';\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\r\n */\r\nclass DatabaseStorage {\r\n constructor() {\r\n this.dbName = DB_NAME;\r\n this.version = DB_VERSION;\r\n this.tableName = DB_TABLE_NAME;\r\n this.dbOpen = false;\r\n }\r\n /**\r\n * Opens IndexedDB instance.\r\n */\r\n async open() {\r\n return new Promise((resolve, reject) => {\r\n const openDB = window.indexedDB.open(this.dbName, this.version);\r\n openDB.addEventListener(\"upgradeneeded\", (e) => {\r\n const event = e;\r\n event.target.result.createObjectStore(this.tableName);\r\n });\r\n openDB.addEventListener(\"success\", (e) => {\r\n const event = e;\r\n this.db = event.target.result;\r\n this.dbOpen = true;\r\n resolve();\r\n });\r\n openDB.addEventListener(\"error\", () => reject(createBrowserAuthError(databaseUnavailable)));\r\n });\r\n }\r\n /**\r\n * Closes the connection to IndexedDB database when all pending transactions\r\n * complete.\r\n */\r\n closeConnection() {\r\n const db = this.db;\r\n if (db && this.dbOpen) {\r\n db.close();\r\n this.dbOpen = false;\r\n }\r\n }\r\n /**\r\n * Opens database if it's not already open\r\n */\r\n async validateDbIsOpen() {\r\n if (!this.dbOpen) {\r\n return this.open();\r\n }\r\n }\r\n /**\r\n * Retrieves item from IndexedDB instance.\r\n * @param key\r\n */\r\n async getItem(key) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n // TODO: Add timeouts?\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], \"readonly\");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbGet = objectStore.get(key);\r\n dbGet.addEventListener(\"success\", (e) => {\r\n const event = e;\r\n this.closeConnection();\r\n resolve(event.target.result);\r\n });\r\n dbGet.addEventListener(\"error\", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Adds item to IndexedDB under given key\r\n * @param key\r\n * @param payload\r\n */\r\n async setItem(key, payload) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n // TODO: Add timeouts?\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbPut = objectStore.put(payload, key);\r\n dbPut.addEventListener(\"success\", () => {\r\n this.closeConnection();\r\n resolve();\r\n });\r\n dbPut.addEventListener(\"error\", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Removes item from IndexedDB under given key\r\n * @param key\r\n */\r\n async removeItem(key) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbDelete = objectStore.delete(key);\r\n dbDelete.addEventListener(\"success\", () => {\r\n this.closeConnection();\r\n resolve();\r\n });\r\n dbDelete.addEventListener(\"error\", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Get all the keys from the storage object as an iterable array of strings.\r\n */\r\n async getKeys() {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], \"readonly\");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbGetKeys = objectStore.getAllKeys();\r\n dbGetKeys.addEventListener(\"success\", (e) => {\r\n const event = e;\r\n this.closeConnection();\r\n resolve(event.target.result);\r\n });\r\n dbGetKeys.addEventListener(\"error\", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n *\r\n * Checks whether there is an object under the search key in the object store\r\n */\r\n async containsKey(key) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], \"readonly\");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbContainsKey = objectStore.count(key);\r\n dbContainsKey.addEventListener(\"success\", (e) => {\r\n const event = e;\r\n this.closeConnection();\r\n resolve(event.target.result === 1);\r\n });\r\n dbContainsKey.addEventListener(\"error\", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Deletes the MSAL database. The database is deleted rather than cleared to make it possible\r\n * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues\r\n * with IndexedDB database versions.\r\n */\r\n async deleteDatabase() {\r\n // Check if database being deleted exists\r\n if (this.db && this.dbOpen) {\r\n this.closeConnection();\r\n }\r\n return new Promise((resolve, reject) => {\r\n const deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);\r\n const id = setTimeout(() => reject(false), 200); // Reject if events aren't raised within 200ms\r\n deleteDbRequest.addEventListener(\"success\", () => {\r\n clearTimeout(id);\r\n return resolve(true);\r\n });\r\n deleteDbRequest.addEventListener(\"blocked\", () => {\r\n clearTimeout(id);\r\n return resolve(true);\r\n });\r\n deleteDbRequest.addEventListener(\"error\", () => {\r\n clearTimeout(id);\r\n return reject(false);\r\n });\r\n });\r\n }\r\n}\n\nexport { DatabaseStorage };\n//# sourceMappingURL=DatabaseStorage.mjs.map\n","/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\nimport { BrowserAuthError } from '../error/BrowserAuthError.mjs';\nimport { DatabaseStorage } from './DatabaseStorage.mjs';\nimport { MemoryStorage } from './MemoryStorage.mjs';\nimport { databaseUnavailable } from '../error/BrowserAuthErrorCodes.mjs';\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,\r\n * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.\r\n */\r\nclass AsyncMemoryStorage {\r\n constructor(logger) {\r\n this.inMemoryCache = new MemoryStorage();\r\n this.indexedDBCache = new DatabaseStorage();\r\n this.logger = logger;\r\n }\r\n handleDatabaseAccessError(error) {\r\n if (error instanceof BrowserAuthError &&\r\n error.errorCode === databaseUnavailable) {\r\n this.logger.error(\"Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.\");\r\n }\r\n else {\r\n throw error;\r\n }\r\n }\r\n /**\r\n * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous\r\n * storage object if item isn't found in-memory.\r\n * @param key\r\n */\r\n async getItem(key) {\r\n const item = this.inMemoryCache.getItem(key);\r\n if (!item) {\r\n try {\r\n this.logger.verbose(\"Queried item not found in in-memory cache, now querying persistent storage.\");\r\n return await this.indexedDBCache.getItem(key);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n return item;\r\n }\r\n /**\r\n * Sets the item in the in-memory cache and then tries to set it in the asynchronous\r\n * storage object with the given key.\r\n * @param key\r\n * @param value\r\n */\r\n async setItem(key, value) {\r\n this.inMemoryCache.setItem(key, value);\r\n try {\r\n await this.indexedDBCache.setItem(key, value);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n /**\r\n * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.\r\n * @param key\r\n */\r\n async removeItem(key) {\r\n this.inMemoryCache.removeItem(key);\r\n try {\r\n await this.indexedDBCache.removeItem(key);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n /**\r\n * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the\r\n * asynchronous storage object.\r\n */\r\n async getKeys() {\r\n const cacheKeys = this.inMemoryCache.getKeys();\r\n if (cacheKeys.length === 0) {\r\n try {\r\n this.logger.verbose(\"In-memory cache is empty, now querying persistent storage.\");\r\n return await this.indexedDBCache.getKeys();\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n return cacheKeys;\r\n }\r\n /**\r\n * Returns true or false if the given key is present in the cache.\r\n * @param key\r\n */\r\n async containsKey(key) {\r\n const containsKey = this.inMemoryCache.containsKey(key);\r\n if (!containsKey) {\r\n try {\r\n this.logger.verbose(\"Key not found in in-memory cache, now querying persistent storage.\");\r\n return await this.indexedDBCache.containsKey(key);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n return containsKey;\r\n }\r\n /**\r\n * Clears in-memory Map\r\n */\r\n clearInMemory() {\r\n // InMemory cache is a Map instance, clear is straightforward\r\n this.logger.verbose(`Deleting in-memory keystore`);\r\n this.inMemoryCache.clear();\r\n this.logger.verbose(`In-memory keystore deleted`);\r\n }\r\n /**\r\n * Tries to delete the IndexedDB database\r\n * @returns\r\n */\r\n async clearPersistent() {\r\n try {\r\n this.logger.verbose(\"Deleting persistent keystore\");\r\n const dbDeleted = await this.indexedDBCache.deleteDatabase();\r\n if (dbDeleted) {\r\n this.logger.verbose(\"Persistent keystore deleted\");\r\n }\r\n return dbDeleted;\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n return false;\r\n }\r\n }\r\n}\n\nexport { AsyncMemoryStorage };\n//# sourceMappingURL=AsyncMemoryStorage.mjs.map\n","/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\nimport { createBrowserConfigurationAuthError } from '../error/BrowserConfigurationAuthError.mjs';\nimport { BrowserCacheLocation } from '../utils/BrowserConstants.mjs';\nimport { storageNotSupported } from '../error/BrowserConfigurationAuthErrorCodes.mjs';\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass BrowserStorage {\r\n constructor(cacheLocation) {\r\n this.validateWindowStorage(cacheLocation);\r\n this.windowStorage = window[cacheLocation];\r\n }\r\n validateWindowStorage(cacheLocation) {\r\n if ((cacheLocation !== BrowserCacheLocation.LocalStorage &&\r\n cacheLocation !== BrowserCacheLocation.SessionStorage) ||\r\n !window[cacheLocation]) {\r\n throw createBrowserConfigurationAuthError(storageNotSupported);\r\n }\r\n }\r\n getItem(key) {\r\n return this.windowStorage.getItem(key);\r\n }\r\n setItem(key, value) {\r\n this.windowStorage.setItem(key, value);\r\n }\r\n removeItem(key) {\r\n this.windowStorage.removeItem(key);\r\n }\r\n getKeys() {\r\n return Object.keys(this.windowStorage);\r\n }\r\n containsKey(key) {\r\n return this.windowStorage.hasOwnProperty(key);\r\n }\r\n}\n\nexport { BrowserStorage };\n//# sourceMappingURL=BrowserStorage.mjs.map\n","/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\nimport { CacheManager, CredentialType, CacheHelpers, AccountEntity, createClientAuthError, ClientAuthErrorCodes, Constants, PersistentCacheKeys, PerformanceEvents, StringUtils, ProtocolUtils, AuthToken, CacheError, DEFAULT_CRYPTO_IMPLEMENTATION, CcsCredentialType } from '@azure/msal-common';\nimport { createBrowserAuthError } from '../error/BrowserAuthError.mjs';\nimport { BrowserCacheLocation, StaticCacheKeys, InMemoryCacheKeys, TemporaryCacheKeys } from '../utils/BrowserConstants.mjs';\nimport { BrowserStorage } from './BrowserStorage.mjs';\nimport { MemoryStorage } from './MemoryStorage.mjs';\nimport { extractBrowserRequestState } from '../utils/BrowserProtocolUtils.mjs';\nimport { base64Decode } from '../encode/Base64Decode.mjs';\nimport { base64Encode } from '../encode/Base64Encode.mjs';\nimport { noTokenRequestCacheError, unableToParseTokenRequestCacheError, noCachedAuthorityError, interactionInProgress } from '../error/BrowserAuthErrorCodes.mjs';\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class implements the cache storage interface for MSAL through browser local or session storage.\r\n * Cookies are only used if storeAuthStateInCookie is true, and are only used for\r\n * parameters such as state and nonce, generally.\r\n */\r\nclass BrowserCacheManager extends CacheManager {\r\n constructor(clientId, cacheConfig, cryptoImpl, logger, staticAuthorityOptions, performanceClient) {\r\n super(clientId, cryptoImpl, logger, staticAuthorityOptions);\r\n // Cookie life calculation (hours * minutes * seconds * ms)\r\n this.COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;\r\n this.cacheConfig = cacheConfig;\r\n this.logger = logger;\r\n this.internalStorage = new MemoryStorage();\r\n this.browserStorage = this.setupBrowserStorage(this.cacheConfig.cacheLocation);\r\n this.temporaryCacheStorage = this.setupTemporaryCacheStorage(this.cacheConfig.temporaryCacheLocation, this.cacheConfig.cacheLocation);\r\n // Migrate cache entries from older versions of MSAL.\r\n if (cacheConfig.cacheMigrationEnabled) {\r\n this.migrateCacheEntries();\r\n this.createKeyMaps();\r\n }\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.\r\n * @param cacheLocation\r\n */\r\n setupBrowserStorage(cacheLocation) {\r\n switch (cacheLocation) {\r\n case BrowserCacheLocation.LocalStorage:\r\n case BrowserCacheLocation.SessionStorage:\r\n try {\r\n return new BrowserStorage(cacheLocation);\r\n }\r\n catch (e) {\r\n this.logger.verbose(e);\r\n break;\r\n }\r\n }\r\n this.cacheConfig.cacheLocation = BrowserCacheLocation.MemoryStorage;\r\n return new MemoryStorage();\r\n }\r\n /**\r\n * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured temporaryCacheLocation.\r\n * @param temporaryCacheLocation\r\n * @param cacheLocation\r\n */\r\n setupTemporaryCacheStorage(temporaryCacheLocation, cacheLocation) {\r\n switch (cacheLocation) {\r\n case BrowserCacheLocation.LocalStorage:\r\n case BrowserCacheLocation.SessionStorage:\r\n try {\r\n // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs\r\n return new BrowserStorage(temporaryCacheLocation ||\r\n BrowserCacheLocation.SessionStorage);\r\n }\r\n catch (e) {\r\n this.logger.verbose(e);\r\n return this.internalStorage;\r\n }\r\n case BrowserCacheLocation.MemoryStorage:\r\n default:\r\n return this.internalStorage;\r\n }\r\n }\r\n /**\r\n * Migrate all old cache entries to new schema. No rollback supported.\r\n * @param storeAuthStateInCookie\r\n */\r\n migrateCacheEntries() {\r\n const idTokenKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ID_TOKEN}`;\r\n const clientInfoKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.CLIENT_INFO}`;\r\n const errorKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR}`;\r\n const errorDescKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR_DESC}`;\r\n const idTokenValue = this.browserStorage.getItem(idTokenKey);\r\n const clientInfoValue = this.browserStorage.getItem(clientInfoKey);\r\n const errorValue = this.browserStorage.getItem(errorKey);\r\n const errorDescValue = this.browserStorage.getItem(errorDescKey);\r\n const values = [\r\n idTokenValue,\r\n clientInfoValue,\r\n errorValue,\r\n errorDescValue,\r\n ];\r\n const keysToMigrate = [\r\n PersistentCacheKeys.ID_TOKEN,\r\n PersistentCacheKeys.CLIENT_INFO,\r\n PersistentCacheKeys.ERROR,\r\n PersistentCacheKeys.ERROR_DESC,\r\n ];\r\n keysToMigrate.forEach((cacheKey, index) => {\r\n const value = values[index];\r\n if (value) {\r\n this.setTemporaryCache(cacheKey, value, true);\r\n }\r\n });\r\n }\r\n /**\r\n * Searches all cache entries for MSAL accounts and creates the account key map\r\n * This is used to migrate users from older versions of MSAL which did not create the map.\r\n * @returns\r\n */\r\n createKeyMaps() {\r\n this.logger.trace(\"BrowserCacheManager - createKeyMaps called.\");\r\n const accountKeys = this.getItem(StaticCacheKeys.ACCOUNT_KEYS);\r\n const tokenKeys = this.getItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`);\r\n if (accountKeys && tokenKeys) {\r\n this.logger.verbose(\"BrowserCacheManager:createKeyMaps - account and token key maps already exist, skipping migration.\");\r\n // Key maps already exist, no need to iterate through cache\r\n return;\r\n }\r\n const allKeys = this.browserStorage.getKeys();\r\n allKeys.forEach((key) => {\r\n if (this.isCredentialKey(key)) {\r\n // Get item, parse, validate and write key to map\r\n const value = this.getItem(key);\r\n if (value) {\r\n const credObj = this.validateAndParseJson(value);\r\n if (credObj && credObj.hasOwnProperty(\"credentialType\")) {\r\n switch (credObj[\"credentialType\"]) {\r\n case CredentialType.ID_TOKEN:\r\n if (CacheHelpers.isIdTokenEntity(credObj)) {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - idToken found, saving key to token key map\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - idToken with key: ${key} found, saving key to token key map`);\r\n const idTokenEntity = credObj;\r\n const newKey = this.updateCredentialCacheKey(key, idTokenEntity);\r\n this.addTokenKey(newKey, CredentialType.ID_TOKEN);\r\n return;\r\n }\r\n else {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - key found matching idToken schema with value containing idToken credentialType field but value failed IdTokenEntity validation, skipping.\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed idToken validation on key: ${key}`);\r\n }\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:\r\n if (CacheHelpers.isAccessTokenEntity(credObj)) {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - accessToken found, saving key to token key map\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - accessToken with key: ${key} found, saving key to token key map`);\r\n const accessTokenEntity = credObj;\r\n const newKey = this.updateCredentialCacheKey(key, accessTokenEntity);\r\n this.addTokenKey(newKey, CredentialType.ACCESS_TOKEN);\r\n return;\r\n }\r\n else {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - key found matching accessToken schema with value containing accessToken credentialType field but value failed AccessTokenEntity validation, skipping.\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed accessToken validation on key: ${key}`);\r\n }\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n if (CacheHelpers.isRefreshTokenEntity(credObj)) {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - refreshToken found, saving key to token key map\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - refreshToken with key: ${key} found, saving key to token key map`);\r\n const refreshTokenEntity = credObj;\r\n const newKey = this.updateCredentialCacheKey(key, refreshTokenEntity);\r\n this.addTokenKey(newKey, CredentialType.REFRESH_TOKEN);\r\n return;\r\n }\r\n else {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - key found matching refreshToken schema with value containing refreshToken credentialType field but value failed RefreshTokenEntity validation, skipping.\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed refreshToken validation on key: ${key}`);\r\n }\r\n break;\r\n // If credentialType isn't one of our predefined ones, it may not be an MSAL cache value. Ignore.\r\n }\r\n }\r\n }\r\n }\r\n if (this.isAccountKey(key)) {\r\n const value = this.getItem(key);\r\n if (value) {\r\n const accountObj = this.validateAndParseJson(value);\r\n if (accountObj &&\r\n AccountEntity.isAccountEntity(accountObj)) {\r\n this.logger.trace(\"BrowserCacheManager:createKeyMaps - account found, saving key to account key map\");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - account with key: ${key} found, saving key to account key map`);\r\n this.addAccountKeyToMap(key);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Parses passed value as JSON object, JSON.parse() will throw an error.\r\n * @param input\r\n */\r\n validateAndParseJson(jsonValue) {\r\n try {\r\n const parsedJson = JSON.parse(jsonValue);\r\n /**\r\n * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object\r\n * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check\r\n * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.\r\n *\r\n */\r\n return parsedJson && typeof parsedJson === \"object\"\r\n ? parsedJson\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n }\r\n /**\r\n * fetches the entry from the browser storage based off the key\r\n * @param key\r\n */\r\n getItem(key) {\r\n return this.browserStorage.getItem(key);\r\n }\r\n /**\r\n * sets the entry in the browser storage\r\n * @param key\r\n * @param value\r\n */\r\n setItem(key, value) {\r\n this.browserStorage.setItem(key, value);\r\n }\r\n /**\r\n * fetch the account entity from the platform cache\r\n * @param accountKey\r\n */\r\n getAccount(accountKey, logger) {\r\n this.logger.trace(\"BrowserCacheManager.getAccount called\");\r\n const accountEntity = this.getCachedAccountEntity(accountKey);\r\n return this.updateOutdatedCachedAccount(accountKey, accountEntity, logger);\r\n }\r\n /**\r\n * Reads account from cache, deserializes it into an account entity and returns it.\r\n * If account is not found from the key, returns null and removes key from map.\r\n * @param accountKey\r\n * @returns\r\n */\r\n getCachedAccountEntity(accountKey) {\r\n const serializedAccount = this.getItem(accountKey);\r\n if (!serializedAccount) {\r\n this.removeAccountKeyFromMap(accountKey);\r\n return null;\r\n }\r\n const parsedAccount = this.validateAndParseJson(serializedAccount);\r\n if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {\r\n this.removeAccountKeyFromMap(accountKey);\r\n return null;\r\n }\r\n return CacheManager.toObject(new AccountEntity(), parsedAccount);\r\n }\r\n /**\r\n * set account entity in the platform cache\r\n * @param account\r\n */\r\n setAccount(account) {\r\n this.logger.trace(\"BrowserCacheManager.setAccount called\");\r\n const key = account.generateAccountKey();\r\n this.setItem(key, JSON.stringify(account));\r\n this.addAccountKeyToMap(key);\r\n }\r\n /**\r\n * Returns the array of account keys currently cached\r\n * @returns\r\n */\r\n getAccountKeys() {\r\n this.logger.trace(\"BrowserCacheManager.getAccountKeys called\");\r\n const accountKeys = this.getItem(StaticCacheKeys.ACCOUNT_KEYS);\r\n if (accountKeys) {\r\n return JSON.parse(accountKeys);\r\n }\r\n this.logger.verbose(\"BrowserCacheManager.getAccountKeys - No account keys found\");\r\n return [];\r\n }\r\n /**\r\n * Add a new account to the key map\r\n * @param key\r\n */\r\n addAccountKeyToMap(key) {\r\n this.logger.trace(\"BrowserCacheManager.addAccountKeyToMap called\");\r\n this.logger.tracePii(`BrowserCacheManager.addAccountKeyToMap called with key: ${key}`);\r\n const accountKeys = this.getAccountKeys();\r\n if (accountKeys.indexOf(key) === -1) {\r\n // Only add key if it does not already exist in the map\r\n accountKeys.push(key);\r\n this.setItem(StaticCacheKeys.ACCOUNT_KEYS, JSON.stringify(accountKeys));\r\n this.logger.verbose(\"BrowserCacheManager.addAccountKeyToMap account key added\");\r\n }\r\n else {\r\n this.logger.verbose(\"BrowserCacheManager.addAccountKeyToMap account key already exists in map\");\r\n }\r\n }\r\n /**\r\n * Remove an account from the key map\r\n * @param key\r\n */\r\n removeAccountKeyFromMap(key) {\r\n this.logger.trace(\"BrowserCacheManager.removeAccountKeyFromMap called\");\r\n this.logger.tracePii(`BrowserCacheManager.removeAccountKeyFromMap called with key: ${key}`);\r\n const accountKeys = this.getAccountKeys();\r\n const removalIndex = accountKeys.indexOf(key);\r\n if (removalIndex > -1) {\r\n accountKeys.splice(removalIndex, 1);\r\n this.setItem(StaticCacheKeys.ACCOUNT_KEYS, JSON.stringify(accountKeys));\r\n this.logger.trace(\"BrowserCacheManager.removeAccountKeyFromMap account key removed\");\r\n }\r\n else {\r\n this.logger.trace(\"BrowserCacheManager.removeAccountKeyFromMap key not found in existing map\");\r\n }\r\n }\r\n /**\r\n * Extends inherited removeAccount function to include removal of the account key from the map\r\n * @param key\r\n */\r\n async removeAccount(key) {\r\n void super.removeAccount(key);\r\n this.removeAccountKeyFromMap(key);\r\n }\r\n /**\r\n * Remove account entity from the platform cache if it's outdated\r\n * @param accountKey\r\n */\r\n removeOutdatedAccount(accountKey) {\r\n this.removeItem(accountKey);\r\n this.removeAccountKeyFromMap(accountKey);\r\n }\r\n /**\r\n * Removes given idToken from the cache and from the key map\r\n * @param key\r\n */\r\n removeIdToken(key) {\r\n super.removeIdToken(key);\r\n this.removeTokenKey(key, CredentialType.ID_TOKEN);\r\n }\r\n /**\r\n * Removes given accessToken from the cache and from the key map\r\n * @param key\r\n */\r\n async removeAccessToken(key) {\r\n void super.removeAccessToken(key);\r\n this.removeTokenKey(key, CredentialType.ACCESS_TOKEN);\r\n }\r\n /**\r\n * Removes given refreshToken from the cache and from the key map\r\n * @param key\r\n */\r\n removeRefreshToken(key) {\r\n super.removeRefreshToken(key);\r\n this.removeTokenKey(key, CredentialType.REFRESH_TOKEN);\r\n }\r\n /**\r\n * Gets the keys for the cached tokens associated with this clientId\r\n * @returns\r\n */\r\n getTokenKeys() {\r\n this.logger.trace(\"BrowserCacheManager.getTokenKeys called\");\r\n const item = this.getItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`);\r\n if (item) {\r\n const tokenKeys = this.validateAndParseJson(item);\r\n if (tokenKeys &&\r\n tokenKeys.hasOwnProperty(\"idToken\") &&\r\n tokenKeys.hasOwnProperty(\"accessToken\") &&\r\n tokenKeys.hasOwnProperty(\"refreshToken\")) {\r\n return tokenKeys;\r\n }\r\n else {\r\n this.logger.error(\"BrowserCacheManager.getTokenKeys - Token keys found but in an unknown format. Returning empty key map.\");\r\n }\r\n }\r\n else {\r\n this.logger.verbose(\"BrowserCacheManager.getTokenKeys - No token keys found\");\r\n }\r\n return {\r\n idToken: [],\r\n accessToken: [],\r\n refreshToken: [],\r\n };\r\n }\r\n /**\r\n * Adds the given key to the token key map\r\n * @param key\r\n * @param type\r\n */\r\n addTokenKey(key, type) {\r\n this.logger.trace(\"BrowserCacheManager addTokenKey called\");\r\n const tokenKeys = this.getTokenKeys();\r\n switch (type) {\r\n case CredentialType.ID_TOKEN:\r\n if (tokenKeys.idToken.indexOf(key) === -1) {\r\n this.logger.info(\"BrowserCacheManager: addTokenKey - idToken added to map\");\r\n tokenKeys.idToken.push(key);\r\n }\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n if (tokenKeys.accessToken.indexOf(key) === -1) {\r\n this.logger.info(\"BrowserCacheManager: addTokenKey - accessToken added to map\");\r\n tokenKeys.accessToken.push(key);\r\n }\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n if (tokenKeys.refreshToken.indexOf(key) === -1) {\r\n this.logger.info(\"BrowserCacheManager: addTokenKey - refreshToken added to map\");\r\n tokenKeys.refreshToken.push(key);\r\n }\r\n break;\r\n default:\r\n this.logger.error(`BrowserCacheManager:addTokenKey - CredentialType provided invalid. CredentialType: ${type}`);\r\n throw createClientAuthError(ClientAuthErrorCodes.unexpectedCredentialType);\r\n }\r\n this.setItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`, JSON.stringify(tokenKeys));\r\n }\r\n /**\r\n * Removes the given key from the token key map\r\n * @param key\r\n * @param type\r\n */\r\n removeTokenKey(key, type) {\r\n this.logger.trace(\"BrowserCacheManager removeTokenKey called\");\r\n const tokenKeys = this.getTokenKeys();\r\n switch (type) {\r\n case CredentialType.ID_TOKEN:\r\n this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove idToken with key: ${key} from map`);\r\n const idRemoval = tokenKeys.idToken.indexOf(key);\r\n if (idRemoval > -1) {\r\n this.logger.info(\"BrowserCacheManager: removeTokenKey - idToken removed from map\");\r\n tokenKeys.idToken.splice(idRemoval, 1);\r\n }\r\n else {\r\n this.logger.info(\"BrowserCacheManager: removeTokenKey - idToken does not exist in map. Either it was previously removed or it was never added.\");\r\n }\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove accessToken with key: ${key} from map`);\r\n const accessRemoval = tokenKeys.accessToken.indexOf(key);\r\n if (accessRemoval > -1) {\r\n this.logger.info(\"BrowserCacheManager: removeTokenKey - accessToken removed from map\");\r\n tokenKeys.accessToken.splice(accessRemoval, 1);\r\n }\r\n else {\r\n this.logger.info(\"BrowserCacheManager: removeTokenKey - accessToken does not exist in map. Either it was previously removed or it was never added.\");\r\n }\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove refreshToken with key: ${key} from map`);\r\n const refreshRemoval = tokenKeys.refreshToken.indexOf(key);\r\n if (refreshRemoval > -1) {\r\n this.logger.info(\"BrowserCacheManager: removeTokenKey - refreshToken removed from map\");\r\n tokenKeys.refreshToken.splice(refreshRemoval, 1);\r\n }\r\n else {\r\n this.logger.info(\"BrowserCacheManager: removeTokenKey - refreshToken does not exist in map. Either it was previously removed or it was never added.\");\r\n }\r\n break;\r\n default:\r\n this.logger.error(`BrowserCacheManager:removeTokenKey - CredentialType provided invalid. CredentialType: ${type}`);\r\n throw createClientAuthError(ClientAuthErrorCodes.unexpectedCredentialType);\r\n }\r\n this.setItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`, JSON.stringify(tokenKeys));\r\n }\r\n /**\r\n * generates idToken entity from a string\r\n * @param idTokenKey\r\n */\r\n getIdTokenCredential(idTokenKey) {\r\n const value = this.getItem(idTokenKey);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: called, no cache hit\");\r\n this.removeTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n return null;\r\n }\r\n const parsedIdToken = this.validateAndParseJson(value);\r\n if (!parsedIdToken || !CacheHelpers.isIdTokenEntity(parsedIdToken)) {\r\n this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: called, no cache hit\");\r\n this.removeTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: cache hit\");\r\n return parsedIdToken;\r\n }\r\n /**\r\n * set IdToken credential to the platform cache\r\n * @param idToken\r\n */\r\n setIdTokenCredential(idToken) {\r\n this.logger.trace(\"BrowserCacheManager.setIdTokenCredential called\");\r\n const idTokenKey = CacheHelpers.generateCredentialKey(idToken);\r\n this.setItem(idTokenKey, JSON.stringify(idToken));\r\n this.addTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n }\r\n /**\r\n * generates accessToken entity from a string\r\n * @param key\r\n */\r\n getAccessTokenCredential(accessTokenKey) {\r\n const value = this.getItem(accessTokenKey);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: called, no cache hit\");\r\n this.removeTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n return null;\r\n }\r\n const parsedAccessToken = this.validateAndParseJson(value);\r\n if (!parsedAccessToken ||\r\n !CacheHelpers.isAccessTokenEntity(parsedAccessToken)) {\r\n this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: called, no cache hit\");\r\n this.removeTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: cache hit\");\r\n return parsedAccessToken;\r\n }\r\n /**\r\n * set accessToken credential to the platform cache\r\n * @param accessToken\r\n */\r\n setAccessTokenCredential(accessToken) {\r\n this.logger.trace(\"BrowserCacheManager.setAccessTokenCredential called\");\r\n const accessTokenKey = CacheHelpers.generateCredentialKey(accessToken);\r\n this.setItem(accessTokenKey, JSON.stringify(accessToken));\r\n this.addTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n }\r\n /**\r\n * generates refreshToken entity from a string\r\n * @param refreshTokenKey\r\n */\r\n getRefreshTokenCredential(refreshTokenKey) {\r\n const value = this.getItem(refreshTokenKey);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: called, no cache hit\");\r\n this.removeTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n return null;\r\n }\r\n const parsedRefreshToken = this.validateAndParseJson(value);\r\n if (!parsedRefreshToken ||\r\n !CacheHelpers.isRefreshTokenEntity(parsedRefreshToken)) {\r\n this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: called, no cache hit\");\r\n this.removeTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: cache hit\");\r\n return parsedRefreshToken;\r\n }\r\n /**\r\n * set refreshToken credential to the platform cache\r\n * @param refreshToken\r\n */\r\n setRefreshTokenCredential(refreshToken) {\r\n this.logger.trace(\"BrowserCacheManager.setRefreshTokenCredential called\");\r\n const refreshTokenKey = CacheHelpers.generateCredentialKey(refreshToken);\r\n this.setItem(refreshTokenKey, JSON.stringify(refreshToken));\r\n this.addTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n }\r\n /**\r\n * fetch appMetadata entity from the platform cache\r\n * @param appMetadataKey\r\n */\r\n getAppMetadata(appMetadataKey) {\r\n const value = this.getItem(appMetadataKey);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getAppMetadata: called, no cache hit\");\r\n return null;\r\n }\r\n const parsedMetadata = this.validateAndParseJson(value);\r\n if (!parsedMetadata ||\r\n !CacheHelpers.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {\r\n this.logger.trace(\"BrowserCacheManager.getAppMetadata: called, no cache hit\");\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getAppMetadata: cache hit\");\r\n return parsedMetadata;\r\n }\r\n /**\r\n * set appMetadata entity to the platform cache\r\n * @param appMetadata\r\n */\r\n setAppMetadata(appMetadata) {\r\n this.logger.trace(\"BrowserCacheManager.setAppMetadata called\");\r\n const appMetadataKey = CacheHelpers.generateAppMetadataKey(appMetadata);\r\n this.setItem(appMetadataKey, JSON.stringify(appMetadata));\r\n }\r\n /**\r\n * fetch server telemetry entity from the platform cache\r\n * @param serverTelemetryKey\r\n */\r\n getServerTelemetry(serverTelemetryKey) {\r\n const value = this.getItem(serverTelemetryKey);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getServerTelemetry: called, no cache hit\");\r\n return null;\r\n }\r\n const parsedEntity = this.validateAndParseJson(value);\r\n if (!parsedEntity ||\r\n !CacheHelpers.isServerTelemetryEntity(serverTelemetryKey, parsedEntity)) {\r\n this.logger.trace(\"BrowserCacheManager.getServerTelemetry: called, no cache hit\");\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getServerTelemetry: cache hit\");\r\n return parsedEntity;\r\n }\r\n /**\r\n * set server telemetry entity to the platform cache\r\n * @param serverTelemetryKey\r\n * @param serverTelemetry\r\n */\r\n setServerTelemetry(serverTelemetryKey, serverTelemetry) {\r\n this.logger.trace(\"BrowserCacheManager.setServerTelemetry called\");\r\n this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));\r\n }\r\n /**\r\n *\r\n */\r\n getAuthorityMetadata(key) {\r\n const value = this.internalStorage.getItem(key);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getAuthorityMetadata: called, no cache hit\");\r\n return null;\r\n }\r\n const parsedMetadata = this.validateAndParseJson(value);\r\n if (parsedMetadata &&\r\n CacheHelpers.isAuthorityMetadataEntity(key, parsedMetadata)) {\r\n this.logger.trace(\"BrowserCacheManager.getAuthorityMetadata: cache hit\");\r\n return parsedMetadata;\r\n }\r\n return null;\r\n }\r\n /**\r\n *\r\n */\r\n getAuthorityMetadataKeys() {\r\n const allKeys = this.internalStorage.getKeys();\r\n return allKeys.filter((key) => {\r\n return this.isAuthorityMetadata(key);\r\n });\r\n }\r\n /**\r\n * Sets wrapper metadata in memory\r\n * @param wrapperSKU\r\n * @param wrapperVersion\r\n */\r\n setWrapperMetadata(wrapperSKU, wrapperVersion) {\r\n this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);\r\n this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);\r\n }\r\n /**\r\n * Returns wrapper metadata from in-memory storage\r\n */\r\n getWrapperMetadata() {\r\n const sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) ||\r\n Constants.EMPTY_STRING;\r\n const version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) ||\r\n Constants.EMPTY_STRING;\r\n return [sku, version];\r\n }\r\n /**\r\n *\r\n * @param entity\r\n */\r\n setAuthorityMetadata(key, entity) {\r\n this.logger.trace(\"BrowserCacheManager.setAuthorityMetadata called\");\r\n this.internalStorage.setItem(key, JSON.stringify(entity));\r\n }\r\n /**\r\n * Gets the active account\r\n */\r\n getActiveAccount() {\r\n const activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\r\n const activeAccountValueFilters = this.getItem(activeAccountKeyFilters);\r\n if (!activeAccountValueFilters) {\r\n // if new active account cache type isn't found, it's an old version, so look for that instead\r\n this.logger.trace(\"BrowserCacheManager.getActiveAccount: No active account filters cache schema found, looking for legacy schema\");\r\n const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\r\n const activeAccountValueLocal = this.getItem(activeAccountKeyLocal);\r\n if (!activeAccountValueLocal) {\r\n this.logger.trace(\"BrowserCacheManager.getActiveAccount: No active account found\");\r\n return null;\r\n }\r\n const activeAccount = this.getAccountInfoFilteredBy({\r\n localAccountId: activeAccountValueLocal,\r\n });\r\n if (activeAccount) {\r\n this.logger.trace(\"BrowserCacheManager.getActiveAccount: Legacy active account cache schema found\");\r\n this.logger.trace(\"BrowserCacheManager.getActiveAccount: Adding active account filters cache schema\");\r\n this.setActiveAccount(activeAccount);\r\n return activeAccount;\r\n }\r\n return null;\r\n }\r\n const activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters);\r\n if (activeAccountValueObj) {\r\n this.logger.trace(\"BrowserCacheManager.getActiveAccount: Active account filters schema found\");\r\n return this.getAccountInfoFilteredBy({\r\n homeAccountId: activeAccountValueObj.homeAccountId,\r\n localAccountId: activeAccountValueObj.localAccountId,\r\n tenantId: activeAccountValueObj.tenantId,\r\n });\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getActiveAccount: No active account found\");\r\n return null;\r\n }\r\n /**\r\n * Sets the active account's localAccountId in cache\r\n * @param account\r\n */\r\n setActiveAccount(account) {\r\n const activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\r\n const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\r\n if (account) {\r\n this.logger.verbose(\"setActiveAccount: Active account set\");\r\n const activeAccountValue = {\r\n homeAccountId: account.homeAccountId,\r\n localAccountId: account.localAccountId,\r\n tenantId: account.tenantId,\r\n };\r\n this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));\r\n this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);\r\n }\r\n else {\r\n this.logger.verbose(\"setActiveAccount: No account passed, active account not set\");\r\n this.browserStorage.removeItem(activeAccountKey);\r\n this.browserStorage.removeItem(activeAccountKeyLocal);\r\n }\r\n }\r\n /**\r\n * fetch throttling entity from the platform cache\r\n * @param throttlingCacheKey\r\n */\r\n getThrottlingCache(throttlingCacheKey) {\r\n const value = this.getItem(throttlingCacheKey);\r\n if (!value) {\r\n this.logger.trace(\"BrowserCacheManager.getThrottlingCache: called, no cache hit\");\r\n return null;\r\n }\r\n const parsedThrottlingCache = this.validateAndParseJson(value);\r\n if (!parsedThrottlingCache ||\r\n !CacheHelpers.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {\r\n this.logger.trace(\"BrowserCacheManager.getThrottlingCache: called, no cache hit\");\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getThrottlingCache: cache hit\");\r\n return parsedThrottlingCache;\r\n }\r\n /**\r\n * set throttling entity to the platform cache\r\n * @param throttlingCacheKey\r\n * @param throttlingCache\r\n */\r\n setThrottlingCache(throttlingCacheKey, throttlingCache) {\r\n this.logger.trace(\"BrowserCacheManager.setThrottlingCache called\");\r\n this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));\r\n }\r\n /**\r\n * Gets cache item with given key.\r\n * Will retrieve from cookies if storeAuthStateInCookie is set to true.\r\n * @param key\r\n */\r\n getTemporaryCache(cacheKey, generateKey) {\r\n const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\r\n if (this.cacheConfig.storeAuthStateInCookie) {\r\n const itemCookie = this.getItemCookie(key);\r\n if (itemCookie) {\r\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies\");\r\n return itemCookie;\r\n }\r\n }\r\n const value = this.temporaryCacheStorage.getItem(key);\r\n if (!value) {\r\n // If temp cache item not found in session/memory, check local storage for items set by old versions\r\n if (this.cacheConfig.cacheLocation ===\r\n BrowserCacheLocation.LocalStorage) {\r\n const item = this.browserStorage.getItem(key);\r\n if (item) {\r\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage\");\r\n return item;\r\n }\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: No cache item found in local storage\");\r\n return null;\r\n }\r\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: Temporary cache item returned\");\r\n return value;\r\n }\r\n /**\r\n * Sets the cache item with the key and value given.\r\n * Stores in cookie if storeAuthStateInCookie is set to true.\r\n * This can cause cookie overflow if used incorrectly.\r\n * @param key\r\n * @param value\r\n */\r\n setTemporaryCache(cacheKey, value, generateKey) {\r\n const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\r\n this.temporaryCacheStorage.setItem(key, value);\r\n if (this.cacheConfig.storeAuthStateInCookie) {\r\n this.logger.trace(\"BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie\");\r\n this.setItemCookie(key, value);\r\n }\r\n }\r\n /**\r\n * Removes the cache item with the given key.\r\n * @param key\r\n */\r\n removeItem(key) {\r\n this.browserStorage.removeItem(key);\r\n }\r\n /**\r\n * Removes the temporary cache item with the given key.\r\n * Will also clear the cookie item if storeAuthStateInCookie is set to true.\r\n * @param key\r\n */\r\n removeTemporaryItem(key) {\r\n this.temporaryCacheStorage.removeItem(key);\r\n if (this.cacheConfig.storeAuthStateInCookie) {\r\n this.logger.trace(\"BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie\");\r\n this.clearItemCookie(key);\r\n }\r\n }\r\n /**\r\n * Gets all keys in window.\r\n */\r\n getKeys() {\r\n return this.browserStorage.getKeys();\r\n }\r\n /**\r\n * Clears all cache entries created by MSAL.\r\n */\r\n async clear() {\r\n // Removes all accounts and their credentials\r\n await this.removeAllAccounts();\r\n this.removeAppMetadata();\r\n // Remove temp storage first to make sure any cookies are cleared\r\n this.temporaryCacheStorage.getKeys().forEach((cacheKey) => {\r\n if (cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1 ||\r\n cacheKey.indexOf(this.clientId) !== -1) {\r\n this.removeTemporaryItem(cacheKey);\r\n }\r\n });\r\n // Removes all remaining MSAL cache items\r\n this.browserStorage.getKeys().forEach((cacheKey) => {\r\n if (cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1 ||\r\n cacheKey.indexOf(this.clientId) !== -1) {\r\n this.browserStorage.removeItem(cacheKey);\r\n }\r\n });\r\n this.internalStorage.clear();\r\n }\r\n /**\r\n * Clears all access tokes that have claims prior to saving the current one\r\n * @param performanceClient {IPerformanceClient}\r\n * @param correlationId {string} correlation id\r\n * @returns\r\n */\r\n async clearTokensAndKeysWithClaims(performanceClient, correlationId) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.ClearTokensAndKeysWithClaims, correlationId);\r\n const tokenKeys = this.getTokenKeys();\r\n const removedAccessTokens = [];\r\n tokenKeys.accessToken.forEach((key) => {\r\n // if the access token has claims in its key, remove the token key and the token\r\n const credential = this.getAccessTokenCredential(key);\r\n if (credential?.requestedClaimsHash &&\r\n key.includes(credential.requestedClaimsHash.toLowerCase())) {\r\n removedAccessTokens.push(this.removeAccessToken(key));\r\n }\r\n });\r\n await Promise.all(removedAccessTokens);\r\n // warn if any access tokens are removed\r\n if (removedAccessTokens.length > 0) {\r\n this.logger.warning(`${removedAccessTokens.length} access tokens with claims in the cache keys have been removed from the cache.`);\r\n }\r\n }\r\n /**\r\n * Add value to cookies\r\n * @param cookieName\r\n * @param cookieValue\r\n * @param expires\r\n * @deprecated\r\n */\r\n setItemCookie(cookieName, cookieValue, expires) {\r\n let cookieStr = `${encodeURIComponent(cookieName)}=${encodeURIComponent(cookieValue)};path=/;SameSite=Lax;`;\r\n if (expires) {\r\n const expireTime = this.getCookieExpirationTime(expires);\r\n cookieStr += `expires=${expireTime};`;\r\n }\r\n if (this.cacheConfig.secureCookies) {\r\n cookieStr += \"Secure;\";\r\n }\r\n document.cookie = cookieStr;\r\n }\r\n /**\r\n * Get one item by key from cookies\r\n * @param cookieName\r\n * @deprecated\r\n */\r\n getItemCookie(cookieName) {\r\n const name = `${encodeURIComponent(cookieName)}=`;\r\n const cookieList = document.cookie.split(\";\");\r\n for (let i = 0; i < cookieList.length; i++) {\r\n let cookie = cookieList[i];\r\n while (cookie.charAt(0) === \" \") {\r\n cookie = cookie.substring(1);\r\n }\r\n if (cookie.indexOf(name) === 0) {\r\n return decodeURIComponent(cookie.substring(name.length, cookie.length));\r\n }\r\n }\r\n return Constants.EMPTY_STRING;\r\n }\r\n /**\r\n * Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.\r\n * @deprecated\r\n */\r\n clearMsalCookies() {\r\n const cookiePrefix = `${Constants.CACHE_PREFIX}.${this.clientId}`;\r\n const cookieList = document.cookie.split(\";\");\r\n cookieList.forEach((cookie) => {\r\n while (cookie.charAt(0) === \" \") {\r\n // eslint-disable-next-line no-param-reassign\r\n cookie = cookie.substring(1);\r\n }\r\n if (cookie.indexOf(cookiePrefix) === 0) {\r\n const cookieKey = cookie.split(\"=\")[0];\r\n this.clearItemCookie(cookieKey);\r\n }\r\n });\r\n }\r\n /**\r\n * Clear an item in the cookies by key\r\n * @param cookieName\r\n * @deprecated\r\n */\r\n clearItemCookie(cookieName) {\r\n this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);\r\n }\r\n /**\r\n * Get cookie expiration time\r\n * @param cookieLifeDays\r\n * @deprecated\r\n */\r\n getCookieExpirationTime(cookieLifeDays) {\r\n const today = new Date();\r\n const expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);\r\n return expr.toUTCString();\r\n }\r\n /**\r\n * Prepend msal. to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)\r\n * @param key\r\n * @param addInstanceId\r\n */\r\n generateCacheKey(key) {\r\n const generatedKey = this.validateAndParseJson(key);\r\n if (!generatedKey) {\r\n if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) ||\r\n StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {\r\n return key;\r\n }\r\n return `${Constants.CACHE_PREFIX}.${this.clientId}.${key}`;\r\n }\r\n return JSON.stringify(key);\r\n }\r\n /**\r\n * Create authorityKey to cache authority\r\n * @param state\r\n */\r\n generateAuthorityKey(stateString) {\r\n const { libraryState: { id: stateId }, } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n return this.generateCacheKey(`${TemporaryCacheKeys.AUTHORITY}.${stateId}`);\r\n }\r\n /**\r\n * Create Nonce key to cache nonce\r\n * @param state\r\n */\r\n generateNonceKey(stateString) {\r\n const { libraryState: { id: stateId }, } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n return this.generateCacheKey(`${TemporaryCacheKeys.NONCE_IDTOKEN}.${stateId}`);\r\n }\r\n /**\r\n * Creates full cache key for the request state\r\n * @param stateString State string for the request\r\n */\r\n generateStateKey(stateString) {\r\n // Use the library state id to key temp storage for uniqueness for multiple concurrent requests\r\n const { libraryState: { id: stateId }, } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n return this.generateCacheKey(`${TemporaryCacheKeys.REQUEST_STATE}.${stateId}`);\r\n }\r\n /**\r\n * Gets the cached authority based on the cached state. Returns empty if no cached state found.\r\n */\r\n getCachedAuthority(cachedState) {\r\n const stateCacheKey = this.generateStateKey(cachedState);\r\n const state = this.getTemporaryCache(stateCacheKey);\r\n if (!state) {\r\n return null;\r\n }\r\n const authorityCacheKey = this.generateAuthorityKey(state);\r\n return this.getTemporaryCache(authorityCacheKey);\r\n }\r\n /**\r\n * Updates account, authority, and state in cache\r\n * @param serverAuthenticationRequest\r\n * @param account\r\n */\r\n updateCacheEntries(state, nonce, authorityInstance, loginHint, account) {\r\n this.logger.trace(\"BrowserCacheManager.updateCacheEntries called\");\r\n // Cache the request state\r\n const stateCacheKey = this.generateStateKey(state);\r\n this.setTemporaryCache(stateCacheKey, state, false);\r\n // Cache the nonce\r\n const nonceCacheKey = this.generateNonceKey(state);\r\n this.setTemporaryCache(nonceCacheKey, nonce, false);\r\n // Cache authorityKey\r\n const authorityCacheKey = this.generateAuthorityKey(state);\r\n this.setTemporaryCache(authorityCacheKey, authorityInstance, false);\r\n if (account) {\r\n const ccsCredential = {\r\n credential: account.homeAccountId,\r\n type: CcsCredentialType.HOME_ACCOUNT_ID,\r\n };\r\n this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\r\n }\r\n else if (loginHint) {\r\n const ccsCredential = {\r\n credential: loginHint,\r\n type: CcsCredentialType.UPN,\r\n };\r\n this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\r\n }\r\n }\r\n /**\r\n * Reset all temporary cache items\r\n * @param state\r\n */\r\n resetRequestCache(state) {\r\n this.logger.trace(\"BrowserCacheManager.resetRequestCache called\");\r\n // check state and remove associated cache items\r\n if (state) {\r\n this.temporaryCacheStorage.getKeys().forEach((key) => {\r\n if (key.indexOf(state) !== -1) {\r\n this.removeTemporaryItem(key);\r\n }\r\n });\r\n // delete generic interactive request parameters\r\n this.removeTemporaryItem(this.generateStateKey(state));\r\n this.removeTemporaryItem(this.generateNonceKey(state));\r\n this.removeTemporaryItem(this.generateAuthorityKey(state));\r\n }\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));\r\n this.setInteractionInProgress(false);\r\n }\r\n /**\r\n * Removes temporary cache for the provided state\r\n * @param stateString\r\n */\r\n cleanRequestByState(stateString) {\r\n this.logger.trace(\"BrowserCacheManager.cleanRequestByState called\");\r\n // Interaction is completed - remove interaction status.\r\n if (stateString) {\r\n const stateKey = this.generateStateKey(stateString);\r\n const cachedState = this.temporaryCacheStorage.getItem(stateKey);\r\n this.logger.infoPii(`BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: ${cachedState}`);\r\n this.resetRequestCache(cachedState || Constants.EMPTY_STRING);\r\n }\r\n this.clearMsalCookies();\r\n }\r\n /**\r\n * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state\r\n * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.\r\n * @param interactionType\r\n */\r\n cleanRequestByInteractionType(interactionType) {\r\n this.logger.trace(\"BrowserCacheManager.cleanRequestByInteractionType called\");\r\n // Loop through all keys to find state key\r\n this.temporaryCacheStorage.getKeys().forEach((key) => {\r\n // If this key is not the state key, move on\r\n if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {\r\n return;\r\n }\r\n // Retrieve state value, return if not a valid value\r\n const stateValue = this.temporaryCacheStorage.getItem(key);\r\n if (!stateValue) {\r\n return;\r\n }\r\n // Extract state and ensure it matches given InteractionType, then clean request cache\r\n const parsedState = extractBrowserRequestState(this.cryptoImpl, stateValue);\r\n if (parsedState &&\r\n parsedState.interactionType === interactionType) {\r\n this.logger.infoPii(`BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: ${stateValue}`);\r\n this.resetRequestCache(stateValue);\r\n }\r\n });\r\n this.clearMsalCookies();\r\n this.setInteractionInProgress(false);\r\n }\r\n cacheCodeRequest(authCodeRequest) {\r\n this.logger.trace(\"BrowserCacheManager.cacheCodeRequest called\");\r\n const encodedValue = base64Encode(JSON.stringify(authCodeRequest));\r\n this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);\r\n }\r\n /**\r\n * Gets the token exchange parameters from the cache. Throws an error if nothing is found.\r\n */\r\n getCachedRequest(state) {\r\n this.logger.trace(\"BrowserCacheManager.getCachedRequest called\");\r\n // Get token request from cache and parse as TokenExchangeParameters.\r\n const encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);\r\n if (!encodedTokenRequest) {\r\n throw createBrowserAuthError(noTokenRequestCacheError);\r\n }\r\n let parsedRequest;\r\n try {\r\n parsedRequest = JSON.parse(base64Decode(encodedTokenRequest));\r\n }\r\n catch (e) {\r\n this.logger.errorPii(`Attempted to parse: ${encodedTokenRequest}`);\r\n this.logger.error(`Parsing cached token request threw with error: ${e}`);\r\n throw createBrowserAuthError(unableToParseTokenRequestCacheError);\r\n }\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\r\n // Get cached authority and use if no authority is cached with request.\r\n if (!parsedRequest.authority) {\r\n const authorityCacheKey = this.generateAuthorityKey(state);\r\n const cachedAuthority = this.getTemporaryCache(authorityCacheKey);\r\n if (!cachedAuthority) {\r\n throw createBrowserAuthError(noCachedAuthorityError);\r\n }\r\n parsedRequest.authority = cachedAuthority;\r\n }\r\n return parsedRequest;\r\n }\r\n /**\r\n * Gets cached native request for redirect flows\r\n */\r\n getCachedNativeRequest() {\r\n this.logger.trace(\"BrowserCacheManager.getCachedNativeRequest called\");\r\n const cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);\r\n if (!cachedRequest) {\r\n this.logger.trace(\"BrowserCacheManager.getCachedNativeRequest: No cached native request found\");\r\n return null;\r\n }\r\n const parsedRequest = this.validateAndParseJson(cachedRequest);\r\n if (!parsedRequest) {\r\n this.logger.error(\"BrowserCacheManager.getCachedNativeRequest: Unable to parse native request\");\r\n return null;\r\n }\r\n return parsedRequest;\r\n }\r\n isInteractionInProgress(matchClientId) {\r\n const clientId = this.getInteractionInProgress();\r\n if (matchClientId) {\r\n return clientId === this.clientId;\r\n }\r\n else {\r\n return !!clientId;\r\n }\r\n }\r\n getInteractionInProgress() {\r\n const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\r\n return this.getTemporaryCache(key, false);\r\n }\r\n setInteractionInProgress(inProgress) {\r\n // Ensure we don't overwrite interaction in progress for a different clientId\r\n const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\r\n if (inProgress) {\r\n if (this.getInteractionInProgress()) {\r\n throw createBrowserAuthError(interactionInProgress);\r\n }\r\n else {\r\n // No interaction is in progress\r\n this.setTemporaryCache(key, this.clientId, false);\r\n }\r\n }\r\n else if (!inProgress &&\r\n this.getInteractionInProgress() === this.clientId) {\r\n this.removeTemporaryItem(key);\r\n }\r\n }\r\n /**\r\n * Returns username retrieved from ADAL or MSAL v1 idToken\r\n * @deprecated\r\n */\r\n getLegacyLoginHint() {\r\n // Only check for adal/msal token if no SSO params are being used\r\n const adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);\r\n if (adalIdTokenString) {\r\n this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);\r\n this.logger.verbose(\"Cached ADAL id token retrieved.\");\r\n }\r\n // Check for cached MSAL v1 id token\r\n const msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);\r\n if (msalIdTokenString) {\r\n this.browserStorage.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));\r\n this.logger.verbose(\"Cached MSAL.js v1 id token retrieved\");\r\n }\r\n const cachedIdTokenString = msalIdTokenString || adalIdTokenString;\r\n if (cachedIdTokenString) {\r\n const idTokenClaims = AuthToken.extractTokenClaims(cachedIdTokenString, base64Decode);\r\n if (idTokenClaims.preferred_username) {\r\n this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint\");\r\n return idTokenClaims.preferred_username;\r\n }\r\n else if (idTokenClaims.upn) {\r\n this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint\");\r\n return idTokenClaims.upn;\r\n }\r\n else {\r\n this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.\");\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Updates a credential's cache key if the current cache key is outdated\r\n */\r\n updateCredentialCacheKey(currentCacheKey, credential) {\r\n const updatedCacheKey = CacheHelpers.generateCredentialKey(credential);\r\n if (currentCacheKey !== updatedCacheKey) {\r\n const cacheItem = this.getItem(currentCacheKey);\r\n if (cacheItem) {\r\n this.browserStorage.removeItem(currentCacheKey);\r\n this.setItem(updatedCacheKey, cacheItem);\r\n this.logger.verbose(`Updated an outdated ${credential.credentialType} cache key`);\r\n return updatedCacheKey;\r\n }\r\n else {\r\n this.logger.error(`Attempted to update an outdated ${credential.credentialType} cache key but no item matching the outdated key was found in storage`);\r\n }\r\n }\r\n return currentCacheKey;\r\n }\r\n /**\r\n * Builds credential entities from AuthenticationResult object and saves the resulting credentials to the cache\r\n * @param result\r\n * @param request\r\n */\r\n async hydrateCache(result, request) {\r\n const idTokenEntity = CacheHelpers.createIdTokenEntity(result.account?.homeAccountId, result.account?.environment, result.idToken, this.clientId, result.tenantId);\r\n let claimsHash;\r\n if (request.claims) {\r\n claimsHash = await this.cryptoImpl.hashString(request.claims);\r\n }\r\n /**\r\n * meta data for cache stores time in seconds from epoch\r\n * AuthenticationResult returns expiresOn and extExpiresOn in milliseconds (as a Date object which is in ms)\r\n * We need to map these for the cache when building tokens from AuthenticationResult\r\n *\r\n * The next MSAL VFuture should map these both to same value if possible\r\n */\r\n const accessTokenEntity = CacheHelpers.createAccessTokenEntity(result.account?.homeAccountId, result.account.environment, result.accessToken, this.clientId, result.tenantId, result.scopes.join(\" \"), result.expiresOn ? result.expiresOn.getTime() / 1000 : 0, result.extExpiresOn ? result.extExpiresOn.getTime() / 1000 : 0, base64Decode, undefined, // refreshOn\r\n result.tokenType, undefined, // userAssertionHash\r\n request.sshKid, request.claims, claimsHash);\r\n const cacheRecord = {\r\n idToken: idTokenEntity,\r\n accessToken: accessTokenEntity,\r\n };\r\n return this.saveCacheRecord(cacheRecord);\r\n }\r\n /**\r\n * saves a cache record\r\n * @param cacheRecord {CacheRecord}\r\n * @param storeInCache {?StoreInCache}\r\n * @param correlationId {?string} correlation id\r\n */\r\n async saveCacheRecord(cacheRecord, storeInCache, correlationId) {\r\n try {\r\n await super.saveCacheRecord(cacheRecord, storeInCache, correlationId);\r\n }\r\n catch (e) {\r\n if (e instanceof CacheError &&\r\n this.performanceClient &&\r\n correlationId) {\r\n try {\r\n const tokenKeys = this.getTokenKeys();\r\n this.performanceClient.addFields({\r\n cacheRtCount: tokenKeys.refreshToken.length,\r\n cacheIdCount: tokenKeys.idToken.length,\r\n cacheAtCount: tokenKeys.accessToken.length,\r\n }, correlationId);\r\n }\r\n catch (e) { }\r\n }\r\n throw e;\r\n }\r\n }\r\n}\r\nconst DEFAULT_BROWSER_CACHE_MANAGER = (clientId, logger) => {\r\n const cacheOptions = {\r\n cacheLocation: BrowserCacheLocation.MemoryStorage,\r\n temporaryCacheLocation: BrowserCacheLocation.MemoryStorage,\r\n storeAuthStateInCookie: false,\r\n secureCookies: false,\r\n cacheMigrationEnabled: false,\r\n claimsBasedCachingEnabled: false,\r\n };\r\n return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);\r\n};\n\nexport { BrowserCacheManager, DEFAULT_BROWSER_CACHE_MANAGER };\n//# sourceMappingURL=BrowserCacheManager.mjs.map\n","/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass MemoryStorage {\r\n constructor() {\r\n this.cache = new Map();\r\n }\r\n getItem(key) {\r\n return this.cache.get(key) || null;\r\n }\r\n setItem(key, value) {\r\n this.cache.set(key, value);\r\n }\r\n removeItem(key) {\r\n this.cache.delete(key);\r\n }\r\n getKeys() {\r\n const cacheKeys = [];\r\n this.cache.forEach((value, key) => {\r\n cacheKeys.push(key);\r\n });\r\n return cacheKeys;\r\n }\r\n containsKey(key) {\r\n return this.cache.has(key);\r\n }\r\n clear() {\r\n this.cache.clear();\r\n }\r\n}\n\nexport { MemoryStorage };\n//# sourceMappingURL=MemoryStorage.mjs.map\n","/*! @azure/msal-browser v3.23.0 2024-09-03 */\n'use strict';\nimport { AuthToken, Authority, AccountEntity, buildAccountToCache, CacheHelpers, ScopeSet } from '@azure/msal-common';\nimport { createBrowserAuthError } from '../error/BrowserAuthError.mjs';\nimport { base64Decode } from '../encode/Base64Decode.mjs';\nimport { createNewGuid } from '../crypto/BrowserCrypto.mjs';\nimport { nonBrowserEnvironment, unableToLoadToken } from '../error/BrowserAuthErrorCodes.mjs';\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Token cache manager\r\n */\r\nclass TokenCache {\r\n constructor(configuration, storage, logger, cryptoObj) {\r\n this.isBrowserEnvironment = typeof window !== \"undefined\";\r\n this.config = configuration;\r\n this.storage = storage;\r\n this.logger = logger;\r\n this.cryptoObj = cryptoObj;\r\n }\r\n // Move getAllAccounts here and cache utility APIs\r\n /**\r\n * API to load tokens to msal-browser cache.\r\n * @param request\r\n * @param response\r\n * @param options\r\n * @returns `AuthenticationResult` for the response that was loaded.\r\n */\r\n loadExternalTokens(request, response, options) {\r\n if (!this.isBrowserEnvironment) {\r\n throw createBrowserAuthError(nonBrowserEnvironment);\r\n }\r\n const idTokenClaims = response.id_token\r\n ? AuthToken.extractTokenClaims(response.id_token, base64Decode)\r\n : undefined;\r\n const authorityOptions = {\r\n protocolMode: this.config.auth.protocolMode,\r\n knownAuthorities: this.config.auth.knownAuthorities,\r\n cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\r\n authorityMetadata: this.config.auth.authorityMetadata,\r\n skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,\r\n };\r\n const authority = request.authority\r\n ? new Authority(Authority.generateAuthority(request.authority, request.azureCloudOptions), this.config.system.networkClient, this.storage, authorityOptions, this.logger, request.correlationId || createNewGuid())\r\n : undefined;\r\n const cacheRecordAccount = this.loadAccount(request, options.clientInfo || response.client_info || \"\", idTokenClaims, authority);\r\n const idToken = this.loadIdToken(response, cacheRecordAccount.homeAccountId, cacheRecordAccount.environment, cacheRecordAccount.realm);\r\n const accessToken = this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, cacheRecordAccount.environment, cacheRecordAccount.realm, options);\r\n const refreshToken = this.loadRefreshToken(response, cacheRecordAccount.homeAccountId, cacheRecordAccount.environment);\r\n return this.generateAuthenticationResult(request, {\r\n account: cacheRecordAccount,\r\n idToken,\r\n accessToken,\r\n refreshToken,\r\n }, idTokenClaims, authority);\r\n }\r\n /**\r\n * Helper function to load account to msal-browser cache\r\n * @param idToken\r\n * @param environment\r\n * @param clientInfo\r\n * @param authorityType\r\n * @param requestHomeAccountId\r\n * @returns `AccountEntity`\r\n */\r\n loadAccount(request, clientInfo, idTokenClaims, authority) {\r\n this.logger.verbose(\"TokenCache - loading account\");\r\n if (request.account) {\r\n const accountEntity = AccountEntity.createFromAccountInfo(request.account);\r\n this.storage.setAccount(accountEntity);\r\n return accountEntity;\r\n }\r\n else if (!authority || (!clientInfo && !idTokenClaims)) {\r\n this.logger.error(\"TokenCache - if an account is not provided on the request, authority and either clientInfo or idToken must be provided instead.\");\r\n throw createBrowserAuthError(unableToLoadToken);\r\n }\r\n const homeAccountId = AccountEntity.generateHomeAccountId(clientInfo, authority.authorityType, this.logger, this.cryptoObj, idTokenClaims);\r\n const claimsTenantId = idTokenClaims?.tid;\r\n const cachedAccount = buildAccountToCache(this.storage, authority, homeAccountId, base64Decode, idTokenClaims, clientInfo, authority.hostnameAndPort, claimsTenantId, undefined, // authCodePayload\r\n undefined, // nativeAccountId\r\n this.logger);\r\n this.storage.setAccount(cachedAccount);\r\n return cachedAccount;\r\n }\r\n /**\r\n * Helper function to load id tokens to msal-browser cache\r\n * @param idToken\r\n * @param homeAccountId\r\n * @param environment\r\n * @param tenantId\r\n * @returns `IdTokenEntity`\r\n */\r\n loadIdToken(response, homeAccountId, environment, tenantId) {\r\n if (!response.id_token) {\r\n this.logger.verbose(\"TokenCache - no id token found in response\");\r\n return null;\r\n }\r\n this.logger.verbose(\"TokenCache - loading id token\");\r\n const idTokenEntity = CacheHelpers.createIdTokenEntity(homeAccountId, environment, response.id_token, this.config.auth.clientId, tenantId);\r\n this.storage.setIdTokenCredential(idTokenEntity);\r\n return idTokenEntity;\r\n }\r\n /**\r\n * Helper function to load access tokens to msal-browser cache\r\n * @param request\r\n * @param response\r\n * @param homeAccountId\r\n * @param environment\r\n * @param tenantId\r\n * @returns `AccessTokenEntity`\r\n */\r\n loadAccessToken(request, response, homeAccountId, environment, tenantId, options) {\r\n if (!response.access_token) {\r\n this.logger.verbose(\"TokenCache - no access token found in response\");\r\n return null;\r\n }\r\n else if (!response.expires_in) {\r\n this.logger.error(\"TokenCache - no expiration set on the access token. Cannot add it to the cache.\");\r\n return null;\r\n }\r\n else if (!response.scope &&\r\n (!request.scopes || !request.scopes.length)) {\r\n this.logger.error(\"TokenCache - scopes not specified in the request or response. Cannot add token to the cache.\");\r\n return null;\r\n }\r\n this.logger.verbose(\"TokenCache - loading access token\");\r\n const scopes = response.scope\r\n ? ScopeSet.fromString(response.scope)\r\n : new ScopeSet(request.scopes);\r\n const expiresOn = options.expiresOn ||\r\n response.expires_in + new Date().getTime() / 1000;\r\n const extendedExpiresOn = options.extendedExpiresOn ||\r\n (response.ext_expires_in || response.expires_in) +\r\n new Date().getTime() / 1000;\r\n const accessTokenEntity = CacheHelpers.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes.printScopes(), expiresOn, extendedExpiresOn, base64Decode);\r\n this.storage.setAccessTokenCredential(accessTokenEntity);\r\n return accessTokenEntity;\r\n }\r\n /**\r\n * Helper function to load refresh tokens to msal-browser cache\r\n * @param request\r\n * @param response\r\n * @param homeAccountId\r\n * @param environment\r\n * @returns `RefreshTokenEntity`\r\n */\r\n loadRefreshToken(response, homeAccountId, environment) {\r\n if (!response.refresh_token) {\r\n this.logger.verbose(\"TokenCache - no refresh token found in response\");\r\n return null;\r\n }\r\n this.logger.verbose(\"TokenCache - loading refresh token\");\r\n const refreshTokenEntity = CacheHelpers.createRefreshTokenEntity(homeAccountId, environment, response.refresh_token, this.config.auth.clientId, response.foci, undefined, // userAssertionHash\r\n response.refresh_token_expires_in);\r\n this.storage.setRefreshTokenCredential(refreshTokenEntity);\r\n return refreshTokenEntity;\r\n }\r\n /**\r\n * Helper function to generate an `AuthenticationResult` for the result.\r\n * @param request\r\n * @param idTokenObj\r\n * @param cacheRecord\r\n * @param authority\r\n * @returns `AuthenticationResult`\r\n */\r\n generateAuthenticationResult(request, cacheRecord, idTokenClaims, authority) {\r\n let accessToken = \"\";\r\n let responseScopes = [];\r\n let expiresOn = null;\r\n let extExpiresOn;\r\n if (cacheRecord?.accessToken) {\r\n accessToken = cacheRecord.accessToken.secret;\r\n responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();\r\n expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);\r\n extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);\r\n }\r\n const accountEntity = cacheRecord.account;\r\n return {\r\n authority: authority ? authority.canonicalAuthority : \"\",\r\n uniqueId: cacheRecord.account.localAccountId,\r\n tenantId: cacheRecord.account.realm,\r\n scopes: responseScopes,\r\n account: accountEntity.getAccountInfo(),\r\n idToken: cacheRecord.idToken?.secret || \"\",\r\n idTokenClaims: idTokenClaims || {},\r\n accessToken: accessToken,\r\n fromCache: true,\r\n expiresOn: expiresOn,\r\n correlationId: request.correlationId || \"\",\r\n requestId: \"\",\r\n extExpiresOn: extExpiresOn,\r\n familyId: cacheRecord.refreshToken?.familyId || \"\",\r\n tokenType: cacheRecord?.accessToken?.tokenType || \"\",\r\n state: request.state || \"\",\r\n cloudGraphHostName: accountEntity.cloudGraphHostName || \"\",\r\n msGraphHost: accountEntity.msGraphHost || \"\",\r\n fromNativeBroker: false,\r\n };\r\n }\r\n}\n\nexport { TokenCache };\n//# sourceMappingURL=TokenCache.mjs.map\n"],"names":["getAllAccounts","logger","browserStorage","isInBrowser","accountFilter","verbose","getAccount","trace","Object","keys","length","warning","account","getAccountInfoFilteredBy","getAccountByUsername","username","verbosePii","getAccountByHomeId","homeAccountId","getAccountByLocalId","localAccountId","setActiveAccount","getActiveAccount","DatabaseStorage","constructor","this","dbName","version","tableName","dbOpen","async","Promise","resolve","reject","openDB","window","indexedDB","open","addEventListener","e","target","result","createObjectStore","event","db","closeConnection","close","key","validateDbIsOpen","dbGet","transaction","objectStore","get","payload","dbPut","put","dbDelete","delete","dbGetKeys","getAllKeys","dbContainsKey","count","deleteDbRequest","deleteDatabase","id","setTimeout","clearTimeout","AsyncMemoryStorage","inMemoryCache","MemoryStorage","indexedDBCache","handleDatabaseAccessError","error","BrowserAuthError","errorCode","item","getItem","value","setItem","removeItem","cacheKeys","getKeys","containsKey","clearInMemory","clear","dbDeleted","BrowserStorage","cacheLocation","validateWindowStorage","windowStorage","hasOwnProperty","BrowserCacheManager","CacheManager","clientId","cacheConfig","cryptoImpl","staticAuthorityOptions","performanceClient","super","COOKIE_LIFE_MULTIPLIER","internalStorage","setupBrowserStorage","temporaryCacheStorage","setupTemporaryCacheStorage","temporaryCacheLocation","cacheMigrationEnabled","migrateCacheEntries","createKeyMaps","idTokenKey","Constants","clientInfoKey","errorKey","errorDescKey","values","forEach","cacheKey","index","setTemporaryCache","accountKeys","tokenKeys","isCredentialKey","credObj","validateAndParseJson","CacheHelpers","tracePii","idTokenEntity","newKey","updateCredentialCacheKey","addTokenKey","accessTokenEntity","refreshTokenEntity","isAccountKey","accountObj","AccountEntity","addAccountKeyToMap","jsonValue","parsedJson","JSON","parse","accountKey","accountEntity","getCachedAccountEntity","updateOutdatedCachedAccount","serializedAccount","removeAccountKeyFromMap","parsedAccount","setAccount","generateAccountKey","stringify","getAccountKeys","indexOf","push","removalIndex","splice","removeAccount","removeOutdatedAccount","removeIdToken","removeTokenKey","removeAccessToken","removeRefreshToken","getTokenKeys","idToken","accessToken","refreshToken","type","info","ClientAuthErrorCodes","infoPii","idRemoval","accessRemoval","refreshRemoval","getIdTokenCredential","parsedIdToken","setIdTokenCredential","getAccessTokenCredential","accessTokenKey","parsedAccessToken","setAccessTokenCredential","getRefreshTokenCredential","refreshTokenKey","parsedRefreshToken","setRefreshTokenCredential","getAppMetadata","appMetadataKey","parsedMetadata","setAppMetadata","appMetadata","getServerTelemetry","serverTelemetryKey","parsedEntity","setServerTelemetry","serverTelemetry","getAuthorityMetadata","getAuthorityMetadataKeys","filter","isAuthorityMetadata","setWrapperMetadata","wrapperSKU","wrapperVersion","getWrapperMetadata","setAuthorityMetadata","entity","activeAccountKeyFilters","generateCacheKey","activeAccountValueFilters","activeAccountKeyLocal","activeAccountValueLocal","activeAccount","activeAccountValueObj","tenantId","activeAccountKey","activeAccountValue","getThrottlingCache","throttlingCacheKey","parsedThrottlingCache","setThrottlingCache","throttlingCache","getTemporaryCache","generateKey","storeAuthStateInCookie","itemCookie","getItemCookie","setItemCookie","removeTemporaryItem","clearItemCookie","removeAllAccounts","removeAppMetadata","correlationId","addQueueMeasurement","PerformanceEvent","removedAccessTokens","credential","requestedClaimsHash","includes","toLowerCase","all","cookieName","cookieValue","expires","cookieStr","encodeURIComponent","getCookieExpirationTime","secureCookies","document","cookie","name","cookieList","split","i","charAt","substring","decodeURIComponent","clearMsalCookies","cookiePrefix","cookieKey","cookieLifeDays","today","Date","getTime","toUTCString","StringUtils","generateAuthorityKey","stateString","libraryState","stateId","ProtocolUtils","generateNonceKey","generateStateKey","getCachedAuthority","cachedState","stateCacheKey","state","authorityCacheKey","updateCacheEntries","nonce","authorityInstance","loginHint","nonceCacheKey","ccsCredential","CcsCredential","resetRequestCache","setInteractionInProgress","cleanRequestByState","stateKey","cleanRequestByInteractionType","interactionType","stateValue","parsedState","cacheCodeRequest","authCodeRequest","encodedValue","getCachedRequest","encodedTokenRequest","parsedRequest","errorPii","authority","cachedAuthority","getCachedNativeRequest","cachedRequest","isInteractionInProgress","matchClientId","getInteractionInProgress","inProgress","getLegacyLoginHint","adalIdTokenString","msalIdTokenString","cachedIdTokenString","idTokenClaims","AuthToken","preferred_username","upn","currentCacheKey","updatedCacheKey","cacheItem","credentialType","request","environment","claimsHash","claims","hashString","cacheRecord","scopes","join","expiresOn","extExpiresOn","undefined","tokenType","sshKid","saveCacheRecord","storeInCache","CacheError","addFields","cacheRtCount","cacheIdCount","cacheAtCount","DEFAULT_BROWSER_CACHE_MANAGER","cacheOptions","claimsBasedCachingEnabled","cache","Map","set","has","TokenCache","configuration","storage","cryptoObj","isBrowserEnvironment","config","loadExternalTokens","response","options","id_token","authorityOptions","protocolMode","auth","knownAuthorities","cloudDiscoveryMetadata","authorityMetadata","skipAuthorityMetadataCache","azureCloudOptions","system","networkClient","cacheRecordAccount","loadAccount","clientInfo","client_info","loadIdToken","realm","loadAccessToken","loadRefreshToken","generateAuthenticationResult","authorityType","claimsTenantId","tid","cachedAccount","hostnameAndPort","access_token","expires_in","scope","extendedExpiresOn","ext_expires_in","printScopes","refresh_token","foci","refresh_token_expires_in","responseScopes","secret","asArray","Number","canonicalAuthority","uniqueId","getAccountInfo","fromCache","requestId","familyId","cloudGraphHostName","msGraphHost","fromNativeBroker"],"sourceRoot":""}