UNPKG

foxts

Version:

Opinionated collection of common TypeScript utils by @SukkaW

2 lines (1 loc) 1.3 kB
Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./fast-string-array-join.js"),a=require("./identity.js"),t=require("./noop.js");exports.createMemoize=function(i,{onlyUseCachedIfFail:n=!1,resetTtlOnHit:r=!1,defaultTtl:l=6048e5,onCacheUpdate:s=t.noop,onCacheMiss:o=t.noop,onCacheHit:u=t.noop,keyHasher:d=a.identity,argHasher:f}){return function(t,h){if(h?.temporaryBypass)return(...e)=>Promise.resolve(t(...e));let m=h&&"serializer"in h?h.serializer:a.identity,c=h&&"deserializer"in h?h.deserializer:a.identity,p=h?.ttl??l,y=t.toString(),w=d(y);return async function(...a){let l=e.fastStringArrayJoin(await Promise.all([w,f(a)]),"|"),d=t.name||y||l,h=i.get(l);if(h&&"object"==typeof h&&"then"in h&&(h=await h),n)try{let e=await t(...a);s(l,{humanReadableName:d,isUseCachedIfFail:!0});let n=i.set(l,m(e),p);return n&&"then"in n&&await n,e}catch(e){if(null==h)throw o(l,{humanReadableName:d,isUseCachedIfFail:!0}),e;if(r){let e=i.updateTtl?.(l,p);e&&"then"in e&&await e}return u(l,{humanReadableName:d,isUseCachedIfFail:!0}),c(h)}if(null==h){o(l,{humanReadableName:d,isUseCachedIfFail:!1});let e=await t(...a),n=i.set(l,m(e),p);return n&&"then"in n&&await n,e}if(u(l,{humanReadableName:d,isUseCachedIfFail:!1}),r){let e=i.updateTtl?.(l,p);e&&"then"in e&&await e}return c(h)}}};