11--- 
2- 
32summary : Control cache programmatically. Use this template to optimize performance and implement custom caching strategies. 
4- goal :
5-   - Other 
6- operation :
7-   - Cache 
3+ tags :
4+   - Caching 
85products :
96  - Snippets 
107pcx_content_type : example 
@@ -22,49 +19,54 @@ const USE_QUERY_STRING = true; // Include query string in the cache key
2219const  INCLUDE_HEADERS  =  [" User-Agent"  ]; //  Headers to include in the cache key
2320
2421export  default  {
25-     async  fetch (request , env , ctx ) {
26-         //  Generate a custom cache key based on user preferences
27-         const  cacheKey  =  createCacheKey (request);
28-         console .log (` Retrieving cache for: ${ cacheKey .url }  .`  )
29- 
30-         //  Access the default Cache API
31-         const  cache  =  caches .default ;
32- 
33-         //  Attempt to retrieve the cached response
34-         let  response =  await  cache .match (cacheKey);
35- 
36-         if  (! response) {
37-             //  Cache miss: Fetch the asset from the origin
38-             console .log (` Cache miss for: ${ cacheKey .url }  . Fetching from origin...`  );
39-             response =  await  fetch (request);
40- 
41-             //  Wrap the origin response for caching
42-             response =  new  Response (response .body , response);
43- 
44-             //  Set Cache-Control headers to define the TTL
45-             response .headers .set (" Cache-Control"  , ` s-maxage=${ CACHE_DURATION_SECONDS } `  );
46-             response .headers .set (" x-snippets-cache"  , " stored"  );
47- 
48-             //  Store the response in the cache
49-             await  cache .put (cacheKey, response .clone ());
50-         } else  {
51-             //  Cache hit: Return the cached response
52-             console .log (` Cache hit for: ${ cacheKey .url }  .`  );
53-             response =  new  Response (response .body , response);
54-             response .headers .set (" x-snippets-cache"  , " hit"  );
55- 
56-             //  Optionally check if the cache should expire based on age
57-             const  ageHeader  =  response .headers .get (" Age"  );
58-             if  (ageHeader &&  parseInt (ageHeader, 10 ) >  CACHE_DURATION_SECONDS ) {
59-                 console .log (` Cache expired for: ${ cacheKey .url }  . Deleting cached response...`  );
60-                 await  cache .delete (cacheKey);
61-                 response .headers .set (" x-snippets-cache"  , " deleted"  );
62-             }
63-         }
64- 
65-         //  Return the response to the client
66-         return  response;
67-     },
22+ 	async  fetch (request , env , ctx ) {
23+ 		//  Generate a custom cache key based on user preferences
24+ 		const  cacheKey  =  createCacheKey (request);
25+ 		console .log (` Retrieving cache for: ${ cacheKey .url }  .`  );
26+ 
27+ 		//  Access the default Cache API
28+ 		const  cache  =  caches .default ;
29+ 
30+ 		//  Attempt to retrieve the cached response
31+ 		let  response =  await  cache .match (cacheKey);
32+ 
33+ 		if  (! response) {
34+ 			//  Cache miss: Fetch the asset from the origin
35+ 			console .log (` Cache miss for: ${ cacheKey .url }  . Fetching from origin...`  );
36+ 			response =  await  fetch (request);
37+ 
38+ 			//  Wrap the origin response for caching
39+ 			response =  new  Response (response .body , response);
40+ 
41+ 			//  Set Cache-Control headers to define the TTL
42+ 			response .headers .set (
43+ 				" Cache-Control"  ,
44+ 				` s-maxage=${ CACHE_DURATION_SECONDS } `  ,
45+ 			);
46+ 			response .headers .set (" x-snippets-cache"  , " stored"  );
47+ 
48+ 			//  Store the response in the cache
49+ 			await  cache .put (cacheKey, response .clone ());
50+ 		} else  {
51+ 			//  Cache hit: Return the cached response
52+ 			console .log (` Cache hit for: ${ cacheKey .url }  .`  );
53+ 			response =  new  Response (response .body , response);
54+ 			response .headers .set (" x-snippets-cache"  , " hit"  );
55+ 
56+ 			//  Optionally check if the cache should expire based on age
57+ 			const  ageHeader  =  response .headers .get (" Age"  );
58+ 			if  (ageHeader &&  parseInt (ageHeader, 10 ) >  CACHE_DURATION_SECONDS ) {
59+ 				console .log (
60+ 					` Cache expired for: ${ cacheKey .url }  . Deleting cached response...`  ,
61+ 				);
62+ 				await  cache .delete (cacheKey);
63+ 				response .headers .set (" x-snippets-cache"  , " deleted"  );
64+ 			}
65+ 		}
66+ 
67+ 		//  Return the response to the client
68+ 		return  response;
69+ 	},
6870};
6971
7072/** 
@@ -73,28 +75,30 @@ export default {
7375 * @returns  {Request}  - A valid cache key based on the URL 
7476 */  
7577function  createCacheKey (request ) {
76-     const  url  =  new  URL (request .url ); //  Use the request's base URL
77-     const  cacheKey  =  new  URL (url .origin ); //  Start with the origin (scheme + hostname)
78- 
79-     //  Optionally include the path
80-     if  (USE_PATH ) {
81-         cacheKey .pathname  =  url .pathname ;
82-     }
83- 
84-     //  Optionally include the query string
85-     if  (USE_QUERY_STRING ) {
86-         cacheKey .search  =  url .search ;
87-     }
88- 
89-     //  Optionally include specific headers
90-     if  (INCLUDE_HEADERS .length  >  0 ) {
91-         const  headerParts  =  INCLUDE_HEADERS .map (header  =>  ` ${ header}  =${ request .headers .get (header) ||  " " } `  ).join (" &"  );
92-         cacheKey .searchParams .append (" headers"  , headerParts);
93-     }
94- 
95-     //  Return the constructed URL as the cache key
96-     return  new  Request (cacheKey .toString (), {
97-         method:  " GET" 
98-     });
78+ 	const  url  =  new  URL (request .url ); //  Use the request's base URL
79+ 	const  cacheKey  =  new  URL (url .origin ); //  Start with the origin (scheme + hostname)
80+ 
81+ 	//  Optionally include the path
82+ 	if  (USE_PATH ) {
83+ 		cacheKey .pathname  =  url .pathname ;
84+ 	}
85+ 
86+ 	//  Optionally include the query string
87+ 	if  (USE_QUERY_STRING ) {
88+ 		cacheKey .search  =  url .search ;
89+ 	}
90+ 
91+ 	//  Optionally include specific headers
92+ 	if  (INCLUDE_HEADERS .length  >  0 ) {
93+ 		const  headerParts  =  INCLUDE_HEADERS .map (
94+ 			(header ) =>  ` ${ header}  =${ request .headers .get (header) ||  " " } `  ,
95+ 		).join (" &"  );
96+ 		cacheKey .searchParams .append (" headers"  , headerParts);
97+ 	}
98+ 
99+ 	//  Return the constructed URL as the cache key
100+ 	return  new  Request (cacheKey .toString (), {
101+ 		method:  " GET"  ,
102+ 	});
99103}
100104``` 
0 commit comments