/** * Performs a GET request, returning `null` if 404. * * @param url * @param signal * @returns */ export const fetchNullable = async ( url: string, signal?: AbortSignal ): Promise => { const resp = await fetch(url, { signal }); if (resp.status === 404) { return null; } const info = (await resp.json()) as T; return info; }; const sessionCache: Record = {}; /** * Performs a GET request with a cache, returning `null` if 404. * * The cache expires on browser reload. * * @param url * @param signal * @returns */ export const fetchNullableWithSessionCache = async ( url: string, signal?: AbortSignal ): Promise => { if (sessionCache[url]) { return sessionCache[url] as T | null; } const result = await fetchNullable(url, signal); sessionCache[url] = result; return result; };