diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f256aec5c..9ef78c60dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - ### Client -- +- Fix: ログアウトした際に処理が終了しない問題を修正 ### Server - diff --git a/packages/frontend/src/signout.ts b/packages/frontend/src/signout.ts index c9f9278369..60509d3d07 100644 --- a/packages/frontend/src/signout.ts +++ b/packages/frontend/src/signout.ts @@ -6,7 +6,8 @@ import { apiUrl } from '@@/js/config.js'; import { defaultMemoryStorage } from '@/memory-storage'; import { waiting } from '@/os.js'; -import { unisonReload, reloadChannel } from '@/utility/unison-reload.js'; +import { unisonReload } from '@/utility/unison-reload.js'; +import { clear } from '@/utility/idb-proxy.js'; import { $i } from '@/i.js'; export async function signout() { @@ -19,13 +20,30 @@ export async function signout() { localStorage.clear(); defaultMemoryStorage.clear(); - const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => { + const idbAbortController = new AbortController(); + const timeout = window.setTimeout(() => idbAbortController.abort(), 5000); + + const idbPromises = ['MisskeyClient'].map((name, i, arr) => new Promise((res, rej) => { const delidb = indexedDB.deleteDatabase(name); delidb.onsuccess = () => res(); delidb.onerror = e => rej(e); + delidb.onblocked = () => idbAbortController.signal.aborted && rej(new Error('Operation aborted')); })); - await Promise.all(idbPromises); + try { + await Promise.race([ + Promise.all([ + ...idbPromises, + // idb keyval-storeはidb-keyvalライブラリによる別管理 + clear(), + ]), + new Promise((_, rej) => idbAbortController.signal.addEventListener('abort', () => rej(new Error('Operation timed out')))), + ]); + } catch { + // nothing + } finally { + window.clearTimeout(timeout); + } //#region Remove service worker registration try { @@ -50,7 +68,9 @@ export async function signout() { .then(registrations => { return Promise.all(registrations.map(registration => registration.unregister())); }); - } catch (err) {} + } catch { + // nothing + } //#endregion unisonReload('/'); diff --git a/packages/frontend/src/utility/idb-proxy.ts b/packages/frontend/src/utility/idb-proxy.ts index 20f51660c7..350169a81d 100644 --- a/packages/frontend/src/utility/idb-proxy.ts +++ b/packages/frontend/src/utility/idb-proxy.ts @@ -9,6 +9,7 @@ import { get as iget, set as iset, del as idel, + clear as iclear, } from 'idb-keyval'; import { miLocalStorage } from '@/local-storage.js'; @@ -51,3 +52,7 @@ export async function del(key: string) { if (idbAvailable) return idel(key); return miLocalStorage.removeItem(`${PREFIX}${key}`); } + +export async function clear() { + if (idbAvailable) return iclear(); +}