diff --git a/src/lib/app_components/e_app_sys_bar.svelte b/src/lib/app_components/e_app_sys_bar.svelte index f6149850..8f25f3a8 100644 --- a/src/lib/app_components/e_app_sys_bar.svelte +++ b/src/lib/app_components/e_app_sys_bar.svelte @@ -549,24 +549,24 @@ function apply_theme(value: string) { {/if} - + - + diff --git a/src/routes/testing/fix-sw/+page.svelte b/src/routes/testing/fix-sw/+page.svelte index be54ed01..ea0c4b4e 100644 --- a/src/routes/testing/fix-sw/+page.svelte +++ b/src/routes/testing/fix-sw/+page.svelte @@ -2,75 +2,184 @@ import { onMount } from 'svelte'; let status: string[] = $state([]); +let done = $state(false); +let has_error = $state(false); function log(msg: string) { status = [...status, `${new Date().toLocaleTimeString()} - ${msg}`]; console.log(`[FIX-SW] ${msg}`); } -async function nukeServiceWorkers() { - log('Starting Service Worker cleanup...'); +function log_ok(msg: string) { + log(`✓ ${msg}`); +} - if (!('serviceWorker' in navigator)) { - log('Service Workers not supported in this browser.'); - return; +function log_warn(msg: string) { + log(`⚠ ${msg}`); +} + +async function nuke_everything() { + log('Starting full storage reset...'); + + // 1. Unregister all service workers + if ('serviceWorker' in navigator) { + try { + const registrations = await navigator.serviceWorker.getRegistrations(); + if (registrations.length === 0) { + log_warn('No active service worker registrations found.'); + } else { + log(`Found ${registrations.length} service worker registration(s).`); + for (const reg of registrations) { + const ok = await reg.unregister(); + log_ok(`Unregistered SW at scope: ${reg.scope} (success: ${ok})`); + } + } + } catch (err: any) { + has_error = true; + log(`ERROR unregistering service workers: ${err.message}`); + } + } else { + log_warn('Service Workers not supported in this browser.'); } + // 2. Clear all Cache Storage caches try { - const registrations = await navigator.serviceWorker.getRegistrations(); - log(`Found ${registrations.length} registrations.`); - - for (const registration of registrations) { - const scope = registration.scope; - log(`Unregistering SW at scope: ${scope}`); - const success = await registration.unregister(); - log(`Unregister success: ${success}`); + const cache_keys = await caches.keys(); + if (cache_keys.length === 0) { + log_warn('No Cache Storage entries found.'); + } else { + for (const key of cache_keys) { + await caches.delete(key); + log_ok(`Cleared cache: ${key}`); + } } - - if (registrations.length === 0) { - log('No active Service Workers found.'); - } - - log('Clearing Cache Storage...'); - const cacheKeys = await caches.keys(); - for (const key of cacheKeys) { - log(`Deleting cache: ${key}`); - await caches.delete(key); - } - log('Cache storage cleared.'); - - log('DONE. Please reload the application now.'); } catch (err: any) { - log(`ERROR: ${err.message}`); - console.error(err); + has_error = true; + log(`ERROR clearing Cache Storage: ${err.message}`); } + + // 3. Clear all IndexedDB databases + try { + if ('databases' in indexedDB) { + const db_list = await indexedDB.databases(); + if (db_list.length === 0) { + log_warn('No IndexedDB databases found.'); + } else { + for (const db_info of db_list) { + if (!db_info.name) continue; + await new Promise((resolve, reject) => { + const req = indexedDB.deleteDatabase(db_info.name!); + req.onsuccess = () => { + log_ok(`Deleted IDB database: ${db_info.name}`); + resolve(); + }; + req.onerror = () => { + log(`ERROR deleting IDB database: ${db_info.name}`); + has_error = true; + resolve(); // continue anyway + }; + req.onblocked = () => { + log_warn(`IDB delete blocked (open connections): ${db_info.name} — will proceed`); + resolve(); + }; + }); + } + } + } else { + // Fallback: delete known Aether databases by name + log_warn('indexedDB.databases() not available — deleting known Aether databases by name.'); + const known_dbs = [ + 'ae_core_db', 'ae_events_db', 'ae_journals_db', + 'ae_archives_db', 'ae_posts_db', 'ae_idaa_db', + 'ae_sponsorships_db', 'ae_reports_db', + ]; + for (const name of known_dbs) { + await new Promise((resolve) => { + const req = indexedDB.deleteDatabase(name); + req.onsuccess = () => { log_ok(`Deleted IDB database: ${name}`); resolve(); }; + req.onerror = () => { resolve(); }; // not present = silent + req.onblocked = () => { log_warn(`IDB delete blocked: ${name}`); resolve(); }; + }); + } + } + } catch (err: any) { + has_error = true; + log(`ERROR clearing IndexedDB: ${err.message}`); + } + + // 4. Clear localStorage + try { + const local_count = localStorage.length; + localStorage.clear(); + log_ok(`Cleared localStorage (${local_count} item(s)).`); + } catch (err: any) { + has_error = true; + log(`ERROR clearing localStorage: ${err.message}`); + } + + // 5. Clear sessionStorage + try { + const session_count = sessionStorage.length; + sessionStorage.clear(); + log_ok(`Cleared sessionStorage (${session_count} item(s)).`); + } catch (err: any) { + has_error = true; + log(`ERROR clearing sessionStorage: ${err.message}`); + } + + log('─── Reset complete. Reloading in 3 seconds... ───'); + done = true; + + // Auto-reload after a short pause so the user can read the log + await new Promise((r) => setTimeout(r, 3000)); + window.location.href = '/'; } onMount(() => { - nukeServiceWorkers(); + nuke_everything(); });
-

- Service Worker Reset Tool -

-

- Attempting to unregister all service workers and clear caches to fix the - TypeError loop. +

Full Storage Reset

+

+ Clears everything for this domain: service workers, SW cache, IndexedDB, + localStorage, sessionStorage — then reloads. +

+

+ Use this if you are completely stuck on an old version of the app and nothing else has + worked.

-
+
{#each status as line, i (i)} -
+
{line}
{/each} + {#if !done} +
Working...
+ {/if}
- + {#if done} +
+

+ {has_error + ? 'Reset finished with some errors. Reloading...' + : 'Reset complete! Reloading to home page...'} +

+ +
+ {/if}