@@ -17,6 +17,9 @@ export const kvCache = (options: {
17
17
ttl ?: number ; // TTL in seconds
18
18
} ) : MiddlewareHandler => {
19
19
return async function kvCache ( c , next ) {
20
+ const cacheControl = c . req . header ( 'Cache-Control' ) || '' ;
21
+ const noCache = / n o - c a c h e / . test ( cacheControl ) ;
22
+
20
23
let key = c . req . url ;
21
24
if ( options . keyGenerator ) {
22
25
key = await options . keyGenerator ( c ) ;
@@ -26,22 +29,26 @@ export const kvCache = (options: {
26
29
key = options . cacheKeyPrefix + key ;
27
30
}
28
31
29
- // Attempt to retrieve the cached response
30
- const cachedResponseBody = await options . kvNamespace . get (
31
- key ,
32
- 'arrayBuffer' ,
33
- ) ;
34
- if ( cachedResponseBody ) {
35
- // Retrieve stored headers
36
- const cachedHeadersJson = await options . kvNamespace . get ( key + ':headers' ) ;
37
- const headers = new Headers ( ) ;
38
- if ( cachedHeadersJson ) {
39
- const headersObj = JSON . parse ( cachedHeadersJson ) ;
40
- for ( const [ k , v ] of Object . entries ( headersObj ) ) {
41
- headers . set ( k , v as string ) ;
32
+ if ( ! noCache ) {
33
+ // Attempt to retrieve the cached response
34
+ const cachedResponseBody = await options . kvNamespace . get (
35
+ key ,
36
+ 'arrayBuffer' ,
37
+ ) ;
38
+ if ( cachedResponseBody ) {
39
+ // Retrieve stored headers
40
+ const cachedHeadersJson = await options . kvNamespace . get (
41
+ key + ':headers' ,
42
+ ) ;
43
+ const headers = new Headers ( ) ;
44
+ if ( cachedHeadersJson ) {
45
+ const headersObj = JSON . parse ( cachedHeadersJson ) ;
46
+ for ( const [ k , v ] of Object . entries ( headersObj ) ) {
47
+ headers . set ( k , v as string ) ;
48
+ }
42
49
}
50
+ return new Response ( cachedResponseBody , { headers } ) ;
43
51
}
44
- return new Response ( cachedResponseBody , { headers } ) ;
45
52
}
46
53
47
54
// Proceed to the next middleware or handler
@@ -52,6 +59,11 @@ export const kvCache = (options: {
52
59
return ;
53
60
}
54
61
62
+ // Do not cache the response if `no-cache` was passed
63
+ if ( noCache ) {
64
+ return ;
65
+ }
66
+
55
67
// Clone the response to read its body
56
68
const resClone = c . res . clone ( ) ;
57
69
const resBody = await resClone . arrayBuffer ( ) ;
0 commit comments