@actdim/utico 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/README.md +1 -0
- package/dist/array.d.ts +2 -0
- package/dist/array.d.ts.map +1 -0
- package/dist/array.es.js +7 -0
- package/dist/array.es.js.map +1 -0
- package/dist/arrayExtensions.d.ts +27 -0
- package/dist/arrayExtensions.d.ts.map +1 -0
- package/dist/arrayExtensions.es.js +67 -0
- package/dist/arrayExtensions.es.js.map +1 -0
- package/dist/cache/cacheDb.d.ts +30 -0
- package/dist/cache/cacheDb.d.ts.map +1 -0
- package/dist/cache/cacheDb.es.js +50 -0
- package/dist/cache/cacheDb.es.js.map +1 -0
- package/dist/cache/memoryCache.d.ts +33 -0
- package/dist/cache/memoryCache.d.ts.map +1 -0
- package/dist/cache/memoryCache.es.js +54 -0
- package/dist/cache/memoryCache.es.js.map +1 -0
- package/dist/cache/persistentCache.d.ts +50 -0
- package/dist/cache/persistentCache.d.ts.map +1 -0
- package/dist/cache/persistentCache.es.js +156 -0
- package/dist/cache/persistentCache.es.js.map +1 -0
- package/dist/dataFormats.d.ts +5 -0
- package/dist/dataFormats.d.ts.map +1 -0
- package/dist/dataFormats.es.js +8 -0
- package/dist/dataFormats.es.js.map +1 -0
- package/dist/dateTimeDataFormat.d.ts +26 -0
- package/dist/dateTimeDataFormat.d.ts.map +1 -0
- package/dist/dateTimeDataFormat.es.js +97 -0
- package/dist/dateTimeDataFormat.es.js.map +1 -0
- package/dist/gfx/canvasUtils.d.ts +20 -0
- package/dist/gfx/canvasUtils.d.ts.map +1 -0
- package/dist/gfx/canvasUtils.es.js +150 -0
- package/dist/gfx/canvasUtils.es.js.map +1 -0
- package/dist/gfx/color.d.ts +16 -0
- package/dist/gfx/color.d.ts.map +1 -0
- package/dist/gfx/color.es.js +92 -0
- package/dist/gfx/color.es.js.map +1 -0
- package/dist/i18n/cultures.d.ts +60 -0
- package/dist/i18n/cultures.d.ts.map +1 -0
- package/dist/i18n/cultures.es.js +10 -0
- package/dist/i18n/cultures.es.js.map +1 -0
- package/dist/i18n/enUsCulture.d.ts +30 -0
- package/dist/i18n/enUsCulture.d.ts.map +1 -0
- package/dist/i18n/enUsCulture.es.js +40 -0
- package/dist/i18n/enUsCulture.es.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +2 -0
- package/dist/index.es.js.map +1 -0
- package/dist/math.d.ts +2 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.es.js +13 -0
- package/dist/math.es.js.map +1 -0
- package/dist/metadata.d.ts +7 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.es.js +29 -0
- package/dist/metadata.es.js.map +1 -0
- package/dist/mutex.d.ts +8 -0
- package/dist/mutex.d.ts.map +1 -0
- package/dist/mutex.es.js +27 -0
- package/dist/mutex.es.js.map +1 -0
- package/dist/patterns.d.ts +2 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.es.js +6 -0
- package/dist/patterns.es.js.map +1 -0
- package/dist/storage/persistentStorage.d.ts +11 -0
- package/dist/storage/persistentStorage.d.ts.map +1 -0
- package/dist/storage/persistentStorage.es.js +28 -0
- package/dist/storage/persistentStorage.es.js.map +1 -0
- package/dist/storage/storageContracts.d.ts +6 -0
- package/dist/storage/storageContracts.d.ts.map +1 -0
- package/dist/storage/storageContracts.es.js +2 -0
- package/dist/storage/storageContracts.es.js.map +1 -0
- package/dist/stringCore.d.ts +9 -0
- package/dist/stringCore.d.ts.map +1 -0
- package/dist/stringCore.es.js +35 -0
- package/dist/stringCore.es.js.map +1 -0
- package/dist/structEvent.d.ts +15 -0
- package/dist/structEvent.d.ts.map +1 -0
- package/dist/structEvent.es.js +34 -0
- package/dist/structEvent.es.js.map +1 -0
- package/dist/typeCore.d.ts +84 -0
- package/dist/typeCore.d.ts.map +1 -0
- package/dist/typeCore.es.js +7 -0
- package/dist/typeCore.es.js.map +1 -0
- package/dist/typeUtils.d.ts +42 -0
- package/dist/typeUtils.d.ts.map +1 -0
- package/dist/typeUtils.es.js +227 -0
- package/dist/typeUtils.es.js.map +1 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.es.js +71 -0
- package/dist/utils.es.js.map +1 -0
- package/dist/watchable.d.ts +13 -0
- package/dist/watchable.d.ts.map +1 -0
- package/dist/watchable.es.js +38 -0
- package/dist/watchable.es.js.map +1 -0
- package/package.json +78 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Copyright (c) 2025 Pavel Borodaev
|
|
2
|
+
|
|
3
|
+
This software is publicly accessible but proprietary.
|
|
4
|
+
|
|
5
|
+
Permission is granted to use and reference this package for personal or internal purposes only.
|
|
6
|
+
You may not modify, redistribute, decompile, or create derivative works from this software, in whole or in part, without prior written permission from the author.
|
|
7
|
+
|
|
8
|
+
This software is provided "as is", without warranty of any kind.
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @actdim/utico
|
package/dist/array.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,SAAI,EAAE,QAAQ,SAAI,EAAE,MAAM,CAAC,EAAE,MAAM,SAE5F"}
|
package/dist/array.es.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.es.js","sources":["../src/array.ts"],"sourcesContent":["export function copyArray(src: any[], dst: any[], srcIndex = 0, dstIndex = 0, length?: number) { \r\n return dst.copy(src, srcIndex, dstIndex, length);\r\n}"],"names":["copyArray","src","dst","srcIndex","dstIndex","length"],"mappings":"AAAO,SAASA,EAAUC,GAAYC,GAAYC,IAAW,GAAGC,IAAW,GAAGC,GAAiB;AAC3F,SAAOH,EAAI,KAAKD,GAAKE,GAAUC,GAAUC,CAAM;AACnD;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface Array<T> {
|
|
2
|
+
find(callback: (element: T, index: number, array: Array<T>) => boolean): T;
|
|
3
|
+
unfold<TItem>(callback: (element: T) => Array<TItem>): Array<TItem>;
|
|
4
|
+
max<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;
|
|
5
|
+
min<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;
|
|
6
|
+
orderBy<TItem>(selector: (element: T) => TItem): Array<T>;
|
|
7
|
+
groupBy(selector: (element: T) => string): {
|
|
8
|
+
[key: string]: Array<T>;
|
|
9
|
+
};
|
|
10
|
+
orderByDesc<TItem>(selector: (element: T) => TItem): Array<T>;
|
|
11
|
+
distinct(): Array<T>;
|
|
12
|
+
distinct<TItem>(selector: (element: T) => TItem): Array<T>;
|
|
13
|
+
copy(src: any[], srcIndex?: number, dstIndex?: number, length?: number): this;
|
|
14
|
+
copyTo(dst: any[], srcIndex?: number, dstIndex?: number, length?: number): this;
|
|
15
|
+
}
|
|
16
|
+
declare class Sorters {
|
|
17
|
+
static asc(a: any, b: any): 0 | 1 | -1;
|
|
18
|
+
static desc(a: any, b: any): number;
|
|
19
|
+
}
|
|
20
|
+
declare class Filters {
|
|
21
|
+
static notNull(element: any): boolean;
|
|
22
|
+
static notUndefined(element: any): boolean;
|
|
23
|
+
static notEmpty(element: any): boolean;
|
|
24
|
+
static distinct(element: any, index: any, self: any): boolean;
|
|
25
|
+
}
|
|
26
|
+
declare function copyArray(src: any[], dst: any[], srcIndex?: number, dstIndex?: number, length?: number): any[];
|
|
27
|
+
//# sourceMappingURL=arrayExtensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayExtensions.d.ts","sourceRoot":"","sources":["../src/arrayExtensions.ts"],"names":[],"mappings":"AACA,UAAU,KAAK,CAAC,CAAC;IACb,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACpE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC;IACvE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC;IACvE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC;IAEvE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAG3D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9E,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnF;AAGD,cAAM,OAAO;IACT,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG;IAiBzB,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG;CAI7B;AAoDD,cAAM,OAAO;IACT,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAIrC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAI1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAKtC,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAA,EAAE,KAAK,KAAA,EAAE,IAAI,KAAA;CAGvC;AAiCD,iBAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,SAAI,EAAE,QAAQ,SAAI,EAAE,MAAM,CAAC,EAAE,MAAM,SAgBrF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
class o {
|
|
2
|
+
static asc(t, r) {
|
|
3
|
+
return t === r ? 0 : t > r ? 1 : -1;
|
|
4
|
+
}
|
|
5
|
+
static desc(t, r) {
|
|
6
|
+
return -o.asc(t, r);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
Array.prototype.unfold = function(i) {
|
|
10
|
+
return this.reduce((t, r) => (Array.prototype.push.apply(t, i(r)), t), []);
|
|
11
|
+
};
|
|
12
|
+
Array.prototype.max = function(i, t) {
|
|
13
|
+
return this.length == 0 ? t : this.map(i).sort(o.desc)[0];
|
|
14
|
+
};
|
|
15
|
+
Array.prototype.min = function(i, t) {
|
|
16
|
+
return this.length == 0 ? t : this.map(i).sort(o.asc)[0];
|
|
17
|
+
};
|
|
18
|
+
Array.prototype.orderBy = function(i) {
|
|
19
|
+
return this.slice(0).sort((t, r) => o.asc(i(t), i(r)));
|
|
20
|
+
};
|
|
21
|
+
Array.prototype.orderByDesc = function(i) {
|
|
22
|
+
return this.slice(0).sort((t, r) => o.desc(i(t), i(r)));
|
|
23
|
+
};
|
|
24
|
+
Array.prototype.groupBy = function(i) {
|
|
25
|
+
return this.reduce((t, r) => {
|
|
26
|
+
const n = i(r);
|
|
27
|
+
return (t[n] = t[n] || []).push(r), t;
|
|
28
|
+
}, {});
|
|
29
|
+
};
|
|
30
|
+
class y {
|
|
31
|
+
static notNull(t) {
|
|
32
|
+
return t != null;
|
|
33
|
+
}
|
|
34
|
+
static notUndefined(t) {
|
|
35
|
+
return t != null;
|
|
36
|
+
}
|
|
37
|
+
static notEmpty(t) {
|
|
38
|
+
return t !== "";
|
|
39
|
+
}
|
|
40
|
+
// unique
|
|
41
|
+
static distinct(t, r, n) {
|
|
42
|
+
return n.indexOf(t) === r;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
Array.prototype.distinct = function(i) {
|
|
46
|
+
if (!i)
|
|
47
|
+
return this.filter(y.distinct);
|
|
48
|
+
let t = [];
|
|
49
|
+
return this.filter(function(r) {
|
|
50
|
+
const n = i(r);
|
|
51
|
+
return t.indexOf(n) >= 0 ? !1 : t.push(n);
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
Array.prototype.copy = function(i, t = 0, r = 0, n) {
|
|
55
|
+
return s(i, this, t, r, n);
|
|
56
|
+
};
|
|
57
|
+
Array.prototype.copyTo = function(i, t = 0, r = 0, n) {
|
|
58
|
+
return s(this, i, t, r, n);
|
|
59
|
+
};
|
|
60
|
+
function s(i, t, r = 0, n = 0, e) {
|
|
61
|
+
(r == null || r < 0) && (r = 0), (n == null || n < 0) && (n = 0), e == null && (e = Math.min(i.length, i.length - r));
|
|
62
|
+
let p = n;
|
|
63
|
+
for (let u = r; u < e; u++)
|
|
64
|
+
t[p] = i[u], p++;
|
|
65
|
+
return t;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=arrayExtensions.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayExtensions.es.js","sources":["../src/arrayExtensions.ts"],"sourcesContent":["\r\ninterface Array<T> {\r\n find(callback: (element: T, index: number, array: Array<T>) => boolean): T; // aka firstOrDefault\r\n unfold<TItem>(callback: (element: T) => Array<TItem>): Array<TItem>; // aka selectMany\r\n max<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;\r\n min<TItem>(selector: (element: T) => TItem, defaultValue?: any): TItem;\r\n orderBy<TItem>(selector: (element: T) => TItem): Array<T>;\r\n groupBy(selector: (element: T) => string): { [key: string]: Array<T> };\r\n // groupBy(key: string): { [key: string]: Array<T> };\t\r\n orderByDesc<TItem>(selector: (element: T) => TItem): Array<T>;\r\n distinct(): Array<T>; // unique\r\n distinct<TItem>(selector: (element: T) => TItem): Array<T>; // distinctBy/uniqueBy\r\n // TODO: pushMany aka addRange\r\n /** NOTE: there is no native array copy method (all existing methods rely on spread) */\r\n copy(src: any[], srcIndex?: number, dstIndex?: number, length?: number): this; // copyFrom\r\n copyTo(dst: any[], srcIndex?: number, dstIndex?: number, length?: number): this;\r\n}\r\n\r\n// Comparers\r\nclass Sorters {\r\n static asc(a: any, b: any) {\r\n // comparison\r\n return (a === b) ? 0\r\n : (a > b) ? 1\r\n : -1;\r\n // if (a < b) {\r\n // return -1;\r\n // }\r\n // if (a > b) {\r\n // return 1;\r\n // }\r\n // // a must be equal to b\r\n // return 0;\r\n // localeCompare?\r\n // numeric: a - b\r\n }\r\n\r\n static desc(a: any, b: any) {\r\n return -Sorters.asc(a, b);\r\n // return Sorters.asc(b, a);\r\n }\r\n}\r\n\r\nArray.prototype.unfold = function (callback: (element: any) => any[]): any[] {\r\n return this.reduce((res, element) => {\r\n Array.prototype.push.apply(res, callback(element));\r\n return res;\r\n }, []);\r\n};\r\n\r\nArray.prototype.max = function (selector: (element: any) => any, defaultValue?: any): any {\r\n if (this.length == 0) {\r\n return defaultValue;\r\n }\r\n return this.map(selector).sort(Sorters.desc)[0];\r\n\r\n // return this.reduce((x, el) => {\r\n // let order = el.Order();\r\n // return x == undefined ? order : (order > x ? order : o);\r\n // }, undefined);\r\n};\r\n\r\nArray.prototype.min = function (selector: (element: any) => any, defaultValue?: any): any {\r\n if (this.length == 0) {\r\n return defaultValue;\r\n }\r\n return this.map(selector).sort(Sorters.asc)[0];\r\n};\r\n\r\nArray.prototype.orderBy = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => Sorters.asc(selector(a), selector(b)));\r\n};\r\n\r\nArray.prototype.orderByDesc = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => Sorters.desc(selector(a), selector(b)));\r\n};\r\n\r\n// Array.prototype.groupBy = function (key: string): { [key: string]: any[] } {\r\n// \treturn this.reduce((result, item) => {\r\n// \t\tconst value = item[key].toString();\r\n// \t\t(result[item[key]] = result[item[key]] || []).push(item);\r\n// \t\treturn result;\r\n// \t}, {});\r\n// };\r\n\r\nArray.prototype.groupBy = function (selector: (element: any) => string): { [key: string]: any[] } {\r\n return this.reduce((result, item) => {\r\n const value = selector(item); //.toString()\r\n (result[value] = result[value] || []).push(item);\r\n return result;\r\n }, {});\r\n};\r\n\r\nclass Filters {\r\n static notNull(element: any): boolean {\r\n return element != null;\r\n }\r\n\r\n static notUndefined(element: any): boolean { // notMissing\r\n return element != undefined;\r\n }\r\n\r\n static notEmpty(element: any): boolean {\r\n return element !== '';\r\n }\r\n\r\n // unique\r\n static distinct(element, index, self) {\r\n return self.indexOf(element) === index;\r\n }\r\n}\r\n\r\n// distinctBy/uniqueBy\r\nArray.prototype.distinct = function (selector?: (element: any) => any): any[] {\r\n if (!selector) {\r\n return this.filter(Filters.distinct);\r\n // return this.sort().filter(function (element, index, self) {\r\n // return !index || element != self[index - 1];\r\n // });\r\n }\r\n\r\n // let keys = {}; // elements/items\r\n // return this.filter(function (element) {\r\n // const key = selector(element);\r\n // return keys.hasOwnProperty(key) ? false : (keys[key] = true);\r\n // });\r\n\r\n let keys = []; // elements/items\r\n return this.filter(function (element) {\r\n const key = selector(element);\r\n return keys.indexOf(key) >= 0 ? false : keys.push(key);\r\n });\r\n};\r\n\r\n// copyFrom\r\nArray.prototype.copy = function (src: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n return copyArray(src, this, srcIndex, dstIndex, length);\r\n}\r\n\r\nArray.prototype.copyTo = function (dst: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n return copyArray(this, dst, srcIndex, dstIndex, length);\r\n}\r\n\r\nfunction copyArray(src: any[], dst: any[], srcIndex = 0, dstIndex = 0, length?: number) {\r\n if (srcIndex == undefined || srcIndex < 0) {\r\n srcIndex = 0;\r\n }\r\n if (dstIndex == undefined || dstIndex < 0) {\r\n dstIndex = 0;\r\n }\r\n if (length == undefined) {\r\n length = Math.min(src.length, src.length - srcIndex);\r\n }\r\n let j = dstIndex;\r\n for (let i = srcIndex; i < length; i++) {\r\n dst[j] = src[i];\r\n j++;\r\n }\r\n return dst;\r\n}"],"names":["Sorters","a","b","callback","res","element","selector","defaultValue","result","item","value","Filters","index","self","keys","key","src","srcIndex","dstIndex","length","copyArray","dst","j","i"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { default as Dexie } from 'dexie';
|
|
2
|
+
export interface ICacheEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
createdAt: number;
|
|
5
|
+
accessedAt: number;
|
|
6
|
+
slidingExpiration?: number;
|
|
7
|
+
expiresAt: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ICacheDataItem {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly value: any;
|
|
12
|
+
}
|
|
13
|
+
export declare class CacheEntry implements ICacheEntry {
|
|
14
|
+
id: string;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
accessedAt: number;
|
|
17
|
+
expiresAt: number;
|
|
18
|
+
constructor(src: Partial<CacheEntry>);
|
|
19
|
+
}
|
|
20
|
+
export declare class CacheDataItem implements ICacheDataItem {
|
|
21
|
+
id: string;
|
|
22
|
+
value: any;
|
|
23
|
+
constructor(src: Partial<CacheDataItem>);
|
|
24
|
+
}
|
|
25
|
+
export declare class CacheDb extends Dexie {
|
|
26
|
+
registry: Dexie.Table<ICacheEntry, string>;
|
|
27
|
+
data: Dexie.Table<ICacheDataItem, string>;
|
|
28
|
+
constructor(dbName: string);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cacheDb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cacheDb.d.ts","sourceRoot":"","sources":["../../src/cache/cacheDb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACvB;AAOD,qBAAa,UAAW,YAAW,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;gBAEN,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC;CASvC;AAGD,qBAAa,aAAc,YAAW,cAAc;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,GAAG,CAAC;gBAEC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC;CAQ1C;AAED,qBAAa,OAAQ,SAAQ,KAAK;IAI9B,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBAE9B,MAAM,EAAE,MAAM;CAgD7B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var d = Object.defineProperty;
|
|
2
|
+
var l = (s, t, a) => t in s ? d(s, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : s[t] = a;
|
|
3
|
+
var e = (s, t, a) => l(s, typeof t != "symbol" ? t + "" : t, a);
|
|
4
|
+
import b from "dexie";
|
|
5
|
+
const c = "registry", i = "data", h = ["id", "createdAt", "accessedAt", "expiresAt"], y = ["id", "value"];
|
|
6
|
+
class u {
|
|
7
|
+
constructor(t) {
|
|
8
|
+
e(this, "id");
|
|
9
|
+
e(this, "createdAt");
|
|
10
|
+
// updatedAt: number;
|
|
11
|
+
e(this, "accessedAt");
|
|
12
|
+
e(this, "expiresAt");
|
|
13
|
+
Object.assign(this, t);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
class A {
|
|
17
|
+
constructor(t) {
|
|
18
|
+
e(this, "id");
|
|
19
|
+
e(this, "value");
|
|
20
|
+
Object.assign(this, t);
|
|
21
|
+
}
|
|
22
|
+
// constructor(key: string, value: string) {
|
|
23
|
+
// this.key = key;
|
|
24
|
+
// this.value = value;
|
|
25
|
+
// }
|
|
26
|
+
}
|
|
27
|
+
class j extends b {
|
|
28
|
+
constructor(a) {
|
|
29
|
+
if (!a)
|
|
30
|
+
throw new Error("Invalid database name");
|
|
31
|
+
super(a);
|
|
32
|
+
// private _dbName: string;
|
|
33
|
+
// catalog/entries
|
|
34
|
+
e(this, "registry");
|
|
35
|
+
e(this, "data");
|
|
36
|
+
const r = this;
|
|
37
|
+
r.version(1).stores({
|
|
38
|
+
[c]: h.join(", "),
|
|
39
|
+
[i]: y.join(", ")
|
|
40
|
+
}), this.registry = r.table(c), this.data = r.table(i), r.registry.hook("deleting", async (o, g, n) => {
|
|
41
|
+
await n.table(i).delete(o);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
A as CacheDataItem,
|
|
47
|
+
j as CacheDb,
|
|
48
|
+
u as CacheEntry
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=cacheDb.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cacheDb.es.js","sources":["../../src/cache/cacheDb.ts"],"sourcesContent":["import Dexie from \"dexie\"; // https://dexie.org/docs/Typescript\r\n\r\nconst registryTableName = \"registry\"; // \"catalog\"\r\nconst dataTableName = \"data\";\r\n\r\nexport interface ICacheEntry {\r\n id: string;\r\n createdAt: number;\r\n // updatedAt: number; // lastModified\r\n accessedAt: number; // lastAccessed/lastAccessTime\r\n slidingExpiration?: number;\r\n // absoluteExpiration?: number;\r\n expiresAt: number; // expiryTime\r\n}\r\n\r\n// ICacheDataRecord\r\nexport interface ICacheDataItem {\r\n readonly id: string;\r\n readonly value: any;\r\n}\r\n\r\n// (registry/catalog)PropertyNames\r\nconst entryPropertyNames: (keyof ICacheEntry)[] = [\"id\", \"createdAt\", \"accessedAt\", \"expiresAt\"];\r\n\r\nconst dataItemPropertyNames: (keyof ICacheDataItem)[] = [\"id\", \"value\"];\r\n\r\nexport class CacheEntry implements ICacheEntry {\r\n id: string;\r\n createdAt: number;\r\n // updatedAt: number;\r\n accessedAt: number;\r\n expiresAt: number;\r\n\r\n constructor(src: Partial<CacheEntry>) {\r\n Object.assign(this, src);\r\n // Define navigation properties.\r\n // Making them non-enumerable will prevent them from being handled by indexedDB\r\n // when doing put() or add().\r\n // Object.defineProperties(this, {\r\n // ...: { value: [], enumerable: false, writable: true }\r\n // });\r\n }\r\n}\r\n\r\n// CacheDataRecord\r\nexport class CacheDataItem implements ICacheDataItem {\r\n id: string;\r\n value: any;\r\n\r\n constructor(src: Partial<CacheDataItem>) {\r\n Object.assign(this, src);\r\n }\r\n\r\n // constructor(key: string, value: string) {\r\n // this.key = key;\r\n // this.value = value;\r\n // }\r\n}\r\n\r\nexport class CacheDb extends Dexie {\r\n // private _dbName: string;\r\n\r\n // catalog/entries\r\n registry: Dexie.Table<ICacheEntry, string>;\r\n data: Dexie.Table<ICacheDataItem, string>;\r\n\r\n constructor(dbName: string) {\r\n // navigator.storage.estimate()\r\n // navigator.webkitTemporaryStorage.queryUsageAndQuota()\r\n\r\n if (!dbName) {\r\n throw new Error(\"Invalid database name\"); // cannot be empty\r\n }\r\n\r\n super(dbName); // {autoOpen: false}\r\n\r\n // this._dbName = dbName;\r\n\r\n const db = this;\r\n\r\n //\r\n // Define tables and indexes\r\n //\r\n\r\n db.version(1).stores({\r\n [registryTableName]: entryPropertyNames.join(\", \"),\r\n [dataTableName]: dataItemPropertyNames.join(\", \")\r\n });\r\n\r\n // db.version(2).stores({\r\n // \t// ...\r\n // }).upgrade(trans => {\r\n // \treturn trans.table(cacheEntryTableName).toCollection().modify((entry: ICacheEntry) => {\r\n // \t\t// ...\r\n // \t});\r\n // });\r\n\r\n this.registry = db.table(registryTableName);\r\n this.data = db.table(dataTableName);\r\n\r\n db.registry.hook(\"deleting\", async (key, obj, transaction) => {\r\n await transaction.table(dataTableName).delete(key);\r\n });\r\n\r\n // db.registry.mapToClass(CacheEntry);\r\n // db.data.mapToClass(CacheDataItem);\r\n\r\n // db.on('populate', () => db.registry.bulkAdd([\r\n // \t// ...\r\n // ]));\r\n\r\n // Dexie.delete(this._dbName);\r\n // this.delete();\r\n }\r\n}\r\n"],"names":["registryTableName","dataTableName","entryPropertyNames","dataItemPropertyNames","CacheEntry","src","__publicField","CacheDataItem","CacheDb","Dexie","dbName","db","key","obj","transaction"],"mappings":";;;;AAEA,MAAMA,IAAoB,YACpBC,IAAgB,QAmBhBC,IAA4C,CAAC,MAAM,aAAa,cAAc,WAAW,GAEzFC,IAAkD,CAAC,MAAM,OAAO;AAE/D,MAAMC,EAAkC;AAAA,EAO3C,YAAYC,GAA0B;AANtC,IAAAC,EAAA;AACA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGW,WAAA,OAAO,MAAMD,CAAG;AAAA,EAO3B;AACJ;AAGO,MAAME,EAAwC;AAAA,EAIjD,YAAYF,GAA6B;AAHzC,IAAAC,EAAA;AACA,IAAAA,EAAA;AAGW,WAAA,OAAO,MAAMD,CAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAMJ;AAEO,MAAMG,UAAgBC,EAAM;AAAA,EAO/B,YAAYC,GAAgB;AAIxB,QAAI,CAACA;AACK,YAAA,IAAI,MAAM,uBAAuB;AAG3C,UAAMA,CAAM;AAXhB;AAAA;AAAA,IAAAJ,EAAA;AACA,IAAAA,EAAA;AAcI,UAAMK,IAAK;AAMR,IAAAA,EAAA,QAAQ,CAAC,EAAE,OAAO;AAAA,MACjB,CAACX,CAAiB,GAAGE,EAAmB,KAAK,IAAI;AAAA,MACjD,CAACD,CAAa,GAAGE,EAAsB,KAAK,IAAI;AAAA,IAAA,CACnD,GAUI,KAAA,WAAWQ,EAAG,MAAMX,CAAiB,GACrC,KAAA,OAAOW,EAAG,MAAMV,CAAa,GAElCU,EAAG,SAAS,KAAK,YAAY,OAAOC,GAAKC,GAAKC,MAAgB;AAC1D,YAAMA,EAAY,MAAMb,CAAa,EAAE,OAAOW,CAAG;AAAA,IAAA,CACpD;AAAA,EAWL;AACJ;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface IMemoryCache<TKey = any, TValue = any> {
|
|
2
|
+
get keys(): Iterable<TKey>;
|
|
3
|
+
getKeys: () => Iterable<TKey>;
|
|
4
|
+
get: (key: TKey) => TValue;
|
|
5
|
+
contains: (key: TKey) => boolean;
|
|
6
|
+
remove: (key: TKey) => void;
|
|
7
|
+
set: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => void;
|
|
8
|
+
get values(): Iterable<TValue>;
|
|
9
|
+
getValues: () => Iterable<TValue>;
|
|
10
|
+
getOrSet: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => TValue;
|
|
11
|
+
clear: () => void;
|
|
12
|
+
get entries(): Iterable<[TKey, TValue]>;
|
|
13
|
+
getEntries: () => Iterable<[TKey, TValue]>;
|
|
14
|
+
}
|
|
15
|
+
export declare class MemoryCache<TKey = any, TValue = any> implements IMemoryCache {
|
|
16
|
+
private map;
|
|
17
|
+
constructor();
|
|
18
|
+
get keys(): MapIterator<TKey>;
|
|
19
|
+
getKeys(): MapIterator<TKey>;
|
|
20
|
+
get(key: TKey): TValue;
|
|
21
|
+
contains(key: TKey): boolean;
|
|
22
|
+
remove(key: TKey): void;
|
|
23
|
+
set(key: TKey, valueOrValueFactory: TValue | (() => TValue)): void;
|
|
24
|
+
get values(): any;
|
|
25
|
+
getValues(): any;
|
|
26
|
+
getOrSet(key: TKey, valueOrValueFactory: TValue | (() => TValue)): TValue;
|
|
27
|
+
clear(): void;
|
|
28
|
+
get size(): number;
|
|
29
|
+
getEntries(): MapIterator<[TKey, TValue]>;
|
|
30
|
+
get entries(): MapIterator<[TKey, TValue]>;
|
|
31
|
+
}
|
|
32
|
+
export declare const globalMemoryCache: MemoryCache<any, any>;
|
|
33
|
+
//# sourceMappingURL=memoryCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryCache.d.ts","sourceRoot":"","sources":["../../src/cache/memoryCache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG;IAClD,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3B,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC;IAE3B,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC;IAEjC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAE5B,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,IAAI,CAAC;IAE1E,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IAElC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC;IAE9E,KAAK,EAAE,MAAM,IAAI,CAAC;IAErB,IAAI,OAAO,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9C;AAGD,qBAAa,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,CAAE,YAAW,YAAY;IACtE,OAAO,CAAC,GAAG,CAAoB;;IAM/B,IAAI,IAAI,sBAEP;IAED,OAAO;IAIP,GAAG,CAAC,GAAG,EAAE,IAAI;IAIb,QAAQ,CAAC,GAAG,EAAE,IAAI;IAIlB,MAAM,CAAC,GAAG,EAAE,IAAI;IAIhB,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;IAQ3D,IAAI,MAAM,QAET;IAED,SAAS;IAIT,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;IAahE,KAAK;IAIL,IAAI,IAAI,WAEP;IAED,UAAU;IAIV,IAAI,OAAO,gCAEV;CACJ;AAED,eAAO,MAAM,iBAAiB,uBAAoB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var n = Object.defineProperty;
|
|
2
|
+
var r = (s, t, e) => t in s ? n(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
|
|
3
|
+
var i = (s, t, e) => r(s, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
class h {
|
|
5
|
+
constructor() {
|
|
6
|
+
i(this, "map");
|
|
7
|
+
this.map = /* @__PURE__ */ new Map();
|
|
8
|
+
}
|
|
9
|
+
get keys() {
|
|
10
|
+
return this.map.keys();
|
|
11
|
+
}
|
|
12
|
+
getKeys() {
|
|
13
|
+
return this.keys;
|
|
14
|
+
}
|
|
15
|
+
get(t) {
|
|
16
|
+
return this.map.get(t);
|
|
17
|
+
}
|
|
18
|
+
contains(t) {
|
|
19
|
+
return this.map.has(t);
|
|
20
|
+
}
|
|
21
|
+
remove(t) {
|
|
22
|
+
this.map.delete(t);
|
|
23
|
+
}
|
|
24
|
+
set(t, e) {
|
|
25
|
+
e instanceof Function ? this.map.set(t, e()) : this.map.set(t, e);
|
|
26
|
+
}
|
|
27
|
+
get values() {
|
|
28
|
+
return this.getValues();
|
|
29
|
+
}
|
|
30
|
+
getValues() {
|
|
31
|
+
return this.values;
|
|
32
|
+
}
|
|
33
|
+
getOrSet(t, e) {
|
|
34
|
+
return this.contains(t) || (e instanceof Function ? this.map.set(t, e()) : this.map.set(t, e)), this.get(t);
|
|
35
|
+
}
|
|
36
|
+
clear() {
|
|
37
|
+
this.map.clear();
|
|
38
|
+
}
|
|
39
|
+
get size() {
|
|
40
|
+
return this.map.size;
|
|
41
|
+
}
|
|
42
|
+
getEntries() {
|
|
43
|
+
return this.entries;
|
|
44
|
+
}
|
|
45
|
+
get entries() {
|
|
46
|
+
return this.map.entries();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const m = new h();
|
|
50
|
+
export {
|
|
51
|
+
h as MemoryCache,
|
|
52
|
+
m as globalMemoryCache
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=memoryCache.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryCache.es.js","sources":["../../src/cache/memoryCache.ts"],"sourcesContent":["export interface IMemoryCache<TKey = any, TValue = any> {\r\n get keys(): Iterable<TKey>;\r\n\tgetKeys: () => Iterable<TKey>;\r\n\r\n get: (key: TKey) => TValue;\r\n\r\n contains: (key: TKey) => boolean;\r\n\r\n remove: (key: TKey) => void;\r\n\r\n set: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => void;\r\n\r\n\tget values(): Iterable<TValue>;\r\n getValues: () => Iterable<TValue>;\r\n\r\n getOrSet: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => TValue;\r\n\r\n clear: () => void;\r\n\r\n\tget entries(): Iterable<[TKey, TValue]>;\r\n getEntries: () => Iterable<[TKey, TValue]>;\r\n}\r\n\r\n// TODO: remove class, create factory method\r\nexport class MemoryCache<TKey = any, TValue = any> implements IMemoryCache {\r\n private map: Map<TKey, TValue>;\r\n\r\n constructor() {\r\n this.map = new Map<TKey, TValue>();\r\n }\r\n\r\n get keys() {\r\n return this.map.keys();\r\n }\r\n\r\n getKeys() {\r\n return this.keys;\r\n }\r\n\r\n get(key: TKey) {\r\n return this.map.get(key);\r\n }\r\n\r\n contains(key: TKey) {\r\n return this.map.has(key);\r\n }\r\n\r\n remove(key: TKey) {\r\n this.map.delete(key);\r\n }\r\n\r\n set(key: TKey, valueOrValueFactory: TValue | (() => TValue)) {\r\n if (valueOrValueFactory instanceof Function) {\r\n this.map.set(key, valueOrValueFactory());\r\n } else {\r\n this.map.set(key, valueOrValueFactory);\r\n }\r\n }\r\n\r\n get values() {\r\n return this.getValues();\r\n }\r\n\r\n getValues() {\r\n return this.values;\r\n }\r\n\r\n getOrSet(key: TKey, valueOrValueFactory: TValue | (() => TValue)) {\r\n if (!this.contains(key)) {\r\n // this.set(key, valueOrValueFactory);\r\n\t\t\tif (valueOrValueFactory instanceof Function) {\r\n // typeof valueOrValueFactory === \"function\"\r\n this.map.set(key, valueOrValueFactory());\r\n } else {\r\n this.map.set(key, valueOrValueFactory);\r\n }\r\n }\r\n return this.get(key);\r\n }\r\n\r\n clear() {\r\n this.map.clear();\r\n }\r\n\r\n get size() {\r\n return this.map.size;\r\n }\r\n\r\n getEntries() {\r\n return this.entries;\r\n }\r\n\r\n get entries() {\r\n return this.map.entries();\r\n }\r\n}\r\n\r\nexport const globalMemoryCache = new MemoryCache();"],"names":["MemoryCache","__publicField","key","valueOrValueFactory","globalMemoryCache"],"mappings":";;;AAwBO,MAAMA,EAA8D;AAAA,EAGvE,cAAc;AAFN,IAAAC,EAAA;AAGC,SAAA,0BAAU;EACnB;AAAA,EAEA,IAAI,OAAO;AACA,WAAA,KAAK,IAAI;EACpB;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAIC,GAAW;AACJ,WAAA,KAAK,IAAI,IAAIA,CAAG;AAAA,EAC3B;AAAA,EAEA,SAASA,GAAW;AACT,WAAA,KAAK,IAAI,IAAIA,CAAG;AAAA,EAC3B;AAAA,EAEA,OAAOA,GAAW;AACT,SAAA,IAAI,OAAOA,CAAG;AAAA,EACvB;AAAA,EAEA,IAAIA,GAAWC,GAA8C;AACzD,IAAIA,aAA+B,WAC/B,KAAK,IAAI,IAAID,GAAKC,EAAqB,CAAA,IAElC,KAAA,IAAI,IAAID,GAAKC,CAAmB;AAAA,EAE7C;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK;EAChB;AAAA,EAEA,YAAY;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAASD,GAAWC,GAA8C;AAC9D,WAAK,KAAK,SAASD,CAAG,MAEvBC,aAA+B,WAEtB,KAAK,IAAI,IAAID,GAAKC,EAAqB,CAAA,IAElC,KAAA,IAAI,IAAID,GAAKC,CAAmB,IAGtC,KAAK,IAAID,CAAG;AAAA,EACvB;AAAA,EAEA,QAAQ;AACJ,SAAK,IAAI;EACb;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACH,WAAA,KAAK,IAAI;EACpB;AACJ;AAEa,MAAAE,IAAoB,IAAIJ,EAAY;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CacheDb, ICacheEntry, ICacheDataItem } from './cacheDb';
|
|
2
|
+
import { StructEventTarget } from '../structEvent';
|
|
3
|
+
type Duration = number | {
|
|
4
|
+
seconds?: number;
|
|
5
|
+
minutes?: number;
|
|
6
|
+
hours?: number;
|
|
7
|
+
};
|
|
8
|
+
export type PersistentCacheOptions = {
|
|
9
|
+
cleanupTimeout: number;
|
|
10
|
+
};
|
|
11
|
+
export type CacheOptions = {
|
|
12
|
+
absoluteExpiration?: Date | number;
|
|
13
|
+
ttl?: Duration;
|
|
14
|
+
slidingExpiration?: Date | number;
|
|
15
|
+
};
|
|
16
|
+
export type CacheEvictionEvent = {
|
|
17
|
+
entry: ICacheEntry;
|
|
18
|
+
keepAliveOptions?: CacheOptions;
|
|
19
|
+
};
|
|
20
|
+
type PersistentCacheEventStruct = {
|
|
21
|
+
evict: CacheEvictionEvent;
|
|
22
|
+
};
|
|
23
|
+
export declare class PersistentCache extends StructEventTarget<PersistentCacheEventStruct> {
|
|
24
|
+
private _db;
|
|
25
|
+
private _isDisposed;
|
|
26
|
+
private _jobTimerId;
|
|
27
|
+
private readonly _options;
|
|
28
|
+
constructor(db: CacheDb, options: PersistentCacheOptions);
|
|
29
|
+
scheduleServiceJob(): void;
|
|
30
|
+
deleteExpired(date?: Date): Promise<string[]>;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
private exec;
|
|
33
|
+
getKeys(): Promise<string[]>;
|
|
34
|
+
get(key: string): Promise<Readonly<ICacheEntry & ICacheDataItem>>;
|
|
35
|
+
bulkGet(ids: string[]): Promise<{
|
|
36
|
+
[key: string]: Readonly<ICacheEntry & ICacheDataItem>;
|
|
37
|
+
}>;
|
|
38
|
+
getValue(key: string, defaultValue?: any): Promise<any>;
|
|
39
|
+
bulkGetValues(ids: string[]): Promise<{
|
|
40
|
+
[kes: string]: any;
|
|
41
|
+
}>;
|
|
42
|
+
contains(key: string): Promise<boolean>;
|
|
43
|
+
delete(id: string): Promise<void>;
|
|
44
|
+
bulkDelete(ids: string[]): Promise<void>;
|
|
45
|
+
set(id: string, value: any, options: CacheOptions): Promise<void>;
|
|
46
|
+
getOrSet(key: string, factory: () => any, options: CacheOptions): Promise<void>;
|
|
47
|
+
clear(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=persistentCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentCache.d.ts","sourceRoot":"","sources":["../../src/cache/persistentCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAe,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG/D,KAAK,QAAQ,GAAG,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,sBAAsB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,YAAY,GAAG;IACvB,kBAAkB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACnC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,iBAAiB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CACrC,CAAC;AAGF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,KAAK,EAAE,WAAW,CAAC;IAEnB,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACnC,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAC9B,KAAK,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAKF,qBAAa,eAAgB,SAAQ,iBAAiB,CAAC,0BAA0B,CAAC;IAU9E,OAAO,CAAC,GAAG,CAAU;IAErB,OAAO,CAAC,WAAW,CAAU;IAE7B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAGtC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB;IAmBxD,kBAAkB;IAgBZ,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;IA8B/B,OAAO;YAuBO,IAAI;IAeZ,OAAO;IAIP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,GAAG,cAAc,CAAC,CAAC;IAcjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,WAAW,GAAG,cAAc,CAAC,CAAA;KAAE,CAAC;IAsC1F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,MAAY;IAU9C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE;;;IAS3B,QAAQ,CAAC,GAAG,EAAE,MAAM;IAQpB,MAAM,CAAC,EAAE,EAAE,MAAM;IAOjB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE;IAMxB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;IA6BjD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,EAAE,YAAY;IAU/D,KAAK;CAQd"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
var h = Object.defineProperty;
|
|
2
|
+
var y = (n, r, t) => r in n ? h(n, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[r] = t;
|
|
3
|
+
var o = (n, r, t) => y(n, typeof r != "symbol" ? r + "" : r, t);
|
|
4
|
+
import { keyOf as b } from "../typeUtils.es.js";
|
|
5
|
+
import { StructEventTarget as w, StructEvent as _ } from "../structEvent.es.js";
|
|
6
|
+
import { v4 as p } from "uuid";
|
|
7
|
+
const f = {
|
|
8
|
+
cleanupTimeout: 1e3
|
|
9
|
+
};
|
|
10
|
+
class v extends w {
|
|
11
|
+
// cleanupTimeout - serviceJobTimeout
|
|
12
|
+
constructor(t, e) {
|
|
13
|
+
super();
|
|
14
|
+
// https://demo.agektmr.com/storage/
|
|
15
|
+
// https://www.html5rocks.com/en/tutorials/offline/quota-research/
|
|
16
|
+
// https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits
|
|
17
|
+
// https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js
|
|
18
|
+
// https://developer.chrome.com/apps/offline_storage#query
|
|
19
|
+
// https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html
|
|
20
|
+
// http://www.forerunnerdb.com/licensing.html
|
|
21
|
+
// https://github.com/ignasbernotas/dexie-relationships
|
|
22
|
+
o(this, "_db");
|
|
23
|
+
o(this, "_isDisposed");
|
|
24
|
+
o(this, "_jobTimerId");
|
|
25
|
+
o(this, "_options");
|
|
26
|
+
if (!t)
|
|
27
|
+
throw new Error("Database cannot be null");
|
|
28
|
+
this._isDisposed = !1, this._jobTimerId = null, this._db = t, this._options = { ...e, ...f }, this.scheduleServiceJob();
|
|
29
|
+
}
|
|
30
|
+
scheduleServiceJob() {
|
|
31
|
+
const t = async () => {
|
|
32
|
+
try {
|
|
33
|
+
await this.deleteExpired();
|
|
34
|
+
} catch (e) {
|
|
35
|
+
console.error("Cache cleanup failed:", e);
|
|
36
|
+
} finally {
|
|
37
|
+
setTimeout(t, this._options.cleanupTimeout);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
setTimeout(t, this._options.cleanupTimeout);
|
|
41
|
+
}
|
|
42
|
+
// evictExpired/clearExpired
|
|
43
|
+
async deleteExpired(t) {
|
|
44
|
+
const e = [];
|
|
45
|
+
return t || (t = /* @__PURE__ */ new Date()), await this.exec(async () => {
|
|
46
|
+
const i = await this._db.registry.where(b("expiresAt")).below(t.getTime()).toArray();
|
|
47
|
+
for (const s of i) {
|
|
48
|
+
const c = new _("evict", {
|
|
49
|
+
detail: {
|
|
50
|
+
entry: s
|
|
51
|
+
// keepAliveOptions: {}
|
|
52
|
+
},
|
|
53
|
+
target: this,
|
|
54
|
+
cancelable: !0
|
|
55
|
+
});
|
|
56
|
+
this.dispatchEvent(c), await this._db.registry.delete(s.id), e.push(s.id);
|
|
57
|
+
}
|
|
58
|
+
}), e;
|
|
59
|
+
}
|
|
60
|
+
dispose() {
|
|
61
|
+
this._isDisposed || (this._isDisposed = !0, this._jobTimerId && (window.clearTimeout(this._jobTimerId), this._jobTimerId = null), this._db && (this._db.isOpen() && this._db.close(), this._db = null));
|
|
62
|
+
}
|
|
63
|
+
async exec(t) {
|
|
64
|
+
this._db.isOpen() || await this._db.open();
|
|
65
|
+
try {
|
|
66
|
+
return await t();
|
|
67
|
+
} catch (e) {
|
|
68
|
+
throw this._db.isOpen(), e;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async getKeys() {
|
|
72
|
+
return await this._db.registry.filter((t) => !0).primaryKeys();
|
|
73
|
+
}
|
|
74
|
+
async get(t) {
|
|
75
|
+
return await this.exec(async () => {
|
|
76
|
+
const e = await this._db.registry.get(t);
|
|
77
|
+
if (e) {
|
|
78
|
+
const i = await this._db.data.get(t);
|
|
79
|
+
return { ...e, ...i };
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// getMany
|
|
85
|
+
async bulkGet(t) {
|
|
86
|
+
const e = {};
|
|
87
|
+
return await this.exec(async () => {
|
|
88
|
+
const s = (await this._db.registry.bulkGet(t)).reduce((a, d, l) => (a[d.id] = d, a), {}), c = await this._db.data.bulkGet(t);
|
|
89
|
+
for (const a of c)
|
|
90
|
+
e[a.id] = { ...s[a.id], ...a }, delete s[a.id];
|
|
91
|
+
for (const a of Object.keys(s))
|
|
92
|
+
e[a] = { ...s[a], value: void 0 };
|
|
93
|
+
return e;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async getValue(t, e = void 0) {
|
|
97
|
+
const i = await this.get(t);
|
|
98
|
+
return i ? i.value : e;
|
|
99
|
+
}
|
|
100
|
+
// getManyValues
|
|
101
|
+
async bulkGetValues(t) {
|
|
102
|
+
const e = {}, i = this.bulkGet(t);
|
|
103
|
+
for (const s of Object.keys(i))
|
|
104
|
+
e[s] = i[s].value;
|
|
105
|
+
return e;
|
|
106
|
+
}
|
|
107
|
+
async contains(t) {
|
|
108
|
+
return await this.exec(async () => await this._db.registry.get(t) != null);
|
|
109
|
+
}
|
|
110
|
+
async delete(t) {
|
|
111
|
+
await this.exec(async () => {
|
|
112
|
+
await this._db.registry.delete(t);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// deleteMany
|
|
116
|
+
async bulkDelete(t) {
|
|
117
|
+
await this.exec(async () => {
|
|
118
|
+
await this._db.registry.bulkDelete(t);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async set(t, e, i) {
|
|
122
|
+
return await this.exec(async () => {
|
|
123
|
+
var l, u;
|
|
124
|
+
const s = await this._db.registry.get(t), c = (/* @__PURE__ */ new Date()).getTime();
|
|
125
|
+
t || (t = p());
|
|
126
|
+
const a = typeof i.absoluteExpiration == "number" ? i.absoluteExpiration : (l = i.absoluteExpiration) == null ? void 0 : l.getTime(), d = typeof i.slidingExpiration == "number" ? i.slidingExpiration : (u = i.slidingExpiration) == null ? void 0 : u.getTime();
|
|
127
|
+
await this._db.registry.put({
|
|
128
|
+
id: t,
|
|
129
|
+
createdAt: s ? s.createdAt : c,
|
|
130
|
+
accessedAt: s ? s.accessedAt : null,
|
|
131
|
+
// now
|
|
132
|
+
// updatedAt: now,
|
|
133
|
+
expiresAt: a,
|
|
134
|
+
slidingExpiration: d
|
|
135
|
+
}), await this._db.data.put({
|
|
136
|
+
id: t,
|
|
137
|
+
value: e
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// getOrUpdate
|
|
142
|
+
async getOrSet(t, e, i) {
|
|
143
|
+
await this.exec(async () => (await this.contains(t) || await this.set(t, e(), i), await this.get(t)));
|
|
144
|
+
}
|
|
145
|
+
// clearAll/evictAll
|
|
146
|
+
async clear() {
|
|
147
|
+
await this.exec(async () => {
|
|
148
|
+
await this._db.registry.clear(), await this._db.data.clear();
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// TODO: support update bulkUpdate, bulkSet
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
v as PersistentCache
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=persistentCache.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentCache.es.js","sources":["../../src/cache/persistentCache.ts"],"sourcesContent":["import { keyOf } from \"@/typeUtils\";\r\nimport { CacheDb, ICacheEntry, ICacheDataItem } from \"./cacheDb\";\r\nimport { StructEvent, StructEventTarget } from \"@/structEvent\";\r\nimport { v4 as uuid } from \"uuid\";\r\n\r\ntype Duration = number | { seconds?: number; minutes?: number; hours?: number };\r\n\r\nexport type PersistentCacheOptions = {\r\n cleanupTimeout: number;\r\n};\r\n\r\nconst defaultPersistentCacheOptions = {\r\n cleanupTimeout: 1000\r\n} satisfies PersistentCacheOptions;\r\n\r\nexport type CacheOptions = {\r\n absoluteExpiration?: Date | number;\r\n ttl?: Duration;\r\n slidingExpiration?: Date | number; // \"autoRenewOnUse\" pattern\r\n};\r\n\r\n// CacheEntryEvictionEvent\r\nexport type CacheEvictionEvent = {\r\n entry: ICacheEntry;\r\n // or optionsOverride?\r\n keepAliveOptions?: CacheOptions; // TODO: delayed eviction (pending eviction) after gracePeriod\r\n};\r\n\r\ntype PersistentCacheEventStruct = {\r\n evict: CacheEvictionEvent;\r\n};\r\n\r\n// TODO: remove class, create factory method\r\n// implements Struct<StructEventTarget<PersistentCacheEventStruct>>\r\n// PersistentCacheManager\r\nexport class PersistentCache extends StructEventTarget<PersistentCacheEventStruct> {\r\n // https://demo.agektmr.com/storage/\r\n // https://www.html5rocks.com/en/tutorials/offline/quota-research/\r\n // https://www.raymondcamden.com/2015/04/17/indexeddb-and-limits\r\n // https://github.com/jonnysmith1981/getIndexedDbSize/blob/master/getIndexedDbSize.js\r\n // https://developer.chrome.com/apps/offline_storage#query\r\n // https://golb.hplar.ch/2018/01/IndexedDB-programming-with-Dexie-js.html\r\n // http://www.forerunnerdb.com/licensing.html\r\n // https://github.com/ignasbernotas/dexie-relationships\r\n\r\n private _db: CacheDb;\r\n\r\n private _isDisposed: boolean;\r\n\r\n private _jobTimerId: number;\r\n\r\n private readonly _options: PersistentCacheOptions;\r\n\r\n // cleanupTimeout - serviceJobTimeout\r\n constructor(db: CacheDb, options: PersistentCacheOptions) {\r\n super();\r\n if (!db) {\r\n throw new Error(\"Database cannot be null\");\r\n }\r\n this._isDisposed = false;\r\n this._jobTimerId = null;\r\n\r\n this._db = db;\r\n // if (this._db.isOpen()) {\r\n // \tthis._db.close();\r\n // }\r\n\r\n // https://docs.nestjs.com/techniques/task-scheduling\r\n this._options = { ...options, ...defaultPersistentCacheOptions };\r\n\r\n this.scheduleServiceJob();\r\n }\r\n\r\n scheduleServiceJob() {\r\n const doWork = async () => {\r\n try {\r\n // purge expired entries\r\n await this.deleteExpired();\r\n } catch (err) {\r\n console.error(\"Cache cleanup failed:\", err);\r\n } finally {\r\n setTimeout(doWork, this._options.cleanupTimeout);\r\n }\r\n };\r\n\r\n setTimeout(doWork, this._options.cleanupTimeout);\r\n }\r\n\r\n // evictExpired/clearExpired\r\n async deleteExpired(date?: Date) {\r\n const result: string[] = []; // output ids\r\n if (!date) {\r\n date = new Date();\r\n }\r\n\r\n await this.exec(async () => {\r\n const entries = await this._db.registry.where(keyOf<ICacheEntry>(\"expiresAt\")).below(date.getTime()).toArray();\r\n for (const entry of entries) {\r\n const evt = new StructEvent<PersistentCacheEventStruct, this>(\"evict\", {\r\n detail: {\r\n entry: entry\r\n // keepAliveOptions: {}\r\n },\r\n target: this,\r\n cancelable: true\r\n });\r\n this.dispatchEvent(evt);\r\n // evt.defaultPrevented?\r\n // TODO: support evt.detail.keepAliveOptions\r\n await this._db.registry.delete(entry.id);\r\n // await this._db.data.delete(entry.id);\r\n result.push(entry.id);\r\n // TODO: use bulkDelete\r\n // TODO: use transaction\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n dispose() {\r\n if (!this._isDisposed) {\r\n this._isDisposed = true;\r\n\r\n if (this._jobTimerId) {\r\n window.clearTimeout(this._jobTimerId);\r\n this._jobTimerId = null;\r\n }\r\n\r\n if (this._db) {\r\n // this.exec(async () => {\r\n // \t// ...\r\n // }).then(() => {\r\n // \tthis._db = null;\r\n // });\r\n if (this._db.isOpen()) {\r\n this._db.close();\r\n }\r\n this._db = null;\r\n }\r\n }\r\n }\r\n\r\n private async exec<T>(action: () => Promise<T>) {\r\n if (!this._db.isOpen()) {\r\n await this._db.open();\r\n }\r\n try {\r\n const result = await action();\r\n return result;\r\n } catch (err) {\r\n if (this._db.isOpen()) {\r\n // this._db.close(); // generally speaking: we don't (never) need to close a connection\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n async getKeys() {\r\n return await this._db.registry.filter((_) => true).primaryKeys();\r\n }\r\n\r\n async get(key: string): Promise<Readonly<ICacheEntry & ICacheDataItem>> {\r\n return await this.exec(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n if (entry) {\r\n const data = await this._db.data.get(key);\r\n // const data = await this._db.data.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n return { ...entry, ...data };\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n // getMany\r\n async bulkGet(ids: string[]): Promise<{ [key: string]: Readonly<ICacheEntry & ICacheDataItem> }> {\r\n const result: { [key: string]: Readonly<ICacheEntry & ICacheDataItem> } = {};\r\n return await this.exec(async () => {\r\n // const entries = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).anyOf(ids).toArray();\r\n const entries = await this._db.registry.bulkGet(ids);\r\n const entryMap: { [key: string]: ICacheEntry } = entries.reduce((map, entry, i) => {\r\n map[entry.id] = entry;\r\n return map;\r\n }, {});\r\n\r\n // const dataItems = this._db.data.where(keyOf<ICacheEntry>(\"id\")).anyOf(ids);\r\n // await dataItems.each((dataItem) => {\r\n // result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n // delete entryMap[dataItem.id];\r\n // });\r\n\r\n const dataItems = await this._db.data.bulkGet(ids);\r\n for (const dataItem of dataItems) {\r\n result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n delete entryMap[dataItem.id];\r\n }\r\n\r\n for (const key of Object.keys(entryMap)) {\r\n // abandoned/orphaned entries:\r\n result[key] = { ...entryMap[key], value: undefined };\r\n\r\n // Object.defineProperty(result[key], keyOf<ICacheDataItem>(\"value\"), {\r\n // writable: false,\r\n // get: function () {\r\n // throw new Error(\"Not found\");\r\n // }\r\n // });\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n async getValue(key: string, defaultValue = undefined) {\r\n const item = await this.get(key);\r\n if (!item) {\r\n return defaultValue;\r\n } else {\r\n return item.value;\r\n }\r\n }\r\n\r\n // getManyValues\r\n async bulkGetValues(ids: string[]) {\r\n const result: { [kes: string]: any } = {};\r\n const items = this.bulkGet(ids);\r\n for (const key of Object.keys(items)) {\r\n result[key] = items[key].value;\r\n }\r\n return result;\r\n }\r\n\r\n async contains(key: string) {\r\n return await this.exec(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n return entry != undefined;\r\n });\r\n }\r\n\r\n async delete(id: string) {\r\n await this.exec(async () => {\r\n await this._db.registry.delete(id);\r\n });\r\n }\r\n\r\n // deleteMany\r\n async bulkDelete(ids: string[]) {\r\n await this.exec(async () => {\r\n await this._db.registry.bulkDelete(ids);\r\n });\r\n }\r\n\r\n async set(id: string, value: any, options: CacheOptions) {\r\n return await this.exec(async () => {\r\n const entry = await this._db.registry.get(id);\r\n // const entry = await this._db.registry.where(keyOf<ICacheEntry>(\"id\")).equals(key).first();\r\n const now = new Date().getTime();\r\n if (!id) {\r\n id = uuid();\r\n }\r\n const expiresAt =\r\n typeof options.absoluteExpiration === \"number\" ? options.absoluteExpiration : options.absoluteExpiration?.getTime();\r\n const slidingExpiration =\r\n typeof options.slidingExpiration === \"number\" ? options.slidingExpiration : options.slidingExpiration?.getTime();\r\n\r\n await this._db.registry.put({\r\n id: id,\r\n createdAt: entry ? entry.createdAt : now,\r\n accessedAt: entry ? entry.accessedAt : null, // now\r\n // updatedAt: now,\r\n expiresAt: expiresAt,\r\n slidingExpiration: slidingExpiration\r\n });\r\n await this._db.data.put({\r\n id: id,\r\n value: value\r\n });\r\n });\r\n }\r\n\r\n // getOrUpdate\r\n async getOrSet(key: string, factory: () => any, options: CacheOptions) {\r\n await this.exec(async () => {\r\n if (!(await this.contains(key))) {\r\n await this.set(key, factory(), options);\r\n }\r\n return await this.get(key);\r\n });\r\n }\r\n\r\n // clearAll/evictAll\r\n async clear() {\r\n await this.exec(async () => {\r\n await this._db.registry.clear();\r\n await this._db.data.clear();\r\n });\r\n }\r\n\r\n // TODO: support update bulkUpdate, bulkSet\r\n}\r\n\r\n// https://medium.com/square-corner-blog/useful-tools-headless-chrome-puppeteer-for-browser-automation-testing-1ac7707bad40\r\n// https://developers.google.com/web/updates/2017/06/headless-karma-mocha-chai?hl=ru\r\n// https://github.com/puppeteer/puppeteer\r\n// https://medium.com/web-standards/puppeteer-crawl-to-markdown-7752dff36b68\r\n"],"names":["defaultPersistentCacheOptions","PersistentCache","StructEventTarget","db","options","__publicField","doWork","err","date","result","entries","keyOf","entry","evt","StructEvent","action","_","key","data","ids","entryMap","map","i","dataItems","dataItem","defaultValue","item","items","id","value","now","uuid","expiresAt","_a","slidingExpiration","_b","factory"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataFormats.d.ts","sourceRoot":"","sources":["../src/dataFormats.ts"],"names":[],"mappings":";;;AACA,wBAEE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataFormats.es.js","sources":["../src/dataFormats.ts"],"sourcesContent":["import dateTimeDataFormat from './dateTimeDataFormat';\r\nexport default {\r\n dateTime: dateTimeDataFormat\r\n};"],"names":["dataFormats","dateTimeDataFormat"],"mappings":";AACA,MAAeA,IAAA;AAAA,EACX,UAAUC;AACd;"}
|