@gorgonjs/gorgon 1.3.1 → 1.4.1

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/.eslintrc CHANGED
@@ -272,5 +272,7 @@
272
272
  "requireConfigFile": false,
273
273
  "sourceType": "module",
274
274
  "ecmaVersion": 12
275
- }
275
+ },
276
+ "parser": "@typescript-eslint/parser",
277
+ "plugins": ["@typescript-eslint"]
276
278
  }
package/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.4.0] - 2022-11-19
11
+
12
+ ### Added
13
+ - added a file provider at @gorgon/file-provider
14
+ ### Fixed
15
+ - fixed a bug where when you cached something permanently (false) with the non default cache it would use the default provider
16
+
10
17
  ## [1.3.1] - 2022-11-14
11
18
 
12
19
  ### Added
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Gorgon
2
- ![coverage](https://img.shields.io/badge/coverage-98%25-brightgreen)
3
- ![size](https://img.shields.io/badge/size-3.83KB-brightgreen)
4
- ![version](https://img.shields.io/badge/version-1.3.0-blue)
2
+ ![coverage](https://img.shields.io/badge/coverage-97%25-brightgreen)
3
+ ![size](https://img.shields.io/badge/size-4.03KB-brightgreen)
4
+ ![version](https://img.shields.io/badge/version-1.4.0-blue)
5
5
  ![license](https://img.shields.io/badge/license-MIT-blue)
6
6
 
7
7
  A typescript async based caching library for node or the browser.
@@ -34,4 +34,39 @@ describe('Clear many from storage', () => {
34
34
 
35
35
  });
36
36
 
37
+ it('clears every item in the cache', async() => {
38
+
39
+ const res = await Gorgon.get('clearall1', async() => {
40
+ return 'success';
41
+ }, 1000);
42
+
43
+ expect(res).toEqual('success');
44
+
45
+ const res2 = await Gorgon.get('clearall2', async() => {
46
+ return 'success';
47
+ }, 1000);
48
+
49
+ expect(res2).toEqual('success');
50
+
51
+ await Gorgon.clearAll();
52
+
53
+ const res3 = await Gorgon.get('clearall1', async() => {
54
+ return 'success2';
55
+ }, 1000);
56
+
57
+ expect(res3).toEqual('success2');
58
+
59
+ const res4 = await Gorgon.get('clearall2', async() => {
60
+ return 'success2';
61
+ }, 1000);
62
+
63
+ expect(res4).toEqual('success2');
64
+
65
+ Gorgon.clearAll();
66
+
67
+ const keys = await Gorgon.providers['memory'].keys();
68
+ expect(keys.length).toEqual(0);
69
+
70
+ });
71
+
37
72
  });
package/dist/index.d.ts CHANGED
@@ -1,20 +1,21 @@
1
- export declare type asyncFunction = () => Promise<any> | (() => any);
2
- export declare type GorgonSettings = {
1
+ import MemoryCache from './provider/memory';
2
+ export type asyncFunction = () => Promise<any> | (() => any);
3
+ export type GorgonSettings = {
3
4
  debug: boolean;
4
5
  defaultProvider: string;
5
6
  retry: number;
6
7
  };
7
- export declare type GorgonSettingsInput = {
8
+ export type GorgonSettingsInput = {
8
9
  debug?: boolean;
9
10
  defaultProvider?: string;
10
11
  retry?: number;
11
12
  };
12
- export declare type GorgonPolicy = {
13
+ export type GorgonPolicy = {
13
14
  expiry: number | Date | false;
14
15
  provider: string;
15
16
  };
16
- export declare type GorgonPolicyInput = GorgonPolicy | number | Date;
17
- export declare type GorgonPolicySanitized = {
17
+ export type GorgonPolicyInput = GorgonPolicy | number | Date;
18
+ export type GorgonPolicySanitized = {
18
19
  expiry: number | false;
19
20
  provider: string;
20
21
  };
@@ -33,7 +34,9 @@ declare const Gorgon: {
33
34
  addProvider: (name: string, provider: IGorgonCacheProvider) => void;
34
35
  put: <R>(key: string, value: R, policy?: GorgonPolicyInput) => Promise<R>;
35
36
  clear: (key: string, provider?: string) => Promise<boolean | boolean[]>;
37
+ clearAll: (provider?: string) => Promise<boolean>;
36
38
  overwrite: (key: string, asyncFunc: asyncFunction, policy?: GorgonPolicyInput) => Promise<any>;
37
39
  get: <R_1>(key: string, asyncFunc: () => R_1, policy?: GorgonPolicyInput) => Promise<R_1>;
38
40
  };
41
+ export { MemoryCache };
39
42
  export default Gorgon;
package/dist/index.es.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const g = () => {
2
- const e = {}, c = e.hasOwnProperty, o = {
2
+ const e = {}, c = e.hasOwnProperty, n = {
3
3
  init: async () => {
4
4
  },
5
5
  get: async (a) => {
@@ -7,10 +7,10 @@ const g = () => {
7
7
  return e[a].val;
8
8
  },
9
9
  set: async (a, s, r) => {
10
- await o.clear(a);
10
+ await n.clear(a);
11
11
  var t = !1;
12
12
  return r && r.expiry && r.expiry > 0 && (t = setTimeout(function() {
13
- o.clear(a);
13
+ n.clear(a);
14
14
  }, r.expiry)), e[a] = {
15
15
  policy: r,
16
16
  val: s,
@@ -21,90 +21,102 @@ const g = () => {
21
21
  clear: async (a) => {
22
22
  if (!a) {
23
23
  for (var s in e)
24
- o._clear(s);
24
+ n._clear(s);
25
25
  return !0;
26
26
  }
27
- return o._clear(a);
27
+ return n._clear(a);
28
28
  },
29
29
  _clear: (a) => c.call(e, a) ? (e[a].to && clearTimeout(e[a].to), e[a] = null, delete e[a], !0) : !1
30
30
  };
31
- return o;
31
+ return n;
32
32
  }, h = (() => {
33
- const e = {}, c = e.hasOwnProperty, o = {
33
+ const e = {}, c = e.hasOwnProperty, n = {
34
34
  debug: !1,
35
35
  defaultProvider: "memory",
36
36
  retry: 5e3
37
37
  }, a = function(r) {
38
38
  const t = {
39
39
  expiry: !1,
40
- provider: o.defaultProvider
40
+ provider: n.defaultProvider
41
41
  };
42
42
  if (!r)
43
43
  return t;
44
44
  if (r instanceof Date) {
45
- var n = new Date();
46
- t.expiry = Math.ceil((r.getTime() - n.getTime()) / 1e3);
45
+ var o = /* @__PURE__ */ new Date();
46
+ t.expiry = Math.ceil((r.getTime() - o.getTime()) / 1e3);
47
47
  } else
48
- typeof r == "object" && r.expiry ? (r.expiry instanceof Date ? t.expiry = Math.ceil((r.expiry.getTime() - n.getTime()) / 1e3) : t.expiry = r.expiry, t.provider = r.provider || t.provider) : typeof r == "number" && (t.expiry = r);
49
- return t.expiry = t.expiry > 0 ? t.expiry : !1, t;
48
+ typeof r == "object" && r.expiry ? (r.expiry instanceof Date ? t.expiry = Math.ceil((r.expiry.getTime() - o.getTime()) / 1e3) : t.expiry = r.expiry, t.provider = r.provider || t.provider) : typeof r == "object" ? t.provider = r.provider || t.provider : typeof r == "number" && (t.expiry = r);
49
+ return t.expiry = t.expiry && t.expiry > 0 ? t.expiry : !1, t;
50
50
  }, s = {
51
+ // Providers available for use
51
52
  providers: {},
52
- settings: (r) => (r && Object.assign(o, r), o),
53
+ // Allows for settings on the gorgon cache
54
+ settings: (r) => (r && Object.assign(n, r), n),
55
+ // Add a provider
53
56
  addProvider: (r, t) => {
54
57
  t.init(), s.providers[r] = t;
55
58
  },
56
- put: async (r, t, n) => {
57
- n = a(n);
58
- var u = s.providers[n.provider];
59
- return u.set(r, t, a(n));
59
+ // Place an item into the cache
60
+ put: async (r, t, o) => {
61
+ o = a(o);
62
+ var u = s.providers[o.provider];
63
+ return u.set(r, t, a(o));
60
64
  },
65
+ // Clear one or all items in the cache
61
66
  clear: async (r, t) => {
62
- var n = s.providers[t || o.defaultProvider];
63
- return r && r.indexOf("*") > -1 ? n.keys().then(function(u) {
64
- var l = u.filter(function(i) {
67
+ var o = s.providers[t || n.defaultProvider];
68
+ return r && r.indexOf("*") > -1 ? o.keys().then(function(u) {
69
+ var v = u.filter(function(i) {
65
70
  return new RegExp("^" + r.split("*").join(".*") + "$").test(i);
66
- }), v = l.map(n.clear);
67
- return v.push(n.clear(r)), Promise.all(v);
68
- }) : n.clear(r);
71
+ }), l = v.map(o.clear);
72
+ return l.push(o.clear(r)), Promise.all(l);
73
+ }) : o.clear(r);
69
74
  },
70
- overwrite: async (r, t, n) => {
75
+ // Clear all keys/values in the cache
76
+ clearAll: async (r) => {
77
+ var t = s.providers[r || n.defaultProvider];
78
+ return t.clear();
79
+ },
80
+ // Allows you to instantly overwite a cache object
81
+ overwrite: async (r, t, o) => {
71
82
  try {
72
83
  const u = await t();
73
- return await s.put(r, u, a(n));
84
+ return await s.put(r, u, a(o));
74
85
  } catch (u) {
75
86
  throw u;
76
87
  }
77
88
  },
78
- get: async (r, t, n) => {
79
- n = a(n);
80
- const l = await s.providers[n.provider].get(r);
81
- if (l !== void 0)
82
- return o.debug && console.info("[Gorgon] Cache hit for key: " + r, l), l;
89
+ // Allows you to get from the cache or pull from the promise
90
+ get: async (r, t, o) => {
91
+ o = a(o);
92
+ const v = await s.providers[o.provider].get(r);
93
+ if (v !== void 0)
94
+ return n.debug && console.info("[Gorgon] Cache hit for key: " + r, v), v;
83
95
  if (c.call(e, r) && Array.isArray(e[r]) && e[r].length > 0) {
84
- var v = !1;
96
+ var l = !1;
85
97
  for (var i in e[r])
86
- e[r][i].queued < new Date(Date.now() - o.retry) && (v = !0);
87
- if (!v) {
88
- o.debug && console.info("[Gorgon] Cache miss, in progress, adding to current queue for key: " + r);
98
+ e[r][i].queued < new Date(Date.now() - n.retry) && (l = !0);
99
+ if (!l) {
100
+ n.debug && console.info("[Gorgon] Cache miss, in progress, adding to current queue for key: " + r);
89
101
  var p = new Promise(function(f, d) {
90
102
  e[r].push({
91
103
  res: f,
92
104
  rej: d,
93
- queued: new Date()
105
+ queued: /* @__PURE__ */ new Date()
94
106
  });
95
107
  });
96
108
  return p;
97
109
  }
98
110
  } else
99
- e[r] = [{ queued: new Date() }];
111
+ e[r] = [{ queued: /* @__PURE__ */ new Date() }];
100
112
  try {
101
- o.debug && console.info("[Gorgon] Cache miss, resolving item for: " + r);
113
+ n.debug && console.info("[Gorgon] Cache miss, resolving item for: " + r);
102
114
  const f = await t();
103
- o.debug && console.info("[Gorgon] Cache resolved, resolved item for: " + r, f);
104
- let d = await s.put(r, f, a(n));
115
+ n.debug && console.info("[Gorgon] Cache resolved, resolved item for: " + r, f);
116
+ const d = await s.put(r, f, a(o));
105
117
  if (c.call(e, r)) {
106
118
  for (var i in e[r])
107
- e[r][i].res && (o.debug && console.info("[Gorgon] Cache queue resolved for: " + r, f), e[r][i].res(d));
119
+ e[r][i].res && (n.debug && console.info("[Gorgon] Cache queue resolved for: " + r, f), e[r][i].res(d));
108
120
  e[r] = [], delete e[r];
109
121
  }
110
122
  return d;
@@ -121,6 +133,7 @@ const g = () => {
121
133
  return s.addProvider("memory", g()), s;
122
134
  })();
123
135
  export {
136
+ g as MemoryCache,
124
137
  h as default
125
138
  };
126
139
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../provider/memory.ts","../index.ts"],"sourcesContent":["import { IGorgonCacheProvider, GorgonPolicySanitized } from \"../index\";\n\ninterface IGorgonMemoryCacheProvider extends IGorgonCacheProvider {\n _clear: (key:string) => boolean;\n}\n\n// Created as a function to allow for multiple instances of the memory cache, if needed\nconst MemoryCacheCreator = () =>{\n\n const cache = {};\n const hOP = cache.hasOwnProperty;\n\n// Memory cache is about the simplist cache possible, use it as an example\n const memoryCache = {\n\n init: async() => {\n // This should be used to update the cache on boot,\n // memory cache will be blank on boot by default\n return;\n },\n\n get: async (key:string) => {\n\n if (hOP.call(cache, key) && cache[key].val) {\n // The cached item exists, return it\n return cache[key].val;\n } else {\n // The cached item does not exist reject\n return undefined;\n }\n\n },\n\n set: async(key:string, value:any, policy: GorgonPolicySanitized) => {\n\n // Clear in case it exists\n await memoryCache.clear(key);\n\n // Set a timemout to self-remove from the cache if in policy\n var to = false as boolean | number;\n\n if (policy && policy.expiry && policy.expiry > 0) {\n to = setTimeout(function() {\n memoryCache.clear(key);\n }, policy.expiry);\n }\n\n // Store the cached item\n cache[key] = {\n policy: policy,\n val: value,\n to: to,\n };\n\n return value;\n\n },\n\n keys: async() => {\n return Object.keys(cache);\n },\n\n clear: async (key?:string) => {\n\n // Clears a single key or complete clear on empty\n // Clear all items in the cache\n if (!key) {\n for (var i in cache) {\n memoryCache._clear(i);\n }\n return true;\n }\n\n return memoryCache._clear(key);\n },\n\n _clear: (key:string) => {\n // Clear a single item, making sure to remove the extra timeout\n if (hOP.call(cache, key)) {\n if (cache[key].to) {\n clearTimeout(cache[key].to);\n }\n\n cache[key] = null;\n delete cache[key];\n return true;\n }\n\n return false;\n },\n\n } as IGorgonMemoryCacheProvider;\n\n return memoryCache;\n\n}\n\nexport default MemoryCacheCreator;\n","import MemoryCache from './provider/memory';\n\nexport type asyncFunction = () => Promise<any> | (() => any);\nexport type GorgonSettings = {\n debug: boolean;\n defaultProvider: string;\n retry: number;\n}\nexport type GorgonSettingsInput = {\n debug?: boolean;\n defaultProvider?: string;\n retry?: number;\n}\nexport type GorgonPolicy = {\n expiry: number | Date | false;\n provider: string;\n};\nexport type GorgonPolicyInput = GorgonPolicy | number | Date;\nexport type GorgonPolicySanitized = {\n expiry: number | false;\n provider: string;\n};\ntype GorgonCurrentTaskItem = Array<{\n res?: any;\n rej?: any;\n queued: Date;\n}>;\nexport interface IGorgonCacheProvider {\n init: () => Promise<void>;\n get: (key: string) => Promise<any>;\n set: <R>(key: string, value: R, policy: GorgonPolicySanitized) => Promise<R>;\n clear: (key?: string) => Promise<boolean>;\n keys: () => Promise<string[]>;\n}\n\nconst Gorgon = (() => {\n\n const currentTasks = {} as {[key: string]: GorgonCurrentTaskItem};\n const hOP = currentTasks.hasOwnProperty;\n\n const settings = {\n debug: false,\n defaultProvider: 'memory',\n retry: 5000,\n } as GorgonSettings;\n\n const policyMaker = function(incPolicy?: GorgonPolicyInput) {\n const outPolicy = {\n expiry: false,\n provider: settings.defaultProvider,\n } as GorgonPolicySanitized;\n\n // Blank policy, false, or no policy. lets store forever\n if (!incPolicy) {\n return outPolicy;\n }\n\n // Type is a full policy object\n if(incPolicy instanceof Date){\n var d = new Date();\n outPolicy.expiry = Math.ceil((incPolicy.getTime() - d.getTime()) / 1000);\n }else if (typeof incPolicy === 'object' && incPolicy.expiry) {\n if(incPolicy.expiry instanceof Date){\n outPolicy.expiry = Math.ceil((incPolicy.expiry.getTime() - d.getTime()) / 1000);\n }else{\n outPolicy.expiry = incPolicy.expiry;\n }\n outPolicy.provider = incPolicy.provider || outPolicy.provider;\n } else if(typeof incPolicy === 'number'){\n outPolicy.expiry = incPolicy;\n }\n\n // Number is too small, negative or not a number\n outPolicy.expiry = outPolicy.expiry > 0 ? outPolicy.expiry : false;\n\n return outPolicy;\n };\n\n const gorgonCore = {\n\n // Providers available for use\n providers: {} as {[key: string]: IGorgonCacheProvider},\n\n // Allows for settings on the gorgon cache\n settings: (newSettings?: GorgonSettingsInput) => {\n if (!newSettings) {\n return settings;\n }\n\n Object.assign(settings, newSettings); // only overwrite ones sent in; keep others at existing\n\n return settings;\n },\n\n // Add a provider\n addProvider: (name: string, provider:IGorgonCacheProvider) => {\n provider.init(); // Trigger for provider to clear any old cache items or any other cleanup\n gorgonCore.providers[name] = provider;\n },\n\n // Place an item into the cache\n put: async<R>(key:string, value:R, policy?: GorgonPolicyInput):Promise<R> => {\n policy = policyMaker(policy);\n var prov = gorgonCore.providers[policy.provider];\n\n return prov.set(key, value, policyMaker(policy));\n },\n\n // Clear one or all items in the cache\n clear: async(key: string, provider?: string) => {\n\n var prov = gorgonCore.providers[provider || settings.defaultProvider];\n\n // Clear a wildcard search of objects\n if (key && key.indexOf('*') > -1) {\n return prov.keys().then(function(keys) {\n var cacheMatchKeys = keys.filter(function(str) {\n return new RegExp('^' + key.split('*').join('.*') + '$').test(str);\n });\n\n var clearPromises = cacheMatchKeys.map(prov.clear);\n // Incase someone somehow used a wildcard in their cached key (don't do this)\n\n clearPromises.push(prov.clear(key));\n return Promise.all(clearPromises);\n });\n }\n\n // Not a special clear\n return prov.clear(key);\n\n },\n\n // Allows you to instantly overwite a cache object\n overwrite: async(key:string, asyncFunc: asyncFunction, policy?: GorgonPolicyInput) => {\n\n try{\n const resolvedData = await asyncFunc();\n\n const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n return val;\n }catch (e) {\n throw e;\n }\n\n },\n\n // Allows you to get from the cache or pull from the promise\n get: async<R>(key:string, asyncFunc:() => R, policy?: GorgonPolicyInput):Promise<R> => {\n\n policy = policyMaker(policy);\n const prov = gorgonCore.providers[policy.provider];\n\n const currentVal = await prov.get(key); // Most providers will only lookup by key and return false on not found\n\n // If we have a current value sent it out; cache hit!\n if(currentVal !== undefined) {\n if(settings.debug) console.info('[Gorgon] Cache hit for key: ' + key, currentVal);\n return currentVal;\n }\n\n // Are we currently already running this cache item?\n if (hOP.call(currentTasks, key) && Array.isArray(currentTasks[key]) && currentTasks[key].length > 0) {\n // Add to the current task, but ignore if any items is below retry anyway threshold\n var oldQueue = false;\n\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].queued < new Date(Date.now() - settings.retry)) {\n oldQueue = true;\n }\n }\n\n // Add to the current queue\n if(!oldQueue) {\n if(settings.debug) console.info('[Gorgon] Cache miss, in progress, adding to current queue for key: ' + key);\n\n var concurent = new Promise(function(resolve: (value: R) => void, reject) {\n currentTasks[key].push({\n res: resolve,\n rej: reject,\n queued: new Date(),\n });\n });\n\n return concurent;\n }\n }else{\n // Add current task to list, this is the first one so the primary\n currentTasks[key] = [{queued: new Date()}];\n }\n\n try{\n if(settings.debug) console.info('[Gorgon] Cache miss, resolving item for: ' + key);\n\n // This is the primary item, lets resolve and push it out\n const resolvedData = await asyncFunc();\n\n if(settings.debug) console.info('[Gorgon] Cache resolved, resolved item for: ' + key, resolvedData);\n\n let val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].res) {\n if(settings.debug) console.info('[Gorgon] Cache queue resolved for: ' + key, resolvedData);\n\n currentTasks[key][i].res(val);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n return val;\n\n }catch (e) {\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].rej) {\n currentTasks[key][i].rej(e);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n throw e;\n }\n\n },\n\n\n };\n\n gorgonCore.addProvider('memory', MemoryCache()); // Default provider, light weight and simple\n\n return gorgonCore;\n\n})();\n\nexport default Gorgon;\n"],"names":["MemoryCacheCreator","cache","hOP","memoryCache","key","value","policy","to","i","Gorgon","currentTasks","settings","policyMaker","incPolicy","outPolicy","d","gorgonCore","newSettings","name","provider","prov","keys","cacheMatchKeys","str","clearPromises","asyncFunc","resolvedData","e","currentVal","oldQueue","concurent","resolve","reject","val","MemoryCache"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../provider/memory.ts","../index.ts"],"sourcesContent":["import {IGorgonCacheProvider, GorgonPolicySanitized} from '../index';\n\ninterface IGorgonMemoryCacheProvider extends IGorgonCacheProvider {\n _clear: (key:string) => boolean;\n}\n\n// Created as a function to allow for multiple instances of the memory cache, if needed\nconst MemoryCacheCreator = ():IGorgonMemoryCacheProvider =>{\n\n const cache = {};\n const hOP = cache.hasOwnProperty;\n\n// Memory cache is about the simplist cache possible, use it as an example\n const memoryCache = {\n\n init: async() => {\n // This should be used to update the cache on boot,\n // memory cache will be blank on boot by default\n return;\n },\n\n get: async(key:string) => {\n\n if (hOP.call(cache, key) && cache[key].val) {\n // The cached item exists, return it\n return cache[key].val;\n } else {\n // The cached item does not exist reject\n return undefined;\n }\n\n },\n\n set: async(key:string, value:any, policy: GorgonPolicySanitized) => {\n\n // Clear in case it exists\n await memoryCache.clear(key);\n\n // Set a timemout to self-remove from the cache if in policy\n var to = false as boolean | number;\n\n if (policy && policy.expiry && policy.expiry > 0) {\n to = setTimeout(function() {\n memoryCache.clear(key);\n }, policy.expiry);\n }\n\n // Store the cached item\n cache[key] = {\n policy: policy,\n val: value,\n to: to,\n };\n\n return value;\n\n },\n\n keys: async() => {\n return Object.keys(cache);\n },\n\n clear: async(key?:string) => {\n\n // Clears a single key or complete clear on empty\n // Clear all items in the cache\n if (!key) {\n for (var i in cache) {\n memoryCache._clear(i);\n }\n return true;\n }\n\n return memoryCache._clear(key);\n },\n\n _clear: (key:string) => {\n // Clear a single item, making sure to remove the extra timeout\n if (hOP.call(cache, key)) {\n if (cache[key].to) {\n clearTimeout(cache[key].to);\n }\n\n cache[key] = null;\n delete cache[key];\n return true;\n }\n\n return false;\n },\n\n };\n\n return memoryCache;\n\n}\n\nexport default MemoryCacheCreator;\n","import MemoryCache from './provider/memory';\n\nexport type asyncFunction = () => Promise<any> | (() => any);\nexport type GorgonSettings = {\n debug: boolean;\n defaultProvider: string;\n retry: number;\n}\nexport type GorgonSettingsInput = {\n debug?: boolean;\n defaultProvider?: string;\n retry?: number;\n}\nexport type GorgonPolicy = {\n expiry: number | Date | false;\n provider: string;\n};\nexport type GorgonPolicyInput = GorgonPolicy | number | Date;\nexport type GorgonPolicySanitized = {\n expiry: number | false;\n provider: string;\n};\ntype GorgonCurrentTaskItem = Array<{\n res?: any;\n rej?: any;\n queued: Date;\n}>;\nexport interface IGorgonCacheProvider {\n init: () => Promise<void>;\n get: (key: string) => Promise<any>;\n set: <R>(key: string, value: R, policy: GorgonPolicySanitized) => Promise<R>;\n clear: (key?: string) => Promise<boolean>;\n keys: () => Promise<string[]>;\n}\n\nconst Gorgon = (() => {\n\n const currentTasks = {} as {[key: string]: GorgonCurrentTaskItem};\n const hOP = currentTasks.hasOwnProperty;\n\n const settings = {\n debug: false,\n defaultProvider: 'memory',\n retry: 5000,\n } as GorgonSettings;\n\n const policyMaker = function(incPolicy?: GorgonPolicyInput) {\n const outPolicy = {\n expiry: false,\n provider: settings.defaultProvider,\n } as GorgonPolicySanitized;\n\n // Blank policy, false, or no policy. lets store forever\n if (!incPolicy) {\n return outPolicy;\n }\n\n // Type is a full policy object\n if(incPolicy instanceof Date) {\n var d = new Date();\n\n outPolicy.expiry = Math.ceil((incPolicy.getTime() - d.getTime()) / 1000);\n }else if (typeof incPolicy === 'object' && incPolicy.expiry) {\n if(incPolicy.expiry instanceof Date) {\n outPolicy.expiry = Math.ceil((incPolicy.expiry.getTime() - d.getTime()) / 1000);\n }else{\n outPolicy.expiry = incPolicy.expiry;\n }\n outPolicy.provider = incPolicy.provider || outPolicy.provider;\n } else if(typeof incPolicy === 'object') {\n outPolicy.provider = incPolicy.provider || outPolicy.provider;\n } else if(typeof incPolicy === 'number') {\n outPolicy.expiry = incPolicy;\n }\n\n // Number is too small, negative or not a number\n outPolicy.expiry = outPolicy.expiry && outPolicy.expiry > 0 ? outPolicy.expiry : false;\n\n return outPolicy;\n };\n\n const gorgonCore = {\n\n // Providers available for use\n providers: {} as {[key: string]: IGorgonCacheProvider},\n\n // Allows for settings on the gorgon cache\n settings: (newSettings?: GorgonSettingsInput) => {\n if (!newSettings) {\n return settings;\n }\n\n Object.assign(settings, newSettings); // only overwrite ones sent in; keep others at existing\n\n return settings;\n },\n\n // Add a provider\n addProvider: (name: string, provider:IGorgonCacheProvider) => {\n provider.init(); // Trigger for provider to clear any old cache items or any other cleanup\n gorgonCore.providers[name] = provider;\n },\n\n // Place an item into the cache\n put: async<R>(key:string, value:R, policy?: GorgonPolicyInput):Promise<R> => {\n policy = policyMaker(policy);\n var prov = gorgonCore.providers[policy.provider];\n\n return prov.set(key, value, policyMaker(policy));\n },\n\n // Clear one or all items in the cache\n clear: async(key: string, provider?: string) => {\n\n var prov = gorgonCore.providers[provider || settings.defaultProvider];\n\n // Clear a wildcard search of objects\n if (key && key.indexOf('*') > -1) {\n return prov.keys().then(function(keys) {\n var cacheMatchKeys = keys.filter(function(str) {\n return new RegExp('^' + key.split('*').join('.*') + '$').test(str);\n });\n\n var clearPromises = cacheMatchKeys.map(prov.clear);\n // Incase someone somehow used a wildcard in their cached key (don't do this)\n\n clearPromises.push(prov.clear(key));\n return Promise.all(clearPromises);\n });\n }\n\n // Not a special clear\n return prov.clear(key);\n\n },\n\n // Clear all keys/values in the cache\n clearAll: async(provider?: string) => {\n var prov = gorgonCore.providers[provider || settings.defaultProvider];\n\n return prov.clear();\n },\n\n // Allows you to instantly overwite a cache object\n overwrite: async(key:string, asyncFunc: asyncFunction, policy?: GorgonPolicyInput) => {\n\n try{\n const resolvedData = await asyncFunc();\n\n const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n return val;\n }catch (e) {\n throw e;\n }\n\n },\n\n // Allows you to get from the cache or pull from the promise\n get: async<R>(key:string, asyncFunc:() => R, policy?: GorgonPolicyInput):Promise<R> => {\n\n policy = policyMaker(policy);\n const prov = gorgonCore.providers[policy.provider];\n\n const currentVal = await prov.get(key); // Most providers will only lookup by key and return false on not found\n\n // If we have a current value sent it out; cache hit!\n if(currentVal !== undefined) {\n if(settings.debug) {console.info('[Gorgon] Cache hit for key: ' + key, currentVal);}\n return currentVal;\n }\n\n // Are we currently already running this cache item?\n if (hOP.call(currentTasks, key) && Array.isArray(currentTasks[key]) && currentTasks[key].length > 0) {\n // Add to the current task, but ignore if any items is below retry anyway threshold\n var oldQueue = false;\n\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].queued < new Date(Date.now() - settings.retry)) {\n oldQueue = true;\n }\n }\n\n // Add to the current queue\n if(!oldQueue) {\n if(settings.debug) {console.info('[Gorgon] Cache miss, in progress, adding to current queue for key: ' + key);}\n\n var concurent = new Promise(function(resolve: (value: R) => void, reject) {\n currentTasks[key].push({\n res: resolve,\n rej: reject,\n queued: new Date(),\n });\n });\n\n return concurent;\n }\n }else{\n // Add current task to list, this is the first one so the primary\n currentTasks[key] = [{queued: new Date()}];\n }\n\n try{\n if(settings.debug) {console.info('[Gorgon] Cache miss, resolving item for: ' + key);}\n\n // This is the primary item, lets resolve and push it out\n const resolvedData = await asyncFunc();\n\n if(settings.debug) {console.info('[Gorgon] Cache resolved, resolved item for: ' + key, resolvedData);}\n\n const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].res) {\n if(settings.debug) {console.info('[Gorgon] Cache queue resolved for: ' + key, resolvedData);}\n\n currentTasks[key][i].res(val);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n return val;\n\n }catch (e) {\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].rej) {\n currentTasks[key][i].rej(e);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n throw e;\n }\n\n },\n\n\n };\n\n gorgonCore.addProvider('memory', MemoryCache()); // Default provider, light weight and simple\n\n return gorgonCore;\n\n})();\n\nexport {MemoryCache};\nexport default Gorgon;\n"],"names":["MemoryCacheCreator","cache","hOP","memoryCache","key","value","policy","to","i","Gorgon","currentTasks","settings","policyMaker","incPolicy","outPolicy","d","gorgonCore","newSettings","name","provider","prov","keys","cacheMatchKeys","str","clearPromises","asyncFunc","resolvedData","e","currentVal","oldQueue","concurent","resolve","reject","val","MemoryCache"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(l,p){typeof exports=="object"&&typeof module<"u"?module.exports=p():typeof define=="function"&&define.amd?define(p):(l=typeof globalThis<"u"?globalThis:l||self,l.Gorgon=p())})(this,function(){"use strict";const l=()=>{const r={},c=r.hasOwnProperty,a={init:async()=>{},get:async n=>{if(c.call(r,n)&&r[n].val)return r[n].val},set:async(n,i,e)=>{await a.clear(n);var t=!1;return e&&e.expiry&&e.expiry>0&&(t=setTimeout(function(){a.clear(n)},e.expiry)),r[n]={policy:e,val:i,to:t},i},keys:async()=>Object.keys(r),clear:async n=>{if(!n){for(var i in r)a._clear(i);return!0}return a._clear(n)},_clear:n=>c.call(r,n)?(r[n].to&&clearTimeout(r[n].to),r[n]=null,delete r[n],!0):!1};return a};return(()=>{const r={},c=r.hasOwnProperty,a={debug:!1,defaultProvider:"memory",retry:5e3},n=function(e){const t={expiry:!1,provider:a.defaultProvider};if(!e)return t;if(e instanceof Date){var o=new Date;t.expiry=Math.ceil((e.getTime()-o.getTime())/1e3)}else typeof e=="object"&&e.expiry?(e.expiry instanceof Date?t.expiry=Math.ceil((e.expiry.getTime()-o.getTime())/1e3):t.expiry=e.expiry,t.provider=e.provider||t.provider):typeof e=="number"&&(t.expiry=e);return t.expiry=t.expiry>0?t.expiry:!1,t},i={providers:{},settings:e=>(e&&Object.assign(a,e),a),addProvider:(e,t)=>{t.init(),i.providers[e]=t},put:async(e,t,o)=>{o=n(o);var f=i.providers[o.provider];return f.set(e,t,n(o))},clear:async(e,t)=>{var o=i.providers[t||a.defaultProvider];return e&&e.indexOf("*")>-1?o.keys().then(function(f){var d=f.filter(function(s){return new RegExp("^"+e.split("*").join(".*")+"$").test(s)}),v=d.map(o.clear);return v.push(o.clear(e)),Promise.all(v)}):o.clear(e)},overwrite:async(e,t,o)=>{try{const f=await t();return await i.put(e,f,n(o))}catch(f){throw f}},get:async(e,t,o)=>{o=n(o);const d=await i.providers[o.provider].get(e);if(d!==void 0)return a.debug&&console.info("[Gorgon] Cache hit for key: "+e,d),d;if(c.call(r,e)&&Array.isArray(r[e])&&r[e].length>0){var v=!1;for(var s in r[e])r[e][s].queued<new Date(Date.now()-a.retry)&&(v=!0);if(!v){a.debug&&console.info("[Gorgon] Cache miss, in progress, adding to current queue for key: "+e);var h=new Promise(function(u,g){r[e].push({res:u,rej:g,queued:new Date})});return h}}else r[e]=[{queued:new Date}];try{a.debug&&console.info("[Gorgon] Cache miss, resolving item for: "+e);const u=await t();a.debug&&console.info("[Gorgon] Cache resolved, resolved item for: "+e,u);let g=await i.put(e,u,n(o));if(c.call(r,e)){for(var s in r[e])r[e][s].res&&(a.debug&&console.info("[Gorgon] Cache queue resolved for: "+e,u),r[e][s].res(g));r[e]=[],delete r[e]}return g}catch(u){if(c.call(r,e)){for(var s in r[e])r[e][s].rej&&r[e][s].rej(u);r[e]=[],delete r[e]}throw u}}};return i.addProvider("memory",l()),i})()});
1
+ (function(d,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(d=typeof globalThis<"u"?globalThis:d||self,l(d.Gorgon={}))})(this,function(d){"use strict";const l=()=>{const r={},c=r.hasOwnProperty,a={init:async()=>{},get:async o=>{if(c.call(r,o)&&r[o].val)return r[o].val},set:async(o,i,e)=>{await a.clear(o);var t=!1;return e&&e.expiry&&e.expiry>0&&(t=setTimeout(function(){a.clear(o)},e.expiry)),r[o]={policy:e,val:i,to:t},i},keys:async()=>Object.keys(r),clear:async o=>{if(!o){for(var i in r)a._clear(i);return!0}return a._clear(o)},_clear:o=>c.call(r,o)?(r[o].to&&clearTimeout(r[o].to),r[o]=null,delete r[o],!0):!1};return a},h=(()=>{const r={},c=r.hasOwnProperty,a={debug:!1,defaultProvider:"memory",retry:5e3},o=function(e){const t={expiry:!1,provider:a.defaultProvider};if(!e)return t;if(e instanceof Date){var n=new Date;t.expiry=Math.ceil((e.getTime()-n.getTime())/1e3)}else typeof e=="object"&&e.expiry?(e.expiry instanceof Date?t.expiry=Math.ceil((e.expiry.getTime()-n.getTime())/1e3):t.expiry=e.expiry,t.provider=e.provider||t.provider):typeof e=="object"?t.provider=e.provider||t.provider:typeof e=="number"&&(t.expiry=e);return t.expiry=t.expiry&&t.expiry>0?t.expiry:!1,t},i={providers:{},settings:e=>(e&&Object.assign(a,e),a),addProvider:(e,t)=>{t.init(),i.providers[e]=t},put:async(e,t,n)=>{n=o(n);var u=i.providers[n.provider];return u.set(e,t,o(n))},clear:async(e,t)=>{var n=i.providers[t||a.defaultProvider];return e&&e.indexOf("*")>-1?n.keys().then(function(u){var v=u.filter(function(s){return new RegExp("^"+e.split("*").join(".*")+"$").test(s)}),p=v.map(n.clear);return p.push(n.clear(e)),Promise.all(p)}):n.clear(e)},clearAll:async e=>{var t=i.providers[e||a.defaultProvider];return t.clear()},overwrite:async(e,t,n)=>{try{const u=await t();return await i.put(e,u,o(n))}catch(u){throw u}},get:async(e,t,n)=>{n=o(n);const v=await i.providers[n.provider].get(e);if(v!==void 0)return a.debug&&console.info("[Gorgon] Cache hit for key: "+e,v),v;if(c.call(r,e)&&Array.isArray(r[e])&&r[e].length>0){var p=!1;for(var s in r[e])r[e][s].queued<new Date(Date.now()-a.retry)&&(p=!0);if(!p){a.debug&&console.info("[Gorgon] Cache miss, in progress, adding to current queue for key: "+e);var m=new Promise(function(f,g){r[e].push({res:f,rej:g,queued:new Date})});return m}}else r[e]=[{queued:new Date}];try{a.debug&&console.info("[Gorgon] Cache miss, resolving item for: "+e);const f=await t();a.debug&&console.info("[Gorgon] Cache resolved, resolved item for: "+e,f);const g=await i.put(e,f,o(n));if(c.call(r,e)){for(var s in r[e])r[e][s].res&&(a.debug&&console.info("[Gorgon] Cache queue resolved for: "+e,f),r[e][s].res(g));r[e]=[],delete r[e]}return g}catch(f){if(c.call(r,e)){for(var s in r[e])r[e][s].rej&&r[e][s].rej(f);r[e]=[],delete r[e]}throw f}}};return i.addProvider("memory",l()),i})();d.MemoryCache=l,d.default=h,Object.defineProperties(d,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../provider/memory.ts","../index.ts"],"sourcesContent":["import { IGorgonCacheProvider, GorgonPolicySanitized } from \"../index\";\n\ninterface IGorgonMemoryCacheProvider extends IGorgonCacheProvider {\n _clear: (key:string) => boolean;\n}\n\n// Created as a function to allow for multiple instances of the memory cache, if needed\nconst MemoryCacheCreator = () =>{\n\n const cache = {};\n const hOP = cache.hasOwnProperty;\n\n// Memory cache is about the simplist cache possible, use it as an example\n const memoryCache = {\n\n init: async() => {\n // This should be used to update the cache on boot,\n // memory cache will be blank on boot by default\n return;\n },\n\n get: async (key:string) => {\n\n if (hOP.call(cache, key) && cache[key].val) {\n // The cached item exists, return it\n return cache[key].val;\n } else {\n // The cached item does not exist reject\n return undefined;\n }\n\n },\n\n set: async(key:string, value:any, policy: GorgonPolicySanitized) => {\n\n // Clear in case it exists\n await memoryCache.clear(key);\n\n // Set a timemout to self-remove from the cache if in policy\n var to = false as boolean | number;\n\n if (policy && policy.expiry && policy.expiry > 0) {\n to = setTimeout(function() {\n memoryCache.clear(key);\n }, policy.expiry);\n }\n\n // Store the cached item\n cache[key] = {\n policy: policy,\n val: value,\n to: to,\n };\n\n return value;\n\n },\n\n keys: async() => {\n return Object.keys(cache);\n },\n\n clear: async (key?:string) => {\n\n // Clears a single key or complete clear on empty\n // Clear all items in the cache\n if (!key) {\n for (var i in cache) {\n memoryCache._clear(i);\n }\n return true;\n }\n\n return memoryCache._clear(key);\n },\n\n _clear: (key:string) => {\n // Clear a single item, making sure to remove the extra timeout\n if (hOP.call(cache, key)) {\n if (cache[key].to) {\n clearTimeout(cache[key].to);\n }\n\n cache[key] = null;\n delete cache[key];\n return true;\n }\n\n return false;\n },\n\n } as IGorgonMemoryCacheProvider;\n\n return memoryCache;\n\n}\n\nexport default MemoryCacheCreator;\n","import MemoryCache from './provider/memory';\n\nexport type asyncFunction = () => Promise<any> | (() => any);\nexport type GorgonSettings = {\n debug: boolean;\n defaultProvider: string;\n retry: number;\n}\nexport type GorgonSettingsInput = {\n debug?: boolean;\n defaultProvider?: string;\n retry?: number;\n}\nexport type GorgonPolicy = {\n expiry: number | Date | false;\n provider: string;\n};\nexport type GorgonPolicyInput = GorgonPolicy | number | Date;\nexport type GorgonPolicySanitized = {\n expiry: number | false;\n provider: string;\n};\ntype GorgonCurrentTaskItem = Array<{\n res?: any;\n rej?: any;\n queued: Date;\n}>;\nexport interface IGorgonCacheProvider {\n init: () => Promise<void>;\n get: (key: string) => Promise<any>;\n set: <R>(key: string, value: R, policy: GorgonPolicySanitized) => Promise<R>;\n clear: (key?: string) => Promise<boolean>;\n keys: () => Promise<string[]>;\n}\n\nconst Gorgon = (() => {\n\n const currentTasks = {} as {[key: string]: GorgonCurrentTaskItem};\n const hOP = currentTasks.hasOwnProperty;\n\n const settings = {\n debug: false,\n defaultProvider: 'memory',\n retry: 5000,\n } as GorgonSettings;\n\n const policyMaker = function(incPolicy?: GorgonPolicyInput) {\n const outPolicy = {\n expiry: false,\n provider: settings.defaultProvider,\n } as GorgonPolicySanitized;\n\n // Blank policy, false, or no policy. lets store forever\n if (!incPolicy) {\n return outPolicy;\n }\n\n // Type is a full policy object\n if(incPolicy instanceof Date){\n var d = new Date();\n outPolicy.expiry = Math.ceil((incPolicy.getTime() - d.getTime()) / 1000);\n }else if (typeof incPolicy === 'object' && incPolicy.expiry) {\n if(incPolicy.expiry instanceof Date){\n outPolicy.expiry = Math.ceil((incPolicy.expiry.getTime() - d.getTime()) / 1000);\n }else{\n outPolicy.expiry = incPolicy.expiry;\n }\n outPolicy.provider = incPolicy.provider || outPolicy.provider;\n } else if(typeof incPolicy === 'number'){\n outPolicy.expiry = incPolicy;\n }\n\n // Number is too small, negative or not a number\n outPolicy.expiry = outPolicy.expiry > 0 ? outPolicy.expiry : false;\n\n return outPolicy;\n };\n\n const gorgonCore = {\n\n // Providers available for use\n providers: {} as {[key: string]: IGorgonCacheProvider},\n\n // Allows for settings on the gorgon cache\n settings: (newSettings?: GorgonSettingsInput) => {\n if (!newSettings) {\n return settings;\n }\n\n Object.assign(settings, newSettings); // only overwrite ones sent in; keep others at existing\n\n return settings;\n },\n\n // Add a provider\n addProvider: (name: string, provider:IGorgonCacheProvider) => {\n provider.init(); // Trigger for provider to clear any old cache items or any other cleanup\n gorgonCore.providers[name] = provider;\n },\n\n // Place an item into the cache\n put: async<R>(key:string, value:R, policy?: GorgonPolicyInput):Promise<R> => {\n policy = policyMaker(policy);\n var prov = gorgonCore.providers[policy.provider];\n\n return prov.set(key, value, policyMaker(policy));\n },\n\n // Clear one or all items in the cache\n clear: async(key: string, provider?: string) => {\n\n var prov = gorgonCore.providers[provider || settings.defaultProvider];\n\n // Clear a wildcard search of objects\n if (key && key.indexOf('*') > -1) {\n return prov.keys().then(function(keys) {\n var cacheMatchKeys = keys.filter(function(str) {\n return new RegExp('^' + key.split('*').join('.*') + '$').test(str);\n });\n\n var clearPromises = cacheMatchKeys.map(prov.clear);\n // Incase someone somehow used a wildcard in their cached key (don't do this)\n\n clearPromises.push(prov.clear(key));\n return Promise.all(clearPromises);\n });\n }\n\n // Not a special clear\n return prov.clear(key);\n\n },\n\n // Allows you to instantly overwite a cache object\n overwrite: async(key:string, asyncFunc: asyncFunction, policy?: GorgonPolicyInput) => {\n\n try{\n const resolvedData = await asyncFunc();\n\n const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n return val;\n }catch (e) {\n throw e;\n }\n\n },\n\n // Allows you to get from the cache or pull from the promise\n get: async<R>(key:string, asyncFunc:() => R, policy?: GorgonPolicyInput):Promise<R> => {\n\n policy = policyMaker(policy);\n const prov = gorgonCore.providers[policy.provider];\n\n const currentVal = await prov.get(key); // Most providers will only lookup by key and return false on not found\n\n // If we have a current value sent it out; cache hit!\n if(currentVal !== undefined) {\n if(settings.debug) console.info('[Gorgon] Cache hit for key: ' + key, currentVal);\n return currentVal;\n }\n\n // Are we currently already running this cache item?\n if (hOP.call(currentTasks, key) && Array.isArray(currentTasks[key]) && currentTasks[key].length > 0) {\n // Add to the current task, but ignore if any items is below retry anyway threshold\n var oldQueue = false;\n\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].queued < new Date(Date.now() - settings.retry)) {\n oldQueue = true;\n }\n }\n\n // Add to the current queue\n if(!oldQueue) {\n if(settings.debug) console.info('[Gorgon] Cache miss, in progress, adding to current queue for key: ' + key);\n\n var concurent = new Promise(function(resolve: (value: R) => void, reject) {\n currentTasks[key].push({\n res: resolve,\n rej: reject,\n queued: new Date(),\n });\n });\n\n return concurent;\n }\n }else{\n // Add current task to list, this is the first one so the primary\n currentTasks[key] = [{queued: new Date()}];\n }\n\n try{\n if(settings.debug) console.info('[Gorgon] Cache miss, resolving item for: ' + key);\n\n // This is the primary item, lets resolve and push it out\n const resolvedData = await asyncFunc();\n\n if(settings.debug) console.info('[Gorgon] Cache resolved, resolved item for: ' + key, resolvedData);\n\n let val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].res) {\n if(settings.debug) console.info('[Gorgon] Cache queue resolved for: ' + key, resolvedData);\n\n currentTasks[key][i].res(val);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n return val;\n\n }catch (e) {\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].rej) {\n currentTasks[key][i].rej(e);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n throw e;\n }\n\n },\n\n\n };\n\n gorgonCore.addProvider('memory', MemoryCache()); // Default provider, light weight and simple\n\n return gorgonCore;\n\n})();\n\nexport default Gorgon;\n"],"names":["MemoryCacheCreator","cache","hOP","memoryCache","key","value","policy","to","currentTasks","settings","policyMaker","incPolicy","outPolicy","d","gorgonCore","newSettings","name","provider","prov","keys","cacheMatchKeys","str","clearPromises","asyncFunc","resolvedData","e","currentVal","oldQueue","i","concurent","resolve","reject","val","MemoryCache"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../provider/memory.ts","../index.ts"],"sourcesContent":["import {IGorgonCacheProvider, GorgonPolicySanitized} from '../index';\n\ninterface IGorgonMemoryCacheProvider extends IGorgonCacheProvider {\n _clear: (key:string) => boolean;\n}\n\n// Created as a function to allow for multiple instances of the memory cache, if needed\nconst MemoryCacheCreator = ():IGorgonMemoryCacheProvider =>{\n\n const cache = {};\n const hOP = cache.hasOwnProperty;\n\n// Memory cache is about the simplist cache possible, use it as an example\n const memoryCache = {\n\n init: async() => {\n // This should be used to update the cache on boot,\n // memory cache will be blank on boot by default\n return;\n },\n\n get: async(key:string) => {\n\n if (hOP.call(cache, key) && cache[key].val) {\n // The cached item exists, return it\n return cache[key].val;\n } else {\n // The cached item does not exist reject\n return undefined;\n }\n\n },\n\n set: async(key:string, value:any, policy: GorgonPolicySanitized) => {\n\n // Clear in case it exists\n await memoryCache.clear(key);\n\n // Set a timemout to self-remove from the cache if in policy\n var to = false as boolean | number;\n\n if (policy && policy.expiry && policy.expiry > 0) {\n to = setTimeout(function() {\n memoryCache.clear(key);\n }, policy.expiry);\n }\n\n // Store the cached item\n cache[key] = {\n policy: policy,\n val: value,\n to: to,\n };\n\n return value;\n\n },\n\n keys: async() => {\n return Object.keys(cache);\n },\n\n clear: async(key?:string) => {\n\n // Clears a single key or complete clear on empty\n // Clear all items in the cache\n if (!key) {\n for (var i in cache) {\n memoryCache._clear(i);\n }\n return true;\n }\n\n return memoryCache._clear(key);\n },\n\n _clear: (key:string) => {\n // Clear a single item, making sure to remove the extra timeout\n if (hOP.call(cache, key)) {\n if (cache[key].to) {\n clearTimeout(cache[key].to);\n }\n\n cache[key] = null;\n delete cache[key];\n return true;\n }\n\n return false;\n },\n\n };\n\n return memoryCache;\n\n}\n\nexport default MemoryCacheCreator;\n","import MemoryCache from './provider/memory';\n\nexport type asyncFunction = () => Promise<any> | (() => any);\nexport type GorgonSettings = {\n debug: boolean;\n defaultProvider: string;\n retry: number;\n}\nexport type GorgonSettingsInput = {\n debug?: boolean;\n defaultProvider?: string;\n retry?: number;\n}\nexport type GorgonPolicy = {\n expiry: number | Date | false;\n provider: string;\n};\nexport type GorgonPolicyInput = GorgonPolicy | number | Date;\nexport type GorgonPolicySanitized = {\n expiry: number | false;\n provider: string;\n};\ntype GorgonCurrentTaskItem = Array<{\n res?: any;\n rej?: any;\n queued: Date;\n}>;\nexport interface IGorgonCacheProvider {\n init: () => Promise<void>;\n get: (key: string) => Promise<any>;\n set: <R>(key: string, value: R, policy: GorgonPolicySanitized) => Promise<R>;\n clear: (key?: string) => Promise<boolean>;\n keys: () => Promise<string[]>;\n}\n\nconst Gorgon = (() => {\n\n const currentTasks = {} as {[key: string]: GorgonCurrentTaskItem};\n const hOP = currentTasks.hasOwnProperty;\n\n const settings = {\n debug: false,\n defaultProvider: 'memory',\n retry: 5000,\n } as GorgonSettings;\n\n const policyMaker = function(incPolicy?: GorgonPolicyInput) {\n const outPolicy = {\n expiry: false,\n provider: settings.defaultProvider,\n } as GorgonPolicySanitized;\n\n // Blank policy, false, or no policy. lets store forever\n if (!incPolicy) {\n return outPolicy;\n }\n\n // Type is a full policy object\n if(incPolicy instanceof Date) {\n var d = new Date();\n\n outPolicy.expiry = Math.ceil((incPolicy.getTime() - d.getTime()) / 1000);\n }else if (typeof incPolicy === 'object' && incPolicy.expiry) {\n if(incPolicy.expiry instanceof Date) {\n outPolicy.expiry = Math.ceil((incPolicy.expiry.getTime() - d.getTime()) / 1000);\n }else{\n outPolicy.expiry = incPolicy.expiry;\n }\n outPolicy.provider = incPolicy.provider || outPolicy.provider;\n } else if(typeof incPolicy === 'object') {\n outPolicy.provider = incPolicy.provider || outPolicy.provider;\n } else if(typeof incPolicy === 'number') {\n outPolicy.expiry = incPolicy;\n }\n\n // Number is too small, negative or not a number\n outPolicy.expiry = outPolicy.expiry && outPolicy.expiry > 0 ? outPolicy.expiry : false;\n\n return outPolicy;\n };\n\n const gorgonCore = {\n\n // Providers available for use\n providers: {} as {[key: string]: IGorgonCacheProvider},\n\n // Allows for settings on the gorgon cache\n settings: (newSettings?: GorgonSettingsInput) => {\n if (!newSettings) {\n return settings;\n }\n\n Object.assign(settings, newSettings); // only overwrite ones sent in; keep others at existing\n\n return settings;\n },\n\n // Add a provider\n addProvider: (name: string, provider:IGorgonCacheProvider) => {\n provider.init(); // Trigger for provider to clear any old cache items or any other cleanup\n gorgonCore.providers[name] = provider;\n },\n\n // Place an item into the cache\n put: async<R>(key:string, value:R, policy?: GorgonPolicyInput):Promise<R> => {\n policy = policyMaker(policy);\n var prov = gorgonCore.providers[policy.provider];\n\n return prov.set(key, value, policyMaker(policy));\n },\n\n // Clear one or all items in the cache\n clear: async(key: string, provider?: string) => {\n\n var prov = gorgonCore.providers[provider || settings.defaultProvider];\n\n // Clear a wildcard search of objects\n if (key && key.indexOf('*') > -1) {\n return prov.keys().then(function(keys) {\n var cacheMatchKeys = keys.filter(function(str) {\n return new RegExp('^' + key.split('*').join('.*') + '$').test(str);\n });\n\n var clearPromises = cacheMatchKeys.map(prov.clear);\n // Incase someone somehow used a wildcard in their cached key (don't do this)\n\n clearPromises.push(prov.clear(key));\n return Promise.all(clearPromises);\n });\n }\n\n // Not a special clear\n return prov.clear(key);\n\n },\n\n // Clear all keys/values in the cache\n clearAll: async(provider?: string) => {\n var prov = gorgonCore.providers[provider || settings.defaultProvider];\n\n return prov.clear();\n },\n\n // Allows you to instantly overwite a cache object\n overwrite: async(key:string, asyncFunc: asyncFunction, policy?: GorgonPolicyInput) => {\n\n try{\n const resolvedData = await asyncFunc();\n\n const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n return val;\n }catch (e) {\n throw e;\n }\n\n },\n\n // Allows you to get from the cache or pull from the promise\n get: async<R>(key:string, asyncFunc:() => R, policy?: GorgonPolicyInput):Promise<R> => {\n\n policy = policyMaker(policy);\n const prov = gorgonCore.providers[policy.provider];\n\n const currentVal = await prov.get(key); // Most providers will only lookup by key and return false on not found\n\n // If we have a current value sent it out; cache hit!\n if(currentVal !== undefined) {\n if(settings.debug) {console.info('[Gorgon] Cache hit for key: ' + key, currentVal);}\n return currentVal;\n }\n\n // Are we currently already running this cache item?\n if (hOP.call(currentTasks, key) && Array.isArray(currentTasks[key]) && currentTasks[key].length > 0) {\n // Add to the current task, but ignore if any items is below retry anyway threshold\n var oldQueue = false;\n\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].queued < new Date(Date.now() - settings.retry)) {\n oldQueue = true;\n }\n }\n\n // Add to the current queue\n if(!oldQueue) {\n if(settings.debug) {console.info('[Gorgon] Cache miss, in progress, adding to current queue for key: ' + key);}\n\n var concurent = new Promise(function(resolve: (value: R) => void, reject) {\n currentTasks[key].push({\n res: resolve,\n rej: reject,\n queued: new Date(),\n });\n });\n\n return concurent;\n }\n }else{\n // Add current task to list, this is the first one so the primary\n currentTasks[key] = [{queued: new Date()}];\n }\n\n try{\n if(settings.debug) {console.info('[Gorgon] Cache miss, resolving item for: ' + key);}\n\n // This is the primary item, lets resolve and push it out\n const resolvedData = await asyncFunc();\n\n if(settings.debug) {console.info('[Gorgon] Cache resolved, resolved item for: ' + key, resolvedData);}\n\n const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));\n\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].res) {\n if(settings.debug) {console.info('[Gorgon] Cache queue resolved for: ' + key, resolvedData);}\n\n currentTasks[key][i].res(val);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n return val;\n\n }catch (e) {\n if (hOP.call(currentTasks, key)) {\n for (var i in currentTasks[key]) {\n if(currentTasks[key][i].rej) {\n currentTasks[key][i].rej(e);\n }\n }\n\n currentTasks[key] = [];\n delete currentTasks[key];\n }\n\n throw e;\n }\n\n },\n\n\n };\n\n gorgonCore.addProvider('memory', MemoryCache()); // Default provider, light weight and simple\n\n return gorgonCore;\n\n})();\n\nexport {MemoryCache};\nexport default Gorgon;\n"],"names":["MemoryCacheCreator","cache","hOP","memoryCache","key","value","policy","to","Gorgon","currentTasks","settings","policyMaker","incPolicy","outPolicy","d","gorgonCore","newSettings","name","provider","prov","keys","cacheMatchKeys","str","clearPromises","asyncFunc","resolvedData","e","currentVal","oldQueue","i","concurent","resolve","reject","val","MemoryCache"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { IGorgonCacheProvider } from "../index";
1
+ import { IGorgonCacheProvider } from '../index';
2
2
  interface IGorgonMemoryCacheProvider extends IGorgonCacheProvider {
3
3
  _clear: (key: string) => boolean;
4
4
  }
package/index.ts CHANGED
@@ -56,22 +56,25 @@ const Gorgon = (() => {
56
56
  }
57
57
 
58
58
  // Type is a full policy object
59
- if(incPolicy instanceof Date){
59
+ if(incPolicy instanceof Date) {
60
60
  var d = new Date();
61
+
61
62
  outPolicy.expiry = Math.ceil((incPolicy.getTime() - d.getTime()) / 1000);
62
63
  }else if (typeof incPolicy === 'object' && incPolicy.expiry) {
63
- if(incPolicy.expiry instanceof Date){
64
+ if(incPolicy.expiry instanceof Date) {
64
65
  outPolicy.expiry = Math.ceil((incPolicy.expiry.getTime() - d.getTime()) / 1000);
65
66
  }else{
66
67
  outPolicy.expiry = incPolicy.expiry;
67
68
  }
68
69
  outPolicy.provider = incPolicy.provider || outPolicy.provider;
69
- } else if(typeof incPolicy === 'number'){
70
+ } else if(typeof incPolicy === 'object') {
71
+ outPolicy.provider = incPolicy.provider || outPolicy.provider;
72
+ } else if(typeof incPolicy === 'number') {
70
73
  outPolicy.expiry = incPolicy;
71
74
  }
72
75
 
73
76
  // Number is too small, negative or not a number
74
- outPolicy.expiry = outPolicy.expiry > 0 ? outPolicy.expiry : false;
77
+ outPolicy.expiry = outPolicy.expiry && outPolicy.expiry > 0 ? outPolicy.expiry : false;
75
78
 
76
79
  return outPolicy;
77
80
  };
@@ -131,6 +134,13 @@ const Gorgon = (() => {
131
134
 
132
135
  },
133
136
 
137
+ // Clear all keys/values in the cache
138
+ clearAll: async(provider?: string) => {
139
+ var prov = gorgonCore.providers[provider || settings.defaultProvider];
140
+
141
+ return prov.clear();
142
+ },
143
+
134
144
  // Allows you to instantly overwite a cache object
135
145
  overwrite: async(key:string, asyncFunc: asyncFunction, policy?: GorgonPolicyInput) => {
136
146
 
@@ -156,7 +166,7 @@ const Gorgon = (() => {
156
166
 
157
167
  // If we have a current value sent it out; cache hit!
158
168
  if(currentVal !== undefined) {
159
- if(settings.debug) console.info('[Gorgon] Cache hit for key: ' + key, currentVal);
169
+ if(settings.debug) {console.info('[Gorgon] Cache hit for key: ' + key, currentVal);}
160
170
  return currentVal;
161
171
  }
162
172
 
@@ -173,7 +183,7 @@ const Gorgon = (() => {
173
183
 
174
184
  // Add to the current queue
175
185
  if(!oldQueue) {
176
- if(settings.debug) console.info('[Gorgon] Cache miss, in progress, adding to current queue for key: ' + key);
186
+ if(settings.debug) {console.info('[Gorgon] Cache miss, in progress, adding to current queue for key: ' + key);}
177
187
 
178
188
  var concurent = new Promise(function(resolve: (value: R) => void, reject) {
179
189
  currentTasks[key].push({
@@ -191,19 +201,19 @@ const Gorgon = (() => {
191
201
  }
192
202
 
193
203
  try{
194
- if(settings.debug) console.info('[Gorgon] Cache miss, resolving item for: ' + key);
204
+ if(settings.debug) {console.info('[Gorgon] Cache miss, resolving item for: ' + key);}
195
205
 
196
206
  // This is the primary item, lets resolve and push it out
197
207
  const resolvedData = await asyncFunc();
198
208
 
199
- if(settings.debug) console.info('[Gorgon] Cache resolved, resolved item for: ' + key, resolvedData);
209
+ if(settings.debug) {console.info('[Gorgon] Cache resolved, resolved item for: ' + key, resolvedData);}
200
210
 
201
- let val = await gorgonCore.put(key, resolvedData, policyMaker(policy));
211
+ const val = await gorgonCore.put(key, resolvedData, policyMaker(policy));
202
212
 
203
213
  if (hOP.call(currentTasks, key)) {
204
214
  for (var i in currentTasks[key]) {
205
215
  if(currentTasks[key][i].res) {
206
- if(settings.debug) console.info('[Gorgon] Cache queue resolved for: ' + key, resolvedData);
216
+ if(settings.debug) {console.info('[Gorgon] Cache queue resolved for: ' + key, resolvedData);}
207
217
 
208
218
  currentTasks[key][i].res(val);
209
219
  }
@@ -241,4 +251,5 @@ const Gorgon = (() => {
241
251
 
242
252
  })();
243
253
 
254
+ export {MemoryCache};
244
255
  export default Gorgon;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gorgonjs/gorgon",
3
- "version": "1.3.1",
3
+ "version": "1.4.1",
4
4
  "description": "A simple caching library for async functions",
5
5
  "homepage": "https://gorgonjs.dev",
6
6
  "main": "./dist/index.umd.js",
@@ -16,7 +16,8 @@
16
16
  "test": "vitest",
17
17
  "coverage": "vitest run --coverage",
18
18
  "build": "vite build",
19
- "prepublish": "vite build"
19
+ "prepublish": "vite build",
20
+ "tscheck": "tsc --noEmit"
20
21
  },
21
22
  "repository": {
22
23
  "type": "git",
@@ -34,13 +35,15 @@
34
35
  "url": "https://github.com/mikevalstar/gorgon/issues"
35
36
  },
36
37
  "devDependencies": {
38
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
39
+ "@typescript-eslint/parser": "^6.0.0",
37
40
  "@vitest/coverage-c8": "^0.25.0",
38
- "eslint": "^8.11.0",
41
+ "eslint": "^8.45.0",
39
42
  "jest": "^27.5.1",
40
- "typescript": "^4.8.4",
41
- "vite": "^3.2.3",
42
- "vite-plugin-dts": "^1.7.0",
43
- "vitest": "^0.25.0"
43
+ "typescript": "^5.1.6",
44
+ "vite": "^4.4.4",
45
+ "vite-plugin-dts": "^3.3.0",
46
+ "vitest": "^0.33.0"
44
47
  },
45
48
  "jest": {
46
49
  "collectCoverage": true,
@@ -1,11 +1,11 @@
1
- import { IGorgonCacheProvider, GorgonPolicySanitized } from "../index";
1
+ import {IGorgonCacheProvider, GorgonPolicySanitized} from '../index';
2
2
 
3
3
  interface IGorgonMemoryCacheProvider extends IGorgonCacheProvider {
4
4
  _clear: (key:string) => boolean;
5
5
  }
6
6
 
7
7
  // Created as a function to allow for multiple instances of the memory cache, if needed
8
- const MemoryCacheCreator = () =>{
8
+ const MemoryCacheCreator = ():IGorgonMemoryCacheProvider =>{
9
9
 
10
10
  const cache = {};
11
11
  const hOP = cache.hasOwnProperty;
@@ -19,7 +19,7 @@ const MemoryCacheCreator = () =>{
19
19
  return;
20
20
  },
21
21
 
22
- get: async (key:string) => {
22
+ get: async(key:string) => {
23
23
 
24
24
  if (hOP.call(cache, key) && cache[key].val) {
25
25
  // The cached item exists, return it
@@ -60,7 +60,7 @@ const MemoryCacheCreator = () =>{
60
60
  return Object.keys(cache);
61
61
  },
62
62
 
63
- clear: async (key?:string) => {
63
+ clear: async(key?:string) => {
64
64
 
65
65
  // Clears a single key or complete clear on empty
66
66
  // Clear all items in the cache
@@ -89,7 +89,7 @@ const MemoryCacheCreator = () =>{
89
89
  return false;
90
90
  },
91
91
 
92
- } as IGorgonMemoryCacheProvider;
92
+ };
93
93
 
94
94
  return memoryCache;
95
95