From 4730cdec3e07a1d76c8d6f321c954644e7a41969 Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Tue, 18 Apr 2023 22:22:59 -0400 Subject: [PATCH] fetch cache started --- deno.lock | 16 +++++++++++++++ fetch.test.tsx | 24 +++++++++++++++++++++++ lib/iso.tsx | 53 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 deno.lock create mode 100644 fetch.test.tsx diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..b8e174d --- /dev/null +++ b/deno.lock @@ -0,0 +1,16 @@ +{ + "version": "2", + "remote": { + "http://localhost:4507/lib/iso.tsx": "edf1cf4c539900040c75824eac8472e0ec43098b13af4049bd79ddbd76a5346d", + "https://esm.sh/preact@10.13.2/compat": "1cf68e0c8c6c84b60d42f30665403b67229c16ff5206824709b19df60ba9cdc3", + "https://esm.sh/stable/preact@10.13.2/deno/compat.js": "3151a948abd84aa75dfc9e57733da7e1a45fff7a25de58c7b6025b923874b508", + "https://esm.sh/stable/preact@10.13.2/deno/hooks.js": "c7a8e703bcbc6a05949f329b618c33d5d1ea5fee113ddcea44ff0f527af8556f", + "https://esm.sh/stable/preact@10.13.2/deno/preact.mjs": "365fab897381f4f403f859c5d12939084560545567108cc90dae901bbe892578", + "https://esm.sh/v116/preact@10.13.2/compat/src/index.d.ts": "d02f015638a40e32649151e011cfda7b520d66f7fbd3c12a28fa03de2a5e1421", + "https://esm.sh/v116/preact@10.13.2/compat/src/suspense-list.d.ts": "b8e274324392157ce476ef3a48ae215c9f7003b08525d140645f19eab20d1948", + "https://esm.sh/v116/preact@10.13.2/compat/src/suspense.d.ts": "81f5266e0977a94347505d11b8103024211f2b4f3b2eb2aa276a10d8fd169e65", + "https://esm.sh/v116/preact@10.13.2/hooks/src/index.d.ts": "5c29febb624fc25d71cb0e125848c9b711e233337a08f7eacfade38fd4c14cc3", + "https://esm.sh/v116/preact@10.13.2/src/index.d.ts": "65398710de6aa0a07412da79784e05e6e96763f51c7c91b77344d2d0af06385c", + "https://esm.sh/v116/preact@10.13.2/src/jsx.d.ts": "9ac9b82c199fa7b04748807d750eba1a106c0be52041b8617416f88d6fc0a257" + } +} diff --git a/fetch.test.tsx b/fetch.test.tsx new file mode 100644 index 0000000..1053023 --- /dev/null +++ b/fetch.test.tsx @@ -0,0 +1,24 @@ +import {Fetch} from "./lib/iso.tsx"; + + +const delay =async(inHandler:()=>void, inDelay:number):Promise=> +{ + return new Promise((accept)=>{ + setTimeout(()=>{ + accept(inHandler()); + }, inDelay); + }); +}; + +let r1, r2, r3; + +delay(()=>{r1 = Fetch.Request(`https://catfact.ninja/fact`, undefined, 0.2); console.log(r1); }, 10); +delay(()=>{r2 = Fetch.Request(`https://catfact.ninja/fact`, undefined, 0.2); console.log(r2); }, 20); +delay(()=>{r3 = Fetch.Request(`https://catfact.ninja/fact`, undefined, 0.2); console.log(r3); }, 2000); + + +await delay(()=>{}, 3000); + +console.log(r1); +console.log(r2); +console.log(r3); \ No newline at end of file diff --git a/lib/iso.tsx b/lib/iso.tsx index 2b1789a..bbc5be1 100644 --- a/lib/iso.tsx +++ b/lib/iso.tsx @@ -158,4 +158,55 @@ export const Switch =({children}:{children:Children})=> return fallback; }; export const Case =({children, value}:{children:Children, value?:string, default?:true})=>null; -export const useRouteVars =()=> React.useContext(SwitchContext).keys; \ No newline at end of file +export const useRouteVars =()=> React.useContext(SwitchContext).keys; + + +type FetchRecord = {URL:string, CacheFor:number, CachedAt:number, DelaySSR:boolean, Error:boolean, Text:false|string}; +export const Fetch = { + Cache:new Map() as Map, + async Request(URL:string, Init?:RequestInit, CacheFor:number = 60, DelaySSR:boolean = true) + { + let check = Fetch.Cache.get(URL); + + const load =async(inCheck:FetchRecord)=> + { + Fetch.Cache.set(URL, inCheck); + const resp = await fetch(URL, Init); + inCheck.Text = await resp.text(); + inCheck.CachedAt = new Date().getTime(); + console.log(`...cached!`); + return inCheck; + } + + if(!check) + { + console.log(`making new cache record...`); + check = {URL, CacheFor, CachedAt:0, DelaySSR, Error:false, Text:false}; + load(check); + return check; + } + if(check.CachedAt == 0) + { + console.log(`currently being cached...`); + return check; + } + else if(check?.Text) + { + console.log(`found in cache...`); + let secondsAge = Math.floor((new Date().getTime() - check.CachedAt)/1000); + if(secondsAge > check.CacheFor) + { + console.log(`...outdated...`); + check.CachedAt = 0; + load(check); + return check; + } + else + { + console.log(`...retrieved!`); + return check; + } + + } + } +}; \ No newline at end of file