import fs from "fs"; import path from "path"; import crypto from "crypto"; const CACHE_DIR = path.join(process.cwd(), "data", "search-cache"); function ensureDir() { fs.mkdirSync(CACHE_DIR, { recursive: true }); } function hashKey(input: string): string { return crypto.createHash("sha256").update(input).digest("hex"); } interface CacheEntry { expiresAt: number; value: T; } export function cacheGet(namespace: string, key: string): T | null { try { const file = path.join(CACHE_DIR, namespace, `${hashKey(key)}.json`); if (!fs.existsSync(file)) return null; const entry = JSON.parse(fs.readFileSync(file, "utf8")) as CacheEntry; if (Date.now() > entry.expiresAt) { fs.unlinkSync(file); return null; } return entry.value; } catch { return null; } } export function cacheSet(namespace: string, key: string, value: T, ttlMs: number): void { try { const dir = path.join(CACHE_DIR, namespace); fs.mkdirSync(dir, { recursive: true }); const file = path.join(dir, `${hashKey(key)}.json`); const entry: CacheEntry = { expiresAt: Date.now() + ttlMs, value }; fs.writeFileSync(file, JSON.stringify(entry)); } catch { // cache 失敗不阻擋搜尋 } } export function clearSearchCacheForTests(): void { if (fs.existsSync(CACHE_DIR)) { fs.rmSync(CACHE_DIR, { recursive: true, force: true }); } ensureDir(); }