aws-cdk-lib
Version:
Version 2 of the AWS Cloud Development Kit library
2 lines (1 loc) • 2.11 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.FingerprintDiskCache=void 0;var crypto=()=>{var tmp=require("crypto");return crypto=()=>tmp,tmp},fs=()=>{var tmp=require("fs");return fs=()=>tmp,tmp},os=()=>{var tmp=require("os");return os=()=>tmp,tmp},path=()=>{var tmp=require("path");return path=()=>tmp,tmp};const CACHE_DIR=path().join(os().homedir(),".cdk","cache","fingerprints"),MAX_ENTRIES=1e5,MAX_CACHE_FILES=50;class FingerprintDiskCache{cache;dirty=!1;cacheFile;constructor(directoryPath){const dirHash=crypto().createHash("sha256").update(directoryPath).digest("hex").slice(0,16);this.cacheFile=path().join(CACHE_DIR,`${dirHash}.json`)}obtain(cacheKey,calcFn){const map=this._load(),existing=map.get(cacheKey);if(existing!==void 0)return existing;const value=calcFn();return map.set(cacheKey,value),this.dirty=!0,value}save(){if(!(!this.dirty||!this.cache)){this._evict();try{fs().mkdirSync(CACHE_DIR,{recursive:!0});const entries=Array.from(this.cache.entries());let tempFile=`${this.cacheFile}.${Date.now()}.${Math.random()}`;try{fs().writeFileSync(tempFile,JSON.stringify(entries)),fs().renameSync(tempFile,this.cacheFile),tempFile=void 0,this.dirty=!1,this._evictCacheDir()}finally{tempFile&&fs().rmSync(tempFile,{force:!0})}}catch{}}}_load(){if(this.cache)return this.cache;this.cache=new Map;try{const data=fs().readFileSync(this.cacheFile,"utf-8"),entries=JSON.parse(data);if(Array.isArray(entries))for(const[k,v]of entries)this.cache.set(k,v)}catch{}return this.cache}_evict(){if(!this.cache||this.cache.size<=MAX_ENTRIES)return;const entries=Array.from(this.cache.entries());this.cache=new Map(entries.slice(entries.length-MAX_ENTRIES))}_evictCacheDir(){try{const files=fs().readdirSync(CACHE_DIR).filter(f=>f.endsWith(".json")).map(f=>({name:f,mtime:fs().statSync(path().join(CACHE_DIR,f)).mtimeMs}));if(files.length<=MAX_CACHE_FILES)return;files.sort((a,b)=>a.mtime-b.mtime);const toDelete=files.slice(0,files.length-MAX_CACHE_FILES);for(const f of toDelete)fs().unlinkSync(path().join(CACHE_DIR,f.name))}catch{}}}exports.FingerprintDiskCache=FingerprintDiskCache;