const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
const NONE_MATCH_SANITIZE_REGEXP = /(W\/| )/g;
export default function fresh( reqHeaders: Headers, resHeaders: Headers,): boolean { const modifiedSince = reqHeaders.get("If-Modified-Since"); const noneMatch = reqHeaders.get("If-None-Match");
if (!modifiedSince && !noneMatch) { return false; }
if (noneMatch && noneMatch !== "*") { let etag = resHeaders.get("ETag"); if (!etag) { return false; } else if (etag.startsWith("W/")) { etag = etag.substring(2); }
const etags = noneMatch .replace(NONE_MATCH_SANITIZE_REGEXP, "") .split(",");
if (!etags.includes(etag)) { return false; } }
if (modifiedSince) { const lastModified = resHeaders.get("Last-Modified"); if ( !lastModified || !(Date.parse(lastModified) <= Date.parse(modifiedSince)) ) { return false; } }
const cacheControl = reqHeaders.get("Cache-Control"); if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) { return false; }
return true;}