Created
January 7, 2023 09:08
-
-
Save neharkarvishal/6acc872ee0231c40c9b69e18cf54167e to your computer and use it in GitHub Desktop.
Generate Cache Key
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const { generateHeadersKey } = require('./generateHeadersKey'); | |
const { generateQueryParamsKey } = require('./generateQueryParamsKey'); | |
function generateCacheKey( | |
ctx, | |
keys = { | |
useQueryParams: false, // @todo: array or boolean => can be optimized | |
useHeaders: [], | |
} | |
) { | |
let querySuffix = ''; | |
let headersSuffix = ''; | |
if (keys.useQueryParams !== false) { | |
querySuffix = generateQueryParamsKey(ctx, keys.useQueryParams); | |
} | |
if (keys.useHeaders.length > 0) { | |
headersSuffix = generateHeadersKey(ctx, keys.useHeaders); | |
} | |
return `${ctx.request.path}?${querySuffix}&${headersSuffix}`; | |
} | |
module.exports = { generateCacheKey }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
function generateHeadersKey(ctx, useHeaders = []) { | |
return useHeaders | |
.filter((k) => ctx.request.header[k] !== undefined) | |
.map((k) => `${k.toLowerCase()}=${ctx.request.header[k.toLowerCase()]}`) // headers are key insensitive | |
.join(','); | |
} | |
module.exports = { generateHeadersKey }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
function generateQueryParamsKey( | |
ctx, | |
useQueryParams = true // @todo: array or boolean => can be optimized | |
) { | |
let keys = []; | |
if (useQueryParams === true) { | |
keys = Object.keys(ctx.query); | |
} else if (useQueryParams.length > 0) { | |
keys = Object.keys(ctx.query).filter((key) => useQueryParams.includes(key)); | |
} | |
if (keys.length === 0) { | |
return ''; | |
} | |
keys.sort(); | |
return keys | |
.map( | |
(k) => | |
`${k}=${ | |
typeof ctx.query[k] === 'object' | |
? JSON.stringify(ctx.query[k]) | |
: ctx.query[k] | |
}` | |
) // query strings are key sensitive | |
.join(','); | |
} | |
module.exports = { generateQueryParamsKey }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment