| | |
| | | /** |
| | | * Get a setting value |
| | | */ |
| | | /** |
| | | * Get a setting value |
| | | */ |
| | | get(key) { |
| | | //Check memory cache first |
| | | if (this._cache.has(key)) { |
| | |
| | | if (!item) { |
| | | return null; |
| | | } |
| | | item = JSON.parse(item); |
| | | item = this._revive(JSON.parse(item)); |
| | | } catch (error) { |
| | | console.warn('Error getting from localStorage:', error); |
| | | return null; |
| | |
| | | set(key, value) { |
| | | this._cache.set(key, value); |
| | | let cacheKey = `${this.base}_${key}`; |
| | | let serialized = JSON.stringify(this._serialize(value)); |
| | | |
| | | try { |
| | | localStorage.setItem(cacheKey, JSON.stringify(value)); |
| | | localStorage.setItem(cacheKey, serialized); |
| | | } catch (error) { |
| | | // Handle quota exceeded |
| | | if (error instanceof DOMException && error.code === 22) { |
| | | this.clearOldestLocalStorageItems(); |
| | | try { |
| | | localStorage.setItem(key, JSON.stringify(item)); |
| | | localStorage.setItem(cacheKey, serialized); |
| | | } catch (retryError) { |
| | | console.warn('Still failed to set localStorage item after cleanup:', retryError); |
| | | } |
| | |
| | | this.notify('cache-saved', { key, value }); |
| | | } |
| | | |
| | | /** |
| | | * Tag Maps/Sets so they survive JSON round-tripping |
| | | */ |
| | | _serialize(value) { |
| | | if (value instanceof Map) { |
| | | return { __type: 'Map', value: Array.from(value.entries()) }; |
| | | } |
| | | if (value instanceof Set) { |
| | | return { __type: 'Set', value: Array.from(value.values()) }; |
| | | } |
| | | return value; |
| | | } |
| | | |
| | | /** |
| | | * Revive a parsed value, restoring Maps/Sets if tagged |
| | | */ |
| | | _revive(parsed) { |
| | | if (parsed && typeof parsed === 'object') { |
| | | if (parsed.__type === 'Map') return new Map(parsed.value); |
| | | if (parsed.__type === 'Set') return new Set(parsed.value); |
| | | } |
| | | return parsed; |
| | | } |
| | | |
| | | remove(key) { |
| | | let cacheKey = `${this.base}_${key}`; |
| | | try { |
| | |
| | | let cleanKey = key.replace(`${this.base}_`, ''); |
| | | try { |
| | | // Parse the JSON value before caching |
| | | const value = JSON.parse(localStorage.getItem(key)); |
| | | const value = this._revive(JSON.parse(localStorage.getItem(key))); |
| | | this._cache.set(cleanKey, value); |
| | | } catch (error) { |
| | | console.warn(`Failed to parse cached value for ${key}:`, error); |