summaryrefslogtreecommitdiff
path: root/packages/frontend/src
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2025-04-13 15:48:43 +0900
committerGitHub <noreply@github.com>2025-04-13 15:48:43 +0900
commitdd5dd6184a6640cd3f8a91582ea5673697e45e31 (patch)
tree187c64112279fb75e02aa92a3d7a437ea779bd1b /packages/frontend/src
parentfix(deps): update dependency @nestjs/common to v11.0.16 [security] (#15800) (diff)
downloadsharkey-dd5dd6184a6640cd3f8a91582ea5673697e45e31.tar.gz
sharkey-dd5dd6184a6640cd3f8a91582ea5673697e45e31.tar.bz2
sharkey-dd5dd6184a6640cd3f8a91582ea5673697e45e31.zip
fix(frontend): keyval-storeの値が削除できずに処理が止まる問題を修正 (#15803)
* fix(frontend): keyval-storeの値が削除できずに処理が止まる問題を修正 * Update Changelog * implement abortcontroller * fix lint
Diffstat (limited to 'packages/frontend/src')
-rw-r--r--packages/frontend/src/signout.ts28
-rw-r--r--packages/frontend/src/utility/idb-proxy.ts5
2 files changed, 29 insertions, 4 deletions
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<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('/');
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();
+}