mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 23:48:28 +00:00
Outbound: bound directory cache memory growth
This commit is contained in:
@@ -22,25 +22,35 @@ export function buildDirectoryCacheKey(key: DirectoryCacheKey): string {
|
||||
export class DirectoryCache<T> {
|
||||
private readonly cache = new Map<string, CacheEntry<T>>();
|
||||
private lastConfigRef: OpenClawConfig | null = null;
|
||||
private readonly maxSize: number;
|
||||
|
||||
constructor(private readonly ttlMs: number) {}
|
||||
constructor(
|
||||
private readonly ttlMs: number,
|
||||
maxSize = 2000,
|
||||
) {
|
||||
this.maxSize = Math.max(1, Math.floor(maxSize));
|
||||
}
|
||||
|
||||
get(key: string, cfg: OpenClawConfig): T | undefined {
|
||||
this.resetIfConfigChanged(cfg);
|
||||
this.pruneExpired(Date.now());
|
||||
const entry = this.cache.get(key);
|
||||
if (!entry) {
|
||||
return undefined;
|
||||
}
|
||||
if (Date.now() - entry.fetchedAt > this.ttlMs) {
|
||||
this.cache.delete(key);
|
||||
return undefined;
|
||||
}
|
||||
return entry.value;
|
||||
}
|
||||
|
||||
set(key: string, value: T, cfg: OpenClawConfig): void {
|
||||
this.resetIfConfigChanged(cfg);
|
||||
this.cache.set(key, { value, fetchedAt: Date.now() });
|
||||
const now = Date.now();
|
||||
this.pruneExpired(now);
|
||||
// Refresh insertion order so active keys are less likely to be evicted.
|
||||
if (this.cache.has(key)) {
|
||||
this.cache.delete(key);
|
||||
}
|
||||
this.cache.set(key, { value, fetchedAt: now });
|
||||
this.evictToMaxSize();
|
||||
}
|
||||
|
||||
clearMatching(match: (key: string) => boolean): void {
|
||||
@@ -64,4 +74,25 @@ export class DirectoryCache<T> {
|
||||
}
|
||||
this.lastConfigRef = cfg;
|
||||
}
|
||||
|
||||
private pruneExpired(now: number): void {
|
||||
if (this.ttlMs <= 0) {
|
||||
return;
|
||||
}
|
||||
for (const [cacheKey, entry] of this.cache.entries()) {
|
||||
if (now - entry.fetchedAt > this.ttlMs) {
|
||||
this.cache.delete(cacheKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private evictToMaxSize(): void {
|
||||
while (this.cache.size > this.maxSize) {
|
||||
const oldestKey = this.cache.keys().next().value;
|
||||
if (typeof oldestKey !== "string") {
|
||||
break;
|
||||
}
|
||||
this.cache.delete(oldestKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user