refactor cache key calculation to have more space for dealing with different types of bodies
This commit is contained in:
parent
a7fc94c3e9
commit
8a338f5f5d
33
index.js
33
index.js
@ -1,5 +1,6 @@
|
|||||||
const fetch = require('node-fetch');
|
const fetch = require('node-fetch');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const { URLSearchParams } = require('url');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
@ -9,6 +10,29 @@ function md5(str) {
|
|||||||
return crypto.createHash('md5').update(str).digest('hex');
|
return crypto.createHash('md5').update(str).digest('hex');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getBodyCacheKeyJson(body) {
|
||||||
|
if (typeof body === 'string') {
|
||||||
|
return body;
|
||||||
|
} if (body instanceof URLSearchParams) {
|
||||||
|
return body.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCacheKey(requestArguments) {
|
||||||
|
const resource = requestArguments[0];
|
||||||
|
const init = requestArguments[1] || {};
|
||||||
|
|
||||||
|
const resourceCacheKeyJson = typeof resource === 'string' ? { url: resource } : { ...resource };
|
||||||
|
const initCacheKeyJson = { ...init };
|
||||||
|
|
||||||
|
resourceCacheKeyJson.body = getBodyCacheKeyJson(resourceCacheKeyJson.body);
|
||||||
|
initCacheKeyJson.body = getBodyCacheKeyJson(initCacheKeyJson.body);
|
||||||
|
|
||||||
|
return md5(JSON.stringify([resourceCacheKeyJson, initCacheKeyJson]));
|
||||||
|
}
|
||||||
|
|
||||||
async function createRawResponse(fetchRes) {
|
async function createRawResponse(fetchRes) {
|
||||||
const buffer = await fetchRes.buffer();
|
const buffer = await fetchRes.buffer();
|
||||||
|
|
||||||
@ -28,13 +52,8 @@ async function createRawResponse(fetchRes) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function getResponse(cacheDirPath, requestArguments) {
|
async function getResponse(cacheDirPath, requestArguments) {
|
||||||
const [url, requestInit, ...rest] = requestArguments;
|
const cacheKey = getCacheKey(requestArguments);
|
||||||
const requestParams = requestInit.body
|
const cachedFilePath = path.join(cacheDirPath, `${cacheKey}.json`);
|
||||||
? ({ ...requestInit, body: typeof requestInit.body === 'object' ? requestInit.body.toString() : requestInit.body })
|
|
||||||
: requestInit;
|
|
||||||
|
|
||||||
const cacheHash = md5(JSON.stringify([url, requestParams, ...rest]));
|
|
||||||
const cachedFilePath = path.join(cacheDirPath, `${cacheHash}.json`);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const rawResponse = JSON.parse(await fs.promises.readFile(cachedFilePath));
|
const rawResponse = JSON.parse(await fs.promises.readFile(cachedFilePath));
|
||||||
|
Reference in New Issue
Block a user