@gorgonjs/gorgon
Version:
A simple caching library for async functions
3 lines (2 loc) • 3.96 kB
JavaScript
(function(c,v){typeof exports=="object"&&typeof module<"u"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(c=typeof globalThis<"u"?globalThis:c||self,v(c.Gorgon={}))})(this,function(c){"use strict";const v=()=>{const o={},u=o.hasOwnProperty,i={init:async()=>{},get:async s=>{if(u.call(o,s)&&o[s].val)return o[s].val},set:async(s,t,e)=>{await i.clear(s);var r=!1;return e&&e.expiry&&e.expiry>0&&(r=setTimeout(function(){i.clear(s)},e.expiry)),o[s]={policy:e,val:t,to:r},t},keys:async()=>Object.keys(o),clear:async s=>{if(!s){for(var t in o)i._clear(t);return!0}return i._clear(s)},_clear:s=>u.call(o,s)?(o[s].to&&clearTimeout(o[s].to),o[s]=null,delete o[s],!0):!1};return i},x=(()=>{const o={},u=o.hasOwnProperty,i={debug:!1,defaultProvider:"memory",retry:5e3},s=function(e){const r={expiry:!1,provider:i.defaultProvider};if(!e)return r;if(e instanceof Date){var a=new Date;r.expiry=Math.ceil((e.getTime()-a.getTime())/1e3)}else typeof e=="object"&&e.expiry?(e.expiry instanceof Date?r.expiry=Math.ceil((e.expiry.getTime()-a.getTime())/1e3):r.expiry=e.expiry,r.provider=e.provider||r.provider):typeof e=="object"?r.provider=e.provider||r.provider:typeof e=="number"&&(r.expiry=e);return r.expiry=r.expiry&&r.expiry>0?r.expiry:!1,r},t={providers:{},hooks:{},_callHooks:(e,r,a)=>{if(u.call(t.hooks,e)){for(var n in t.hooks[e])if(typeof t.hooks[e][n]=="function")try{t.hooks[e][n](e,r,a)}catch(f){console.error("[Gorgon] Hook error for hook: "+e,f)}}},settings:e=>(e&&(Object.assign(i,e),t._callHooks("settings",e,i)),i),addHook:(e,r)=>{u.call(t.hooks,e)||(t.hooks[e]=[]),Array.isArray(r)?t.hooks[e]=t.hooks[e].concat(r):t.hooks[e].push(r)},addProvider:(e,r)=>{r.init(),t.providers[e]=r,t._callHooks("addProvider",{name:e,provider:r})},put:async(e,r,a)=>{a=s(a);var n=t.providers[a.provider];return t._callHooks("put",{key:e,value:r,policy:a},r),n.set(e,r,s(a))},clear:async(e,r,a)=>{var n=t.providers[r||i.defaultProvider];return t._callHooks("clear",{key:e,provider:r,identifier:a}),e&&e.indexOf("*")>-1?n.keys().then(function(f){var p=f.filter(function(g){return new RegExp("^"+e.split("*").join(".*")+"$").test(g)}),l=p.map(n.clear);return l.push(n.clear(e)),Promise.all(l)}):n.clear(e)},clearAll:async(e,r)=>{var a=t.providers[e||i.defaultProvider];return t._callHooks("clearAll",{provider:e,identifier:r}),a.clear()},overwrite:async(e,r,a)=>{try{const n=await r(),f=await t.put(e,n,s(a));return t._callHooks("overwrite",{key:e,asyncFunc:r,policy:a},f),f}catch(n){throw n}},get:async(e,r,a)=>{a=s(a);const f=await t.providers[a.provider].get(e);if(f!==void 0)return i.debug&&console.info("[Gorgon] Cache hit for key: "+e,f),t._callHooks("get",{key:e,asyncFunc:r,policy:a,cacheHit:!0,queued:!1},f),f;if(u.call(o,e)&&Array.isArray(o[e])&&o[e].length>0){var p=!1;for(var l in o[e])o[e][l].queued<new Date(Date.now()-i.retry)&&(p=!0);if(!p){i.debug&&console.info("[Gorgon] Cache miss, in progress, adding to current queue for key: "+e);var g=new Promise(function(d,h){o[e].push({res:d,rej:h,queued:new Date})});return t._callHooks("get",{key:e,asyncFunc:r,policy:a,cacheHit:!1,queued:!0},g),g}}else o[e]=[{queued:new Date}];try{i.debug&&console.info("[Gorgon] Cache miss, resolving item for: "+e);const d=r();t._callHooks("get",{key:e,asyncFunc:r,policy:a,cacheHit:!1,queued:!1},d);const h=await d;i.debug&&console.info("[Gorgon] Cache resolved, resolved item for: "+e,h);const m=await t.put(e,h,s(a));if(u.call(o,e)){for(var l in o[e])o[e][l].res&&(i.debug&&console.info("[Gorgon] Cache queue resolved for: "+e,h),o[e][l].res(m));o[e]=[],delete o[e]}return m}catch(d){if(u.call(o,e)){for(var l in o[e])o[e][l].rej&&o[e][l].rej(d);t._callHooks("valueError",{key:e,asyncFunc:r,policy:a,cacheHit:!1,queued:!1},d),o[e]=[],delete o[e]}throw d}}};return t.addProvider("memory",v()),t})();c.MemoryCache=v,c.default=x,Object.defineProperties(c,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
//# sourceMappingURL=index.umd.js.map