






















@@ -156,12 +156,19 @@ export function resolveMaintenanceConfigFromInput(
156156export function pruneStaleEntries(
157157store: Record<string, SessionEntry>,
158158overrideMaxAgeMs?: number,
159-opts: { log?: boolean; onPruned?: (params: { key: string; entry: SessionEntry }) => void } = {},
159+opts: {
160+log?: boolean;
161+onPruned?: (params: { key: string; entry: SessionEntry }) => void;
162+preserveKeys?: ReadonlySet<string>;
163+} = {},
160164): number {
161165const maxAgeMs = overrideMaxAgeMs ?? resolveMaintenanceConfigFromInput().pruneAfterMs;
162166const cutoffMs = Date.now() - maxAgeMs;
163167let pruned = 0;
164168for (const [key, entry] of Object.entries(store)) {
169+if (opts.preserveKeys?.has(key)) {
170+continue;
171+}
165172if (entry?.updatedAt != null && entry.updatedAt < cutoffMs) {
166173opts.onPruned?.({ key, entry });
167174delete store[key];
@@ -265,11 +272,16 @@ export function capEntryCount(
265272opts: {
266273log?: boolean;
267274onCapped?: (params: { key: string; entry: SessionEntry }) => void;
275+preserveKeys?: ReadonlySet<string>;
268276} = {},
269277): number {
270278const maxEntries = overrideMax ?? resolveMaintenanceConfigFromInput().maxEntries;
271-const keys = Object.keys(store);
272-if (keys.length <= maxEntries) {
279+const preservedCount = opts.preserveKeys
280+ ? Object.keys(store).filter((key) => opts.preserveKeys?.has(key)).length
281+ : 0;
282+const maxRemovableEntries = Math.max(0, maxEntries - preservedCount);
283+const keys = Object.keys(store).filter((key) => !opts.preserveKeys?.has(key));
284+if (keys.length <= maxRemovableEntries) {
273285return 0;
274286}
275287@@ -280,7 +292,7 @@ export function capEntryCount(
280292return bTime - aTime;
281293});
282294283-const toRemove = sorted.slice(maxEntries);
295+const toRemove = sorted.slice(maxRemovableEntries);
284296for (const key of toRemove) {
285297const entry = store[key];
286298if (entry) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。