

























@@ -40,6 +40,7 @@ import {
4040getActiveSessionMaintenanceWarning,
4141pruneStaleEntries,
4242rotateSessionFile,
43+shouldRunSessionEntryMaintenance,
4344type ResolvedSessionMaintenanceConfig,
4445type SessionMaintenanceWarning,
4546} from "./store-maintenance.js";
@@ -243,10 +244,16 @@ async function saveSessionStoreUnlocked(
243244 : { ...resolveMaintenanceConfig(), ...opts?.maintenanceOverride };
244245const shouldWarnOnly = maintenance.mode === "warn";
245246const beforeCount = Object.keys(store).length;
247+const forceMaintenance = opts?.maintenanceOverride !== undefined;
248+const shouldRunEntryMaintenance = shouldRunSessionEntryMaintenance({
249+entryCount: beforeCount,
250+maxEntries: maintenance.maxEntries,
251+force: forceMaintenance,
252+});
246253247254if (shouldWarnOnly) {
248255const activeSessionKey = opts?.activeSessionKey?.trim();
249-if (activeSessionKey) {
256+if (activeSessionKey && shouldRunEntryMaintenance) {
250257const warning = getActiveSessionMaintenanceWarning({
251258 store,
252259 activeSessionKey,
@@ -292,12 +299,21 @@ async function saveSessionStoreUnlocked(
292299},
293300preserveKeys: preserveSessionKeys,
294301});
295-const capped = capEntryCount(store, maintenance.maxEntries, {
296-onCapped: ({ entry }) => {
297-rememberRemovedSessionFile(removedSessionFiles, entry);
298-},
299-preserveKeys: preserveSessionKeys,
300-});
302+const countAfterPrune = Object.keys(store).length;
303+const shouldRunCapMaintenance =
304+forceMaintenance ||
305+shouldRunSessionEntryMaintenance({
306+entryCount: countAfterPrune,
307+maxEntries: maintenance.maxEntries,
308+});
309+const capped = shouldRunCapMaintenance
310+ ? capEntryCount(store, maintenance.maxEntries, {
311+onCapped: ({ entry }) => {
312+rememberRemovedSessionFile(removedSessionFiles, entry);
313+},
314+preserveKeys: preserveSessionKeys,
315+})
316+ : 0;
301317const archivedDirs = new Set<string>();
302318const referencedSessionIds = new Set(
303319Object.values(store)
@@ -425,7 +441,7 @@ export async function updateSessionStore<T>(
425441): Promise<T> {
426442return await withSessionStoreLock(storePath, async () => {
427443// Always re-read inside the lock to avoid clobbering concurrent writers.
428-const store = loadSessionStore(storePath, { skipCache: true });
444+const store = loadSessionStore(storePath, { skipCache: true, clone: false });
429445const previousAcpByKey = collectAcpMetadataSnapshot(store);
430446const result = await mutator(store);
431447preserveExistingAcpMetadata({
@@ -648,7 +664,7 @@ export async function updateSessionStoreEntry(params: {
648664}): Promise<SessionEntry | null> {
649665const { storePath, sessionKey, update } = params;
650666return await withSessionStoreLock(storePath, async () => {
651-const store = loadSessionStore(storePath, { skipCache: true });
667+const store = loadSessionStore(storePath, { skipCache: true, clone: false });
652668const resolved = resolveSessionStoreEntry({ store, sessionKey });
653669const existing = resolved.existing;
654670if (!existing) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。