fix(frontend): keyval-storeの値が削除できずに処理が止まる問題を修正 (#15803)

* fix(frontend): keyval-storeの値が削除できずに処理が止まる問題を修正

* Update Changelog

* implement abortcontroller

* fix lint
This commit is contained in:
かっこかり 2025-04-13 15:48:43 +09:00 committed by GitHub
parent 81bf139e3e
commit dd5dd6184a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 30 additions and 5 deletions

View file

@ -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<void>((res, rej) => {
const idbAbortController = new AbortController();
const timeout = window.setTimeout(() => idbAbortController.abort(), 5000);
const idbPromises = ['MisskeyClient'].map((name, i, arr) => new Promise<void>((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('/');