issue/fetch #21
16
deno.lock
Normal file
16
deno.lock
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
24
fetch.test.tsx
Normal file
24
fetch.test.tsx
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import {Fetch} from "./lib/iso.tsx";
|
||||||
|
|
||||||
|
|
||||||
|
const delay =async(inHandler:()=>void, inDelay:number):Promise<void>=>
|
||||||
|
{
|
||||||
|
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);
|
53
lib/iso.tsx
53
lib/iso.tsx
@ -158,4 +158,55 @@ export const Switch =({children}:{children:Children})=>
|
|||||||
return fallback;
|
return fallback;
|
||||||
};
|
};
|
||||||
export const Case =({children, value}:{children:Children, value?:string, default?:true})=>null;
|
export const Case =({children, value}:{children:Children, value?:string, default?:true})=>null;
|
||||||
export const useRouteVars =()=> React.useContext(SwitchContext).keys;
|
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<string, FetchRecord>,
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user