@jointly/cache-candidate 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var $=Object.create;var m=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var b=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),K=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},H=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of U(t))!X.call(e,a)&&a!==n&&m(e,a,{get:()=>t[a],enumerable:!(r=L(t,a))||r.enumerable});return e};var y=(e,t,n)=>(n=e!=null?$(W(e)):{},H(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),B=e=>H(m({},"__esModule",{value:!0}),e);var A=b((Fe,k)=>{"use strict";var T=Object.defineProperty,z=Object.getOwnPropertyDescriptor,G=Object.getOwnPropertyNames,V=Object.prototype.hasOwnProperty,Y=(e,t)=>{for(var n in t)T(e,n,{get:t[n],enumerable:!0})},Z=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of G(t))!V.call(e,a)&&a!==n&&T(e,a,{get:()=>t[a],enumerable:!(r=z(t,a))||r.enumerable});return e},ee=e=>Z(T({},"__esModule",{value:!0}),e),w={};Y(w,{Hooks:()=>F});k.exports=ee(w);var F=(e=>(e.INIT="INIT",e.EXECUTION_PRE="EXECUTION_PRE",e.EXECUTION_POST="EXECUTION_POST",e.DATACACHE_RECORD_ADD_PRE="DATACACHE_RECORD_ADD_PRE",e.DATACACHE_RECORD_ADD_POST="DATACACHE_RECORD_ADD_POST",e.DATACACHE_RECORD_DELETE_PRE="DATACACHE_RECORD_DELETE_PRE",e.DATACACHE_RECORD_DELETE_POST="DATACACHE_RECORD_DELETE_POST",e.CACHE_HIT="CACHE_HIT",e))(F||{})});var I=b((ke,N)=>{"use strict";var D=Object.defineProperty,te=Object.getOwnPropertyDescriptor,ne=Object.getOwnPropertyNames,ae=Object.prototype.hasOwnProperty,re=(e,t)=>{for(var n in t)D(e,n,{get:t[n],enumerable:!0})},oe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ne(t))!ae.call(e,a)&&a!==n&&D(e,a,{get:()=>t[a],enumerable:!(r=te(t,a))||r.enumerable});return e},ie=e=>oe(D({},"__esModule",{value:!0}),e),S={};re(S,{Hook:()=>se,hook:()=>de});N.exports=ie(S);var ce={before:()=>{},after:()=>{}},ue={before:()=>{},after:()=>{}};function se(e){return function(t,n,r){let a={},o=r.value,{before:i,after:c}={...ce,...e};return r.value=function(...u){i({context:a,args:u,target:t,propertyKey:n,descriptor:r});let s=o.apply(this,u);return c({context:a,args:u,target:t,propertyKey:n,descriptor:r,result:s}),s},r}}function de(e){return function(t){let n={},{before:r,after:a}={...ue,...e};return function(...o){r({context:n,args:o});let i=t(...o);return a({context:n,args:o,result:i}),i}}}});var xe={};K(xe,{CacheCandidate:()=>Pe,CacheCandidateOptionsDefault:()=>E,DataCacheRecordNotFound:()=>f,RunningQueryRecordNotFound:()=>g,cacheCandidate:()=>Re});module.exports=B(xe);var v=(e=new Map)=>({get:async t=>e.get(JSON.stringify(t)),has:async t=>e.has(JSON.stringify(t)),set:async(t,n)=>e.set(JSON.stringify(t),n),delete:async t=>e.delete(JSON.stringify(t))});var E={ttl:6e5,timeFrame:3e4,requestsThreshold:3,cache:v(),keepAlive:!1,plugins:[],events:{onCacheHit:e=>e,onCacheSet:e=>e,onCacheDelete:e=>e,onBeforeFunctionExecution:e=>e,onAfterFunctionExecution:e=>e}};var f=Symbol("DataCacheRecordNotFound"),g=Symbol("RunningQueryRecordNotFound");var J=require("crypto");var M=y(A()),j=y(I());async function l(e,t,n){for(let r of t){let a=r.hooks.filter(i=>i.hook===e);if(a.length>1)throw new Error(`Only one hook instance per plugin is allowed. ${r.name} has ${a.length} instances of ${e}}`);if(a.length===0)continue;let o=a[0];if(le(o))await o.action(n,r.additionalParameters);else throw new Error(`Hook ${e} for plugin ${r.name} is not actionable.`)}}function le(e){return[e.action!==void 0,typeof e.action=="function"].every(t=>t===!0)}function Q(e,t,n,r){return(0,j.hook)({before:()=>{l(e,n.plugins,r)},after:({result:a})=>{l(t,n.plugins,{...r,result:a})}})}function O({options:e}){e.plugins&&e.plugins.forEach(t=>{if(!t.hooks||!Array.isArray(t.hooks)||t.hooks.length===0)throw new Error(`Plugin ${t.name} has no hooks.`);t.hooks.forEach(n=>{if(!M.Hooks[n.hook])throw new Error(`Invalid hook ${n}`)})})}var h=y(A());function he(e,t){return Date.now()<e+t.timeFrame}function Ce({key:e,timeframeCache:t,executionTime:n,executionEnd:r}){t.has(e)?t.get(e).push({executionTime:n,executionEnd:r}):t.set(e,[{executionEnd:r,executionTime:n}])}function fe({options:e,key:t,timeframeCache:n}){if(n.has(t)){let r=n.get(t),a=r.filter(({executionEnd:o})=>he(o,e));r.length!==a.length&&n.set(t,a)}}function me({key:e,runningQueryCache:t}){return t.has(e)?t.get(e):g}function P(...e){return(0,J.createHash)("sha256").update(e.join("|")).digest("hex")}function ge({birthTime:e,options:t}){return Date.now()-e>=t.ttl}async function pe({options:e,key:t,HookPayload:n}){if(await e.cache.has(t)){let{result:r,birthTime:a}=await e.cache.get(t);return ge({birthTime:a,options:e})?(await R({options:e,key:t,HookPayload:n}),f):r}return f}async function ye({options:e,key:t,result:n}){return e.cache.set(t,{result:n,birthTime:Date.now()},e.ttl)}async function R({options:e,key:t,HookPayload:n}){Q(h.Hooks.DATACACHE_RECORD_DELETE_PRE,h.Hooks.DATACACHE_RECORD_DELETE_POST,e,n)(e.cache.delete)(t).then(()=>{e.events.onCacheDelete({key:t})})}async function q({result:e,runningQueryCache:t,key:n,executionStart:r,options:a,timeframeCache:o,timeoutCache:i,args:c,HookPayload:u}){let s=Date.now(),C=s-r;a.events.onAfterFunctionExecution({key:n,executionTime:C}),Ce({key:n,timeframeCache:o,executionTime:C,executionEnd:s}),Ee({options:a,key:n,timeframeCache:o,executionTime:C,args:c})>=a.requestsThreshold?(await l(h.Hooks.DATACACHE_RECORD_ADD_PRE,a.plugins,u),ye({options:a,key:n,result:e}).then(async()=>{await l(h.Hooks.DATACACHE_RECORD_ADD_POST,a.plugins,{...u,result:e}),a.events.onCacheSet({key:n})}).finally(()=>{t.delete(n),i.set(n,setTimeout(()=>{R({options:a,key:n,HookPayload:u}),i.delete(n)},a.ttl).unref())})):t.delete(n)}function Ee({options:e,key:t,timeframeCache:n,executionTime:r,args:a}){let o=0,i=n.get(t);return e.candidateFunction?o=Ae(e,r,a,i):e.millisecondThreshold?o=Te(r,e,i):o=i.length,o}function Te(e,t,n){let r=0;return e>t.millisecondThreshold&&(r=n.filter(a=>a.executionTime>t.millisecondThreshold).length),r}function Ae(e,t,n,r){let a=0;return e.candidateFunction({timeFrameCacheRecords:r,options:e,args:n})&&(a=e.requestsThreshold),a}function De({timeoutCache:e,key:t,options:n,HookPayload:r}){clearTimeout(e.get(t)),e.set(t,setTimeout(()=>{R({options:n,key:t,HookPayload:r}),e.delete(t)},n.ttl).unref())}function Oe(e=10){return Math.random().toString(36).substring(2,e+2)}async function x({options:e,key:t,timeoutCache:n,runningQueryCache:r,timeframeCache:a,args:o,originalMethod:i}){let c={options:{...e,plugins:void 0},key:t,timeoutCache:n,runningQueryCache:r,timeframeCache:a,fnArgs:o};await l(h.Hooks.INIT,e.plugins,c);let u=await pe({options:e,key:t,HookPayload:c});if(u!==f)return e.keepAlive&&De({timeoutCache:n,key:t,options:e,HookPayload:c}),await l(h.Hooks.CACHE_HIT,e.plugins,{...c,result:u}),e.events.onCacheHit({key:t}),Promise.resolve(u);let s=me({key:t,runningQueryCache:r});if(s!==g)return await l(h.Hooks.CACHE_HIT,e.plugins,{...c,result:s}),s;fe({options:e,key:t,timeframeCache:a}),await l(h.Hooks.EXECUTION_PRE,e.plugins,c),e.events.onBeforeFunctionExecution({key:t});let C=Date.now(),d=i(...o);return await l(h.Hooks.EXECUTION_POST,e.plugins,{...c,result:d}),d instanceof Promise?(r.set(t,d),d.then(p=>q({result:p,runningQueryCache:r,key:t,executionStart:C,options:e,timeframeCache:a,timeoutCache:n,args:o,HookPayload:c})),d):(q({result:d,runningQueryCache:r,key:t,executionStart:C,options:e,timeframeCache:a,timeoutCache:n,args:o,HookPayload:c}),d)}function _(e){let t=new Map,n=new Map,r=Oe(),a=new Map,o={...E,...e};return{timeframeCache:t,runningQueryCache:n,uniqueIdentifier:r,timeoutCache:a,options:o}}function Pe(e={}){let{timeframeCache:t,runningQueryCache:n,uniqueIdentifier:r,timeoutCache:a,options:o}=_(e);return O({options:o}),function(i,c,u){let s=u.value;u.value=async function(...C){let d=i.constructor.name+JSON.stringify(this),p=P([c,r,d,JSON.stringify(C)]);return x({options:o,key:p,timeoutCache:a,runningQueryCache:n,timeframeCache:t,args:C,originalMethod:s})}}}function Re(e,t={}){let{timeframeCache:n,runningQueryCache:r,uniqueIdentifier:a,timeoutCache:o,options:i}=_(t);return O({options:i}),async(...c)=>x({options:i,key:P([a,JSON.stringify(c)]),timeoutCache:o,runningQueryCache:r,timeframeCache:n,args:c,originalMethod:e})}0&&(module.exports={CacheCandidate,CacheCandidateOptionsDefault,DataCacheRecordNotFound,RunningQueryRecordNotFound,cacheCandidate});
1
+ "use strict";var $=Object.create;var m=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var b=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),B=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},v=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of W(t))!K.call(e,a)&&a!==n&&m(e,a,{get:()=>t[a],enumerable:!(r=L(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?$(X(e)):{},v(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),z=e=>v(m({},"__esModule",{value:!0}),e);var y=b((Fe,S)=>{"use strict";var A=Object.defineProperty,G=Object.getOwnPropertyDescriptor,V=Object.getOwnPropertyNames,Y=Object.prototype.hasOwnProperty,Z=(e,t)=>{for(var n in t)A(e,n,{get:t[n],enumerable:!0})},ee=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of V(t))!Y.call(e,a)&&a!==n&&A(e,a,{get:()=>t[a],enumerable:!(r=G(t,a))||r.enumerable});return e},te=e=>ee(A({},"__esModule",{value:!0}),e),k={};Z(k,{Hooks:()=>F});S.exports=te(k);var F=(e=>(e.SETUP="SETUP",e.INIT="INIT",e.EXECUTION_PRE="EXECUTION_PRE",e.EXECUTION_POST="EXECUTION_POST",e.DATACACHE_RECORD_ADD_PRE="DATACACHE_RECORD_ADD_PRE",e.DATACACHE_RECORD_ADD_POST="DATACACHE_RECORD_ADD_POST",e.DATACACHE_RECORD_DELETE_PRE="DATACACHE_RECORD_DELETE_PRE",e.DATACACHE_RECORD_DELETE_POST="DATACACHE_RECORD_DELETE_POST",e.CACHE_HIT="CACHE_HIT",e))(F||{})});var M=b((Se,I)=>{"use strict";var P=Object.defineProperty,ne=Object.getOwnPropertyDescriptor,ae=Object.getOwnPropertyNames,re=Object.prototype.hasOwnProperty,oe=(e,t)=>{for(var n in t)P(e,n,{get:t[n],enumerable:!0})},ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ae(t))!re.call(e,a)&&a!==n&&P(e,a,{get:()=>t[a],enumerable:!(r=ne(t,a))||r.enumerable});return e},ce=e=>ie(P({},"__esModule",{value:!0}),e),N={};oe(N,{Hook:()=>de,hook:()=>le});I.exports=ce(N);var ue={before:()=>{},after:()=>{}},se={before:()=>{},after:()=>{}};function de(e){return function(t,n,r){let a={},o=r.value,{before:i,after:c}={...ue,...e};return r.value=function(...u){i({context:a,args:u,target:t,propertyKey:n,descriptor:r});let d=o.apply(this,u);return c({context:a,args:u,target:t,propertyKey:n,descriptor:r,result:d}),d},r}}function le(e){return function(t){let n={},{before:r,after:a}={...se,...e};return function(...o){r({context:n,args:o});let i=t(...o);return a({context:n,args:o,result:i}),i}}}});var _e={};B(_e,{CacheCandidate:()=>Re,CacheCandidateOptionsDefault:()=>T,DataCacheRecordNotFound:()=>f,RunningQueryRecordNotFound:()=>p,cacheCandidate:()=>xe});module.exports=z(_e);var w=(e=new Map)=>({get:async t=>e.get(JSON.stringify(t)),has:async t=>e.has(JSON.stringify(t)),set:async(t,n)=>e.set(JSON.stringify(t),n),delete:async t=>e.delete(JSON.stringify(t))});var T={ttl:6e5,timeFrame:3e4,requestsThreshold:3,cache:w(),keepAlive:!1,plugins:[],events:{onCacheHit:e=>e,onCacheSet:e=>e,onCacheDelete:e=>e,onBeforeFunctionExecution:e=>e,onAfterFunctionExecution:e=>e}};var f=Symbol("DataCacheRecordNotFound"),p=Symbol("RunningQueryRecordNotFound");var H=g(y());var J=require("crypto");var j=g(y()),U=g(M());async function s(e,t,n){for(let r of t){let a=r.hooks.filter(i=>i.hook===e);if(a.length>1)throw new Error(`Only one hook instance per plugin is allowed. ${r.name} has ${a.length} instances of ${e}}`);if(a.length===0)continue;let o=a[0];if(he(o))await o.action(n,r.additionalParameters);else throw new Error(`Hook ${e} for plugin ${r.name} is not actionable.`)}}function he(e){return[e.action!==void 0,typeof e.action=="function"].every(t=>t===!0)}function Q(e,t,n,r){return(0,U.hook)({before:()=>{s(e,n.plugins,r)},after:({result:a})=>{s(t,n.plugins,{...r,result:a})}})}function D({options:e}){e.plugins&&e.plugins.forEach(t=>{if(!t.hooks||!Array.isArray(t.hooks)||t.hooks.length===0)throw new Error(`Plugin ${t.name} has no hooks.`);t.hooks.forEach(n=>{if(!j.Hooks[n.hook])throw new Error(`Invalid hook ${n}`)})})}var h=g(y());function Ce(e,t){return Date.now()<e+t.timeFrame}function fe({key:e,timeframeCache:t,executionTime:n,executionEnd:r}){t.has(e)?t.get(e).push({executionTime:n,executionEnd:r}):t.set(e,[{executionEnd:r,executionTime:n}])}function me({options:e,key:t,timeframeCache:n}){if(n.has(t)){let r=n.get(t),a=r.filter(({executionEnd:o})=>Ce(o,e));r.length!==a.length&&n.set(t,a)}}function ge({key:e,runningQueryCache:t}){return t.has(e)?t.get(e):p}function O(...e){return(0,J.createHash)("sha256").update(e.join("|")).digest("hex")}function pe({birthTime:e,options:t}){return Date.now()-e>=t.ttl}async function ye({options:e,key:t,HookPayload:n}){if(await e.cache.has(t)){let{result:r,birthTime:a}=await e.cache.get(t);return pe({birthTime:a,options:e})?(await R({options:e,key:t,HookPayload:n}),f):r}return f}async function Ee({options:e,key:t,result:n}){return e.cache.set(t,{result:n,birthTime:Date.now()},e.ttl)}async function R({options:e,key:t,HookPayload:n}){Q(h.Hooks.DATACACHE_RECORD_DELETE_PRE,h.Hooks.DATACACHE_RECORD_DELETE_POST,e,n)(e.cache.delete)(t).then(()=>{e.events.onCacheDelete({key:t})})}async function q({result:e,runningQueryCache:t,key:n,executionStart:r,options:a,timeframeCache:o,timeoutCache:i,args:c,HookPayload:u}){let d=Date.now(),C=d-r;a.events.onAfterFunctionExecution({key:n,executionTime:C}),fe({key:n,timeframeCache:o,executionTime:C,executionEnd:d}),Te({options:a,key:n,timeframeCache:o,executionTime:C,args:c})>=a.requestsThreshold?(await s(h.Hooks.DATACACHE_RECORD_ADD_PRE,a.plugins,u),Ee({options:a,key:n,result:e}).then(async()=>{await s(h.Hooks.DATACACHE_RECORD_ADD_POST,a.plugins,{...u,result:e}),a.events.onCacheSet({key:n})}).finally(()=>{t.delete(n),i.set(n,setTimeout(()=>{R({options:a,key:n,HookPayload:u}),i.delete(n)},a.ttl).unref())})):t.delete(n)}function Te({options:e,key:t,timeframeCache:n,executionTime:r,args:a}){let o=0,i=n.get(t);return e.candidateFunction?o=Pe(e,r,a,i):e.millisecondThreshold?o=Ae(r,e,i):o=i.length,o}function Ae(e,t,n){let r=0;return e>t.millisecondThreshold&&(r=n.filter(a=>a.executionTime>t.millisecondThreshold).length),r}function Pe(e,t,n,r){let a=0;return e.candidateFunction({timeFrameCacheRecords:r,options:e,args:n})&&(a=e.requestsThreshold),a}function De({timeoutCache:e,key:t,options:n,HookPayload:r}){clearTimeout(e.get(t)),e.set(t,setTimeout(()=>{R({options:n,key:t,HookPayload:r}),e.delete(t)},n.ttl).unref())}function Oe(e=10){return Math.random().toString(36).substring(2,e+2)}async function x({options:e,key:t,timeoutCache:n,runningQueryCache:r,timeframeCache:a,args:o,originalMethod:i}){let c={options:{...e,plugins:void 0},key:t,timeoutCache:n,runningQueryCache:r,timeframeCache:a,fnArgs:o};await s(h.Hooks.INIT,e.plugins,c);let u=await ye({options:e,key:t,HookPayload:c});if(u!==f)return e.keepAlive&&De({timeoutCache:n,key:t,options:e,HookPayload:c}),await s(h.Hooks.CACHE_HIT,e.plugins,{...c,result:u}),e.events.onCacheHit({key:t}),Promise.resolve(u);let d=ge({key:t,runningQueryCache:r});if(d!==p)return await s(h.Hooks.CACHE_HIT,e.plugins,{...c,result:d}),d;me({options:e,key:t,timeframeCache:a}),await s(h.Hooks.EXECUTION_PRE,e.plugins,c),e.events.onBeforeFunctionExecution({key:t});let C=Date.now(),l=i(...o);return await s(h.Hooks.EXECUTION_POST,e.plugins,{...c,result:l}),l instanceof Promise?(r.set(t,l),l.then(E=>q({result:E,runningQueryCache:r,key:t,executionStart:C,options:e,timeframeCache:a,timeoutCache:n,args:o,HookPayload:c})),l):(q({result:l,runningQueryCache:r,key:t,executionStart:C,options:e,timeframeCache:a,timeoutCache:n,args:o,HookPayload:c}),l)}function _(e){let t=new Map,n=new Map,r=Oe(),a=new Map,o={...T,...e};return{timeframeCache:t,runningQueryCache:n,uniqueIdentifier:r,timeoutCache:a,options:o}}function Re(e={}){let{timeframeCache:t,runningQueryCache:n,uniqueIdentifier:r,timeoutCache:a,options:o}=_(e);return D({options:o}),s(H.Hooks.SETUP,o.plugins,{options:{...o,plugins:void 0},key:"",timeoutCache:a,runningQueryCache:n,timeframeCache:t,fnArgs:[]}),function(i,c,u){let d=u.value;u.value=async function(...C){let l=i.constructor.name+JSON.stringify(this),E=O([c,r,l,JSON.stringify(C)]);return x({options:o,key:E,timeoutCache:a,runningQueryCache:n,timeframeCache:t,args:C,originalMethod:d})}}}function xe(e,t={}){let{timeframeCache:n,runningQueryCache:r,uniqueIdentifier:a,timeoutCache:o,options:i}=_(t);return D({options:i}),s(H.Hooks.SETUP,i.plugins,{options:{...i,plugins:void 0},key:"",timeoutCache:o,runningQueryCache:r,timeframeCache:n,fnArgs:[]}),async(...c)=>x({options:i,key:O([a,JSON.stringify(c)]),timeoutCache:o,runningQueryCache:r,timeframeCache:n,args:c,originalMethod:e})}0&&(module.exports={CacheCandidate,CacheCandidateOptionsDefault,DataCacheRecordNotFound,RunningQueryRecordNotFound,cacheCandidate});
package/dist/models.d.ts CHANGED
@@ -10,6 +10,7 @@ export interface CacheCandidateCacheAdapter {
10
10
  set: (key: string, value: any, ttl: number) => Promise<any>;
11
11
  has: (key: string) => Promise<boolean>;
12
12
  delete: (key: string) => Promise<boolean>;
13
+ [key: string]: any;
13
14
  }
14
15
  export interface CacheCandidateOptions {
15
16
  ttl: number;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jointly/cache-candidate",
3
3
  "private": false,
4
- "version": "1.2.0",
4
+ "version": "1.3.0",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/index.d.ts",