@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 +3 -1
- package/CHANGELOG.md +7 -0
- package/README.md +3 -3
- package/__tests__/clearmany.test.ts +35 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.es.js +53 -40
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/provider/memory.d.ts +1 -1
- package/index.ts +21 -10
- package/package.json +10 -7
- package/provider/memory.ts +5 -5
- package/pnpm-lock.yaml +0 -3847
package/.eslintrc
CHANGED
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
|
-

|
|
3
|
+

|
|
4
|
+

|
|
5
5
|

|
|
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
|
-
|
|
2
|
-
export
|
|
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
|
|
8
|
+
export type GorgonSettingsInput = {
|
|
8
9
|
debug?: boolean;
|
|
9
10
|
defaultProvider?: string;
|
|
10
11
|
retry?: number;
|
|
11
12
|
};
|
|
12
|
-
export
|
|
13
|
+
export type GorgonPolicy = {
|
|
13
14
|
expiry: number | Date | false;
|
|
14
15
|
provider: string;
|
|
15
16
|
};
|
|
16
|
-
export
|
|
17
|
-
export
|
|
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,
|
|
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
|
|
10
|
+
await n.clear(a);
|
|
11
11
|
var t = !1;
|
|
12
12
|
return r && r.expiry && r.expiry > 0 && (t = setTimeout(function() {
|
|
13
|
-
|
|
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
|
-
|
|
24
|
+
n._clear(s);
|
|
25
25
|
return !0;
|
|
26
26
|
}
|
|
27
|
-
return
|
|
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
|
|
31
|
+
return n;
|
|
32
32
|
}, h = (() => {
|
|
33
|
-
const e = {}, c = e.hasOwnProperty,
|
|
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:
|
|
40
|
+
provider: n.defaultProvider
|
|
41
41
|
};
|
|
42
42
|
if (!r)
|
|
43
43
|
return t;
|
|
44
44
|
if (r instanceof Date) {
|
|
45
|
-
var
|
|
46
|
-
t.expiry = Math.ceil((r.getTime() -
|
|
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() -
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
63
|
-
return r && r.indexOf("*") > -1 ?
|
|
64
|
-
var
|
|
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
|
-
}),
|
|
67
|
-
return
|
|
68
|
-
}) :
|
|
71
|
+
}), l = v.map(o.clear);
|
|
72
|
+
return l.push(o.clear(r)), Promise.all(l);
|
|
73
|
+
}) : o.clear(r);
|
|
69
74
|
},
|
|
70
|
-
|
|
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(
|
|
84
|
+
return await s.put(r, u, a(o));
|
|
74
85
|
} catch (u) {
|
|
75
86
|
throw u;
|
|
76
87
|
}
|
|
77
88
|
},
|
|
78
|
-
get
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
|
96
|
+
var l = !1;
|
|
85
97
|
for (var i in e[r])
|
|
86
|
-
e[r][i].queued < new Date(Date.now() -
|
|
87
|
-
if (!
|
|
88
|
-
|
|
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
|
-
|
|
113
|
+
n.debug && console.info("[Gorgon] Cache miss, resolving item for: " + r);
|
|
102
114
|
const f = await t();
|
|
103
|
-
|
|
104
|
-
|
|
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 && (
|
|
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
|
package/dist/index.es.js.map
CHANGED
|
@@ -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
|
|
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
|
package/dist/index.umd.js.map
CHANGED
|
@@ -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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"}
|
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 === '
|
|
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
|
-
|
|
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
|
+
"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.
|
|
41
|
+
"eslint": "^8.45.0",
|
|
39
42
|
"jest": "^27.5.1",
|
|
40
|
-
"typescript": "^
|
|
41
|
-
"vite": "^
|
|
42
|
-
"vite-plugin-dts": "^
|
|
43
|
-
"vitest": "^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,
|
package/provider/memory.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
|
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
|
-
}
|
|
92
|
+
};
|
|
93
93
|
|
|
94
94
|
return memoryCache;
|
|
95
95
|
|