Clear local storage when quota exceeded (#34109)

Closes #19101

Signed-off-by: Jon Koops <jonkoops@gmail.com>
This commit is contained in:
Jon Koops 2024-10-19 18:49:02 +02:00 committed by GitHub
parent 47a7d9c12e
commit 12e427cd85
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1607,12 +1607,7 @@ function Keycloak (config) {
function clearInvalidValues() { function clearInvalidValues() {
const currentTime = Date.now(); const currentTime = Date.now();
for (const [key, value] of Object.entries(localStorage)) { for (const [key, value] of getStoredEntries()) {
// Ignore values not known to be stored by us.
if (!key.startsWith(STORAGE_KEY_PREFIX)) {
continue;
}
// Attempt to parse the expiry time from the value. // Attempt to parse the expiry time from the value.
const expiry = parseExpiry(value); const expiry = parseExpiry(value);
@ -1623,6 +1618,23 @@ function Keycloak (config) {
} }
} }
/**
* Clears all known values from local storage.
*/
function clearAllValues() {
for (const [key] of getStoredEntries()) {
localStorage.removeItem(key);
}
}
/**
* Gets all entries stored in local storage that are known to be managed by this class.
* @returns {Array<[string, unknown]>} An array of key-value pairs.
*/
function getStoredEntries() {
return Object.entries(localStorage).filter(([key]) => key.startsWith(STORAGE_KEY_PREFIX));
}
/** /**
* Parses the expiry time from a value stored in local storage. * Parses the expiry time from a value stored in local storage.
* @param {unknown} value * @param {unknown} value
@ -1665,9 +1677,20 @@ function Keycloak (config) {
cs.add = function(state) { cs.add = function(state) {
clearInvalidValues(); clearInvalidValues();
var key = STORAGE_KEY_PREFIX + state.state; const key = STORAGE_KEY_PREFIX + state.state;
state.expires = new Date().getTime() + (60 * 60 * 1000); const value = JSON.stringify({
localStorage.setItem(key, JSON.stringify(state)); ...state,
// Set the expiry time to 1 hour from now.
expires: Date.now() + (60 * 60 * 1000)
});
try {
localStorage.setItem(key, value);
} catch (error) {
// If the storage is full, clear all known values and try again.
clearAllValues();
localStorage.setItem(key, value);
}
}; };
}; };