// import { useSWR } from "sswr"; import LRU from "lru-cache"; import { derived, Readable, Writable, writable } from "svelte/store"; import { UpListing, UpObject } from "upend"; import type { ListingResult } from "upend/types"; import { useSWR } from "../util/fetch"; const queryOnceLRU = new LRU(128); const inFlightRequests: { [key: string]: Promise } = {}; export function useEntity(address: string) { const { data, error, revalidate } = useSWR( () => `/api/obj/${address}` ); const entity: Readable = derived(data, ($listing) => { if ($listing) { const listing = new UpListing($listing); return listing.getObject(address); } }); return { entity, error, revalidate, }; } export function query(query: () => string) { let queryString = typeof query === "string" ? query : query(); console.debug(`Querying: ${queryString}`); const { data, error, revalidate } = useSWR( () => `/api/obj?query=${query()}` ); const result = derived(data, ($values) => { return $values ? new UpListing($values) : undefined; }); return { result, data, error, revalidate, }; } export async function queryOnce(query: string): Promise { const cacheResult = queryOnceLRU.get(query); if (!cacheResult) { const url = `/api/obj?query=${query}`; if (!inFlightRequests[url]) { console.debug(`Querying: ${query}`); inFlightRequests[url] = new Promise(async (resolve, reject) => { const response = await fetch(url, { keepalive: true }); resolve(new UpListing(await response.json())); }); } else { console.debug(`Chaining request for ${query}...`); } return await inFlightRequests[url]; } else { console.debug(`Returning cached: ${query}`); return cacheResult; } }