Jake Vanderwerf
10 days ago de317675a8069b747cb253ba3e2b5dc394ca36ef
assets/js/concise/SimpleCache.js
@@ -18,7 +18,7 @@
   constructor(base, config = {}) {
      this.base = base;
      this.config = {
         namespace: 'jvb_cache',
         namespace: `${jvbBase.base}cache`,
         TTL: 3600000,
         maxSize: 100,
         ...config
@@ -45,6 +45,9 @@
   /**
    * Get a setting value
    */
   /**
    * Get a setting value
    */
   get(key) {
      //Check memory cache first
      if (this._cache.has(key)) {
@@ -54,11 +57,11 @@
      let cacheKey = `${this.base}_${key}`;
      let item;
      try {
         item =  localStorage.getItem(cacheKey);
         item = localStorage.getItem(cacheKey);
         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;
@@ -76,15 +79,16 @@
   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);
            }
@@ -97,6 +101,30 @@
      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 {
@@ -150,7 +178,7 @@
            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);