securityos/node_modules/next/dist/server/web/spec-extension/unstable-cache.js

106 lines
5.0 KiB
JavaScript
Raw Normal View History

2024-09-06 15:32:35 +00:00
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "unstable_cache", {
enumerable: true,
get: function() {
return unstable_cache;
}
});
const _staticgenerationasyncstorageexternal = require("../../../client/components/static-generation-async-storage.external");
const _constants = require("../../../lib/constants");
const _patchfetch = require("../../lib/patch-fetch");
function unstable_cache(cb, keyParts, options = {}) {
const staticGenerationAsyncStorage = (fetch.__nextGetStaticStore == null ? void 0 : fetch.__nextGetStaticStore.call(fetch)) || _staticgenerationasyncstorageexternal.staticGenerationAsyncStorage;
if (options.revalidate === 0) {
throw new Error(`Invariant revalidate: 0 can not be passed to unstable_cache(), must be "false" or "> 0" ${cb.toString()}`);
}
const cachedCb = async (...args)=>{
const store = staticGenerationAsyncStorage == null ? void 0 : staticGenerationAsyncStorage.getStore();
const incrementalCache = (store == null ? void 0 : store.incrementalCache) || globalThis.__incrementalCache;
if (!incrementalCache) {
throw new Error(`Invariant: incrementalCache missing in unstable_cache ${cb.toString()}`);
}
const joinedKey = `${cb.toString()}-${Array.isArray(keyParts) && keyParts.join(",")}-${JSON.stringify(args)}`;
// We override the default fetch cache handling inside of the
// cache callback so that we only cache the specific values returned
// from the callback instead of also caching any fetches done inside
// of the callback as well
return staticGenerationAsyncStorage.run({
...store,
fetchCache: "only-no-store",
urlPathname: (store == null ? void 0 : store.urlPathname) || "/",
isStaticGeneration: !!(store == null ? void 0 : store.isStaticGeneration)
}, async ()=>{
const tags = (0, _patchfetch.validateTags)(options.tags || [], `unstable_cache ${cb.toString()}`);
if (Array.isArray(tags) && store) {
if (!store.tags) {
store.tags = [];
}
for (const tag of tags){
if (!store.tags.includes(tag)) {
store.tags.push(tag);
}
}
}
const implicitTags = (0, _patchfetch.addImplicitTags)(store);
const cacheKey = await (incrementalCache == null ? void 0 : incrementalCache.fetchCacheKey(joinedKey));
const cacheEntry = cacheKey && !((store == null ? void 0 : store.isOnDemandRevalidate) || incrementalCache.isOnDemandRevalidate) && await (incrementalCache == null ? void 0 : incrementalCache.get(cacheKey, {
fetchCache: true,
revalidate: options.revalidate,
tags,
softTags: implicitTags
}));
const invokeCallback = async ()=>{
const result = await cb(...args);
if (cacheKey && incrementalCache) {
await incrementalCache.set(cacheKey, {
kind: "FETCH",
data: {
headers: {},
// TODO: handle non-JSON values?
body: JSON.stringify(result),
status: 200,
url: ""
},
revalidate: typeof options.revalidate !== "number" ? _constants.CACHE_ONE_YEAR : options.revalidate
}, {
revalidate: options.revalidate,
fetchCache: true,
tags
});
}
return result;
};
if (!cacheEntry || !cacheEntry.value) {
return invokeCallback();
}
if (cacheEntry.value.kind !== "FETCH") {
console.error(`Invariant invalid cacheEntry returned for ${joinedKey}`);
return invokeCallback();
}
let cachedValue;
const isStale = cacheEntry.isStale;
if (cacheEntry) {
const resData = cacheEntry.value.data;
cachedValue = JSON.parse(resData.body);
}
if (isStale) {
if (!store) {
return invokeCallback();
} else {
if (!store.pendingRevalidates) {
store.pendingRevalidates = [];
}
store.pendingRevalidates.push(invokeCallback().catch((err)=>console.error(`revalidating cache with key: ${joinedKey}`, err)));
}
}
return cachedValue;
});
};
// TODO: once AsyncLocalStorage.run() returns the correct types this override will no longer be necessary
return cachedCb;
}
//# sourceMappingURL=unstable-cache.js.map