| import { Buffer } from "node:buffer"; |
| import fs from "node:fs/promises"; |
| import { isCacheEnabled, resolveCacheTtlMs } from "../../config/cache-utils.js"; |
|
|
| type SessionManagerCacheEntry = { |
| sessionFile: string; |
| loadedAt: number; |
| }; |
|
|
| const SESSION_MANAGER_CACHE = new Map<string, SessionManagerCacheEntry>(); |
| const DEFAULT_SESSION_MANAGER_TTL_MS = 45_000; |
|
|
| function getSessionManagerTtl(): number { |
| return resolveCacheTtlMs({ |
| envValue: process.env.OPENCLAW_SESSION_MANAGER_CACHE_TTL_MS, |
| defaultTtlMs: DEFAULT_SESSION_MANAGER_TTL_MS, |
| }); |
| } |
|
|
| function isSessionManagerCacheEnabled(): boolean { |
| return isCacheEnabled(getSessionManagerTtl()); |
| } |
|
|
| export function trackSessionManagerAccess(sessionFile: string): void { |
| if (!isSessionManagerCacheEnabled()) { |
| return; |
| } |
| const now = Date.now(); |
| SESSION_MANAGER_CACHE.set(sessionFile, { |
| sessionFile, |
| loadedAt: now, |
| }); |
| } |
|
|
| function isSessionManagerCached(sessionFile: string): boolean { |
| if (!isSessionManagerCacheEnabled()) { |
| return false; |
| } |
| const entry = SESSION_MANAGER_CACHE.get(sessionFile); |
| if (!entry) { |
| return false; |
| } |
| const now = Date.now(); |
| const ttl = getSessionManagerTtl(); |
| return now - entry.loadedAt <= ttl; |
| } |
|
|
| export async function prewarmSessionFile(sessionFile: string): Promise<void> { |
| if (!isSessionManagerCacheEnabled()) { |
| return; |
| } |
| if (isSessionManagerCached(sessionFile)) { |
| return; |
| } |
|
|
| try { |
| |
| const handle = await fs.open(sessionFile, "r"); |
| try { |
| const buffer = Buffer.alloc(4096); |
| await handle.read(buffer, 0, buffer.length, 0); |
| } finally { |
| await handle.close(); |
| } |
| trackSessionManagerAccess(sessionFile); |
| } catch { |
| |
| } |
| } |
|
|