fix: 处理非原子性的先清除后写入操作会setKeys带来永久性数据丢失的风险

master^2
layhuts 2026-05-09 13:16:50 +08:00
parent f2a17cbe78
commit c78d89f549
1 changed files with 8 additions and 2 deletions

View File

@ -94,11 +94,17 @@ function createIndexedDBAdapter(
}, },
async setKeys(keys) { async setKeys(keys) {
try { try {
// 先清除旧数据,再逐条写入 const newKeySet = new Set(keys.map(String));
await manager.clear(); // 先写入新数据,确保数据安全落盘
await Promise.all( await Promise.all(
keys.map((key) => manager.setItem(String(key), key, opts.ttl)), keys.map((key) => manager.setItem(String(key), key, opts.ttl)),
); );
// 再清理不在新集合中的旧 key
const existingKeys = await manager.keys();
const toRemove = existingKeys.filter((k) => !newKeySet.has(k));
if (toRemove.length > 0) {
await Promise.all(toRemove.map((k) => manager.removeItem(k)));
}
} catch (error) { } catch (error) {
console.error('[viewedRow] indexedDB persist failed:', error); console.error('[viewedRow] indexedDB persist failed:', error);
} }