gatsby-source-prismic
Version:
Gatsby source plugin for building websites using Prismic as a data source
44 lines (35 loc) • 1.2 kB
text/typescript
import type { FetchLike } from "@prismicio/custom-types-client";
import type { GatsbyCache } from "gatsby";
import type { Response } from "node-fetch";
type CachedFetchArgs = {
fetch: FetchLike;
cache: GatsbyCache;
name: string;
};
export const cachedFetch = async (
input: Parameters<FetchLike>[0],
init: Parameters<FetchLike>[1],
args: CachedFetchArgs,
): Promise<Response> => {
const cacheKey = `fetchLike(${args.name})___${JSON.stringify({
input,
init,
})}`;
const cachedValue: string | undefined = await args.cache.get(cacheKey);
const { Response } = await import("node-fetch");
// Gatsby's cache does not have a `has` method. Because we are
// saving strings to the cache, this check should be sufficient
// to detect cache values.
if (cachedValue !== undefined) {
return new Response(cachedValue);
} else {
const result = await args.fetch(input, init);
// Using `.text()` allows the consumer to re-parse as
// JSON while being able to save to the cache reliably.
const text = await result.text();
// This call is purposely not awaited. We can let it
// resolve in the background.
args.cache.set(cacheKey, text);
return new Response(text);
}
};