106 lines
5.0 KiB
JavaScript
106 lines
5.0 KiB
JavaScript
"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
|