@actdim/utico 1.2.5 → 1.2.7
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/README.md +73 -3
- package/dist/arrayExtensions.es.js +64 -38
- package/dist/arrayExtensions.es.js.map +1 -1
- package/dist/asyncLock.es.js +45 -30
- package/dist/asyncLock.es.js.map +1 -1
- package/dist/cache/cacheContracts.es.js +8 -4
- package/dist/cache/cacheContracts.es.js.map +1 -1
- package/dist/cache/memoryCache.es.js +28 -13
- package/dist/cache/memoryCache.es.js.map +1 -1
- package/dist/cache/persistentCache.es.js +174 -97
- package/dist/cache/persistentCache.es.js.map +1 -1
- package/dist/dataFormats.es.js +4 -4
- package/dist/dataFormats.es.js.map +1 -1
- package/dist/dateTimeDataFormat.es.js +211 -130
- package/dist/dateTimeDataFormat.es.js.map +1 -1
- package/dist/decorators.es.js +15 -11
- package/dist/decorators.es.js.map +1 -1
- package/dist/gfx/canvasUtils.es.js +197 -114
- package/dist/gfx/canvasUtils.es.js.map +1 -1
- package/dist/gfx/color.es.js +134 -68
- package/dist/gfx/color.es.js.map +1 -1
- package/dist/i18n/cultures.es.js +8 -8
- package/dist/i18n/cultures.es.js.map +1 -1
- package/dist/i18n/enUsCulture.es.js +2 -2
- package/dist/i18n/enUsCulture.es.js.map +1 -1
- package/dist/i18n/euCulture.es.js +2 -2
- package/dist/i18n/euCulture.es.js.map +1 -1
- package/dist/i18n/invariantCulture.es.js +2 -2
- package/dist/i18n/invariantCulture.es.js.map +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/math.es.js +14 -8
- package/dist/math.es.js.map +1 -1
- package/dist/metadata.es.js +53 -25
- package/dist/metadata.es.js.map +1 -1
- package/dist/patterns.es.js +5 -3
- package/dist/patterns.es.js.map +1 -1
- package/dist/store/dataStore.es.js +241 -157
- package/dist/store/dataStore.es.js.map +1 -1
- package/dist/store/persistentStore.es.js +23 -17
- package/dist/store/persistentStore.es.js.map +1 -1
- package/dist/store/storeContracts.es.js +7 -3
- package/dist/store/storeContracts.es.js.map +1 -1
- package/dist/store/storeDb.es.js +87 -50
- package/dist/store/storeDb.es.js.map +1 -1
- package/dist/stringCore.es.js +60 -22
- package/dist/stringCore.es.js.map +1 -1
- package/dist/structEvent.es.js +30 -17
- package/dist/structEvent.es.js.map +1 -1
- package/dist/typeCore.es.js +25 -11
- package/dist/typeCore.es.js.map +1 -1
- package/dist/typeUtils.es.js +292 -182
- package/dist/typeUtils.es.js.map +1 -1
- package/dist/utils.d.ts +3 -3
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.es.js +138 -81
- package/dist/utils.es.js.map +1 -1
- package/dist/watchable.es.js +50 -27
- package/dist/watchable.es.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1403,9 +1403,9 @@ cache.size; // 2
|
|
|
1403
1403
|
|
|
1404
1404
|
| Function | Description |
|
|
1405
1405
|
|----------|-------------|
|
|
1406
|
-
| `delay(ms)` | Returns a `Promise` that resolves after `ms` milliseconds |
|
|
1407
|
-
| `delayError(ms, errFactory?)` | Returns a `Promise` that rejects after `ms` milliseconds |
|
|
1408
|
-
| `withTimeout(promise, ms)` | Races `promise` against a timeout rejection |
|
|
1406
|
+
| `delay(ms, abortSignal?)` | Returns a `Promise` that resolves after `ms` milliseconds; rejects early if `abortSignal` is aborted |
|
|
1407
|
+
| `delayError(ms, errFactory?, abortSignal?)` | Returns a `Promise` that rejects after `ms` milliseconds; rejects early if `abortSignal` is aborted |
|
|
1408
|
+
| `withTimeout(promise, ms, abortSignal?)` | Races `promise` against a timeout rejection; rejects early if `abortSignal` is aborted |
|
|
1409
1409
|
| `lazy(factory)` | Wraps a factory in a once-evaluated lazy initializer |
|
|
1410
1410
|
| `memoEffect(getValue, callback, comparator?)` | Calls `callback` only when the value from `getValue` changes |
|
|
1411
1411
|
| `searchTree(nodes, predicate, childSelector)` | Depth-first search over a tree structure |
|
|
@@ -1421,6 +1421,9 @@ import { delay, withTimeout, lazy, memoEffect, searchTree } from '@actdim/utico/
|
|
|
1421
1421
|
|
|
1422
1422
|
await delay(500);
|
|
1423
1423
|
|
|
1424
|
+
const ac = new AbortController();
|
|
1425
|
+
await delay(500, ac.signal); // rejects if ac.abort() is called
|
|
1426
|
+
|
|
1424
1427
|
const result = await withTimeout(fetch('/api'), 3000);
|
|
1425
1428
|
|
|
1426
1429
|
const getInstance = lazy(() => new ExpensiveClass());
|
|
@@ -1557,6 +1560,73 @@ See [dateTimeDataFormat](#datetimedataformat--datetime-serialisation) for full t
|
|
|
1557
1560
|
|
|
1558
1561
|
---
|
|
1559
1562
|
|
|
1563
|
+
## Changelog
|
|
1564
|
+
|
|
1565
|
+
### 1.2.5
|
|
1566
|
+
- `typeCore`: core type additions and refinements
|
|
1567
|
+
|
|
1568
|
+
### 1.2.4
|
|
1569
|
+
- `typeCore`: `KeyPath` fixes and improvements
|
|
1570
|
+
- Added `tests/typeCore.test.ts`
|
|
1571
|
+
|
|
1572
|
+
### 1.2.3
|
|
1573
|
+
- `typeCore`: `KeyPath` further improved
|
|
1574
|
+
- `typeUtils`: `isPlainObject` fix
|
|
1575
|
+
|
|
1576
|
+
### 1.2.2
|
|
1577
|
+
- `arrayExtensions`: fixes; `src/array.ts` merged in and removed
|
|
1578
|
+
- Minor cleanup across `memoryCache`, `dataStore`, `storeContracts`, `stringCore`, `typeUtils`
|
|
1579
|
+
|
|
1580
|
+
### 1.2.0
|
|
1581
|
+
- `typeCore`: new utility types
|
|
1582
|
+
|
|
1583
|
+
### 1.1.8
|
|
1584
|
+
- `AsyncMutex` renamed to `AsyncLock` (`src/asyncLock.ts`); old module removed
|
|
1585
|
+
|
|
1586
|
+
### 1.1.6
|
|
1587
|
+
- `dateTimeDataFormat`: overhaul with new parsing/serialization logic
|
|
1588
|
+
- `i18n`: added `euCulture` and `invariantCulture`
|
|
1589
|
+
|
|
1590
|
+
### 1.1.5
|
|
1591
|
+
- `dateTimeDataFormat`: migrated from `moment` to `Luxon`
|
|
1592
|
+
- Added `tests/dateTimeDataFormat.test.ts`, `tests/watchable.test.ts`
|
|
1593
|
+
|
|
1594
|
+
### 1.1.3
|
|
1595
|
+
- `decorators`: new `@nonEnumerable` decorator (`src/decorators.ts`)
|
|
1596
|
+
- Store fixes (`dataStore`, `persistentStore`, `storeDb`)
|
|
1597
|
+
- Added tests: `asyncMutex`, `metadata`, `persistentCache`, `stringCore`, `structEvent`, `typeUtils`
|
|
1598
|
+
|
|
1599
|
+
### 1.1.2
|
|
1600
|
+
- Breaking API changes across `cache` and `store` modules
|
|
1601
|
+
|
|
1602
|
+
### 1.1.0 – 1.1.1
|
|
1603
|
+
- `typeCore`, `utils`: internal refactoring
|
|
1604
|
+
|
|
1605
|
+
### 1.0.6
|
|
1606
|
+
- `utils`: added `removePrefix`, `removeSuffix`
|
|
1607
|
+
|
|
1608
|
+
### 1.0.5
|
|
1609
|
+
- `utils`: added `lazy`
|
|
1610
|
+
|
|
1611
|
+
### 1.0.4
|
|
1612
|
+
- `utils`: `delayError` updated
|
|
1613
|
+
|
|
1614
|
+
### 1.0.0
|
|
1615
|
+
- Stable release; switched to `pnpm` and `Vitest`
|
|
1616
|
+
- `cacheContracts` introduced as a separate module
|
|
1617
|
+
|
|
1618
|
+
### 0.9.7
|
|
1619
|
+
- New store layer: `dataStore`, `persistentStore`, `storeContracts`, `storeDb`
|
|
1620
|
+
- Migrated test runner from Jest to Vitest
|
|
1621
|
+
|
|
1622
|
+
### 0.9.1
|
|
1623
|
+
- `utils`: added `memoEffect`; first `utils` tests
|
|
1624
|
+
|
|
1625
|
+
### 0.9.0
|
|
1626
|
+
- Initial public release: `persistentCache`, `memoryCache`, `typeCore`, `typeUtils`, `stringCore`, `metadata`, `structEvent`, `watchable`, `asyncMutex`, `dateTimeDataFormat`
|
|
1627
|
+
|
|
1628
|
+
---
|
|
1629
|
+
|
|
1560
1630
|
## License
|
|
1561
1631
|
|
|
1562
1632
|
Proprietary — © Pavel Borodaev
|
|
@@ -1,56 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
Array.prototype.unfold = function(callback) {
|
|
4
|
+
return this.reduce((res, element) => {
|
|
5
|
+
Array.prototype.push.apply(res, callback(element));
|
|
6
|
+
return res;
|
|
7
|
+
}, []);
|
|
3
8
|
};
|
|
4
|
-
Array.prototype.max = function(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
Array.prototype.max = function(selector, defaultValue) {
|
|
10
|
+
if (this.length == 0) {
|
|
11
|
+
return defaultValue;
|
|
12
|
+
}
|
|
13
|
+
return this.reduce((best, el) => {
|
|
14
|
+
const v = selector(el);
|
|
15
|
+
return best === void 0 || v > best ? v : best;
|
|
8
16
|
}, void 0);
|
|
9
17
|
};
|
|
10
|
-
Array.prototype.min = function(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
Array.prototype.min = function(selector, defaultValue) {
|
|
19
|
+
if (this.length == 0) {
|
|
20
|
+
return defaultValue;
|
|
21
|
+
}
|
|
22
|
+
return this.reduce((best, el) => {
|
|
23
|
+
const v = selector(el);
|
|
24
|
+
return best === void 0 || v < best ? v : best;
|
|
14
25
|
}, void 0);
|
|
15
26
|
};
|
|
16
|
-
Array.prototype.orderBy = function(
|
|
17
|
-
return this.slice(0).sort((
|
|
18
|
-
const
|
|
19
|
-
return
|
|
27
|
+
Array.prototype.orderBy = function(selector) {
|
|
28
|
+
return this.slice(0).sort((a, b) => {
|
|
29
|
+
const va = selector(a), vb = selector(b);
|
|
30
|
+
return va === vb ? 0 : va > vb ? 1 : -1;
|
|
20
31
|
});
|
|
21
32
|
};
|
|
22
|
-
Array.prototype.orderByDesc = function(
|
|
23
|
-
return this.slice(0).sort((
|
|
24
|
-
const
|
|
25
|
-
return
|
|
33
|
+
Array.prototype.orderByDesc = function(selector) {
|
|
34
|
+
return this.slice(0).sort((a, b) => {
|
|
35
|
+
const va = selector(a), vb = selector(b);
|
|
36
|
+
return va === vb ? 0 : va > vb ? -1 : 1;
|
|
26
37
|
});
|
|
27
38
|
};
|
|
28
|
-
Array.prototype.groupBy = function(
|
|
29
|
-
return this.reduce((
|
|
30
|
-
const
|
|
31
|
-
|
|
39
|
+
Array.prototype.groupBy = function(selector) {
|
|
40
|
+
return this.reduce((result, item) => {
|
|
41
|
+
const value = selector(item);
|
|
42
|
+
(result[value] = result[value] || []).push(item);
|
|
43
|
+
return result;
|
|
32
44
|
}, {});
|
|
33
45
|
};
|
|
34
|
-
Array.prototype.distinct = function(
|
|
35
|
-
if (!
|
|
46
|
+
Array.prototype.distinct = function(selector) {
|
|
47
|
+
if (!selector) {
|
|
36
48
|
return [...new Set(this)];
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
}
|
|
50
|
+
const seen = /* @__PURE__ */ new Set();
|
|
51
|
+
return this.filter(function(element) {
|
|
52
|
+
const key = selector(element);
|
|
53
|
+
if (seen.has(key)) return false;
|
|
54
|
+
seen.add(key);
|
|
55
|
+
return true;
|
|
41
56
|
});
|
|
42
57
|
};
|
|
43
|
-
Array.prototype.copy = function(
|
|
44
|
-
return
|
|
58
|
+
Array.prototype.copy = function(src, srcIndex = 0, dstIndex = 0, length) {
|
|
59
|
+
return copyArray(src, this, srcIndex, dstIndex, length);
|
|
45
60
|
};
|
|
46
|
-
Array.prototype.copyTo = function(
|
|
47
|
-
return
|
|
61
|
+
Array.prototype.copyTo = function(dst, srcIndex = 0, dstIndex = 0, length) {
|
|
62
|
+
return copyArray(this, dst, srcIndex, dstIndex, length);
|
|
48
63
|
};
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
64
|
+
function copyArray(src, dst, srcIndex = 0, dstIndex = 0, length) {
|
|
65
|
+
if (srcIndex < 0) {
|
|
66
|
+
srcIndex = 0;
|
|
67
|
+
}
|
|
68
|
+
if (dstIndex < 0) {
|
|
69
|
+
dstIndex = 0;
|
|
70
|
+
}
|
|
71
|
+
if (length == void 0) {
|
|
72
|
+
length = src.length - srcIndex;
|
|
73
|
+
}
|
|
74
|
+
let j = dstIndex;
|
|
75
|
+
for (let i = srcIndex; i < srcIndex + length; i++) {
|
|
76
|
+
dst[j] = src[i];
|
|
77
|
+
j++;
|
|
78
|
+
}
|
|
79
|
+
return dst;
|
|
55
80
|
}
|
|
81
|
+
__name(copyArray, "copyArray");
|
|
56
82
|
//# sourceMappingURL=arrayExtensions.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrayExtensions.es.js","sources":["D:/Src/my/actdim/public/utico/src/arrayExtensions.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"arrayExtensions.es.js","sources":["D:/Src/my/actdim/public/utico/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\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.reduce((best: any, el: any) => {\r\n const v = selector(el);\r\n return best === undefined || v > best ? v : best;\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.reduce((best: any, el: any) => {\r\n const v = selector(el);\r\n return best === undefined || v < best ? v : best;\r\n }, undefined);\r\n};\r\n\r\nArray.prototype.orderBy = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => {\r\n const va = selector(a), vb = selector(b);\r\n return va === vb ? 0 : va > vb ? 1 : -1;\r\n });\r\n};\r\n\r\nArray.prototype.orderByDesc = function (selector: (element: any) => any): any[] {\r\n return this.slice(0).sort((a, b) => {\r\n const va = selector(a), vb = selector(b);\r\n return va === vb ? 0 : va > vb ? -1 : 1;\r\n });\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);\r\n (result[value] = result[value] || []).push(item);\r\n return result;\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 [...new Set(this)];\r\n }\r\n const seen = new Set();\r\n return this.filter(function (element) {\r\n const key = selector(element);\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\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 < 0) {\r\n srcIndex = 0;\r\n }\r\n if (dstIndex < 0) {\r\n dstIndex = 0;\r\n }\r\n if (length == undefined) {\r\n length = src.length - srcIndex;\r\n }\r\n let j = dstIndex;\r\n for (let i = srcIndex; i < srcIndex + length; i++) {\r\n dst[j] = src[i];\r\n j++;\r\n }\r\n return dst;\r\n}"],"names":[],"mappings":";;AAmBA,MAAM,UAAU,SAAS,SAAU,UAA0C;AACzE,SAAO,KAAK,OAAO,CAAC,KAAK,YAAY;AACjC,UAAM,UAAU,KAAK,MAAM,KAAK,SAAS,OAAO,CAAC;AACjD,WAAO;AAAA,EACX,GAAG,CAAA,CAAE;AACT;AAEA,MAAM,UAAU,MAAM,SAAU,UAAiC,cAAyB;AACtF,MAAI,KAAK,UAAU,GAAG;AAClB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,OAAO,CAAC,MAAW,OAAY;AACvC,UAAM,IAAI,SAAS,EAAE;AACrB,WAAO,SAAS,UAAa,IAAI,OAAO,IAAI;AAAA,EAChD,GAAG,MAAS;AAChB;AAEA,MAAM,UAAU,MAAM,SAAU,UAAiC,cAAyB;AACtF,MAAI,KAAK,UAAU,GAAG;AAClB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,OAAO,CAAC,MAAW,OAAY;AACvC,UAAM,IAAI,SAAS,EAAE;AACrB,WAAO,SAAS,UAAa,IAAI,OAAO,IAAI;AAAA,EAChD,GAAG,MAAS;AAChB;AAEA,MAAM,UAAU,UAAU,SAAU,UAAwC;AACxE,SAAO,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AAChC,UAAM,KAAK,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC;AACvC,WAAO,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI;AAAA,EACzC,CAAC;AACL;AAEA,MAAM,UAAU,cAAc,SAAU,UAAwC;AAC5E,SAAO,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AAChC,UAAM,KAAK,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC;AACvC,WAAO,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK;AAAA,EAC1C,CAAC;AACL;AAEA,MAAM,UAAU,UAAU,SAAU,UAA8D;AAC9F,SAAO,KAAK,OAAO,CAAC,QAAQ,SAAS;AACjC,UAAM,QAAQ,SAAS,IAAI;AAC3B,KAAC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,CAAA,GAAI,KAAK,IAAI;AAC/C,WAAO;AAAA,EACX,GAAG,CAAA,CAAE;AACT;AAGA,MAAM,UAAU,WAAW,SAAU,UAAyC;AAC1E,MAAI,CAAC,UAAU;AACX,WAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EAC5B;AACA,QAAM,2BAAW,IAAA;AACjB,SAAO,KAAK,OAAO,SAAU,SAAS;AAClC,UAAM,MAAM,SAAS,OAAO;AAC5B,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACX,CAAC;AACL;AAGA,MAAM,UAAU,OAAO,SAAU,KAAY,WAAW,GAAG,WAAW,GAAG,QAAiB;AACtF,SAAO,UAAU,KAAK,MAAM,UAAU,UAAU,MAAM;AAC1D;AAEA,MAAM,UAAU,SAAS,SAAU,KAAY,WAAW,GAAG,WAAW,GAAG,QAAiB;AACxF,SAAO,UAAU,MAAM,KAAK,UAAU,UAAU,MAAM;AAC1D;AAEA,SAAS,UAAU,KAAY,KAAY,WAAW,GAAG,WAAW,GAAG,QAAiB;AACpF,MAAI,WAAW,GAAG;AACd,eAAW;AAAA,EACf;AACA,MAAI,WAAW,GAAG;AACd,eAAW;AAAA,EACf;AACA,MAAI,UAAU,QAAW;AACrB,aAAS,IAAI,SAAS;AAAA,EAC1B;AACA,MAAI,IAAI;AACR,WAAS,IAAI,UAAU,IAAI,WAAW,QAAQ,KAAK;AAC/C,QAAI,CAAC,IAAI,IAAI,CAAC;AACd;AAAA,EACJ;AACA,SAAO;AACX;AAhBS;"}
|
package/dist/asyncLock.es.js
CHANGED
|
@@ -1,48 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
let defaultLockTimeout = 1e3 * 5;
|
|
4
|
+
const _AsyncLock = class _AsyncLock {
|
|
3
5
|
queue = Promise.resolve();
|
|
4
|
-
locked =
|
|
5
|
-
async lock(
|
|
6
|
-
let
|
|
7
|
-
},
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
locked = false;
|
|
7
|
+
async lock(timeoutMs = defaultLockTimeout) {
|
|
8
|
+
let begin = /* @__PURE__ */ __name(() => {
|
|
9
|
+
}, "begin");
|
|
10
|
+
let timer;
|
|
11
|
+
const previous = this.queue;
|
|
12
|
+
this.queue = this.queue.then(() => new Promise(begin));
|
|
13
|
+
this.locked = true;
|
|
14
|
+
const lockPromise = new Promise((resolve, reject) => {
|
|
15
|
+
begin = resolve;
|
|
16
|
+
if (timeoutMs) {
|
|
17
|
+
timer = setTimeout(() => {
|
|
18
|
+
reject(new Error("Lock timeout"));
|
|
19
|
+
}, timeoutMs);
|
|
20
|
+
}
|
|
14
21
|
});
|
|
15
22
|
try {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
const unlock = await lockPromise;
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
return () => {
|
|
26
|
+
this.locked = false;
|
|
27
|
+
unlock();
|
|
19
28
|
};
|
|
20
|
-
} catch (
|
|
21
|
-
|
|
29
|
+
} catch (err) {
|
|
30
|
+
this.queue = previous;
|
|
31
|
+
this.locked = false;
|
|
32
|
+
throw err;
|
|
22
33
|
}
|
|
23
34
|
}
|
|
24
35
|
tryLock() {
|
|
25
36
|
if (this.locked) return null;
|
|
26
|
-
this.locked =
|
|
27
|
-
let
|
|
28
|
-
const
|
|
29
|
-
|
|
37
|
+
this.locked = true;
|
|
38
|
+
let resolve;
|
|
39
|
+
const promise = new Promise((res) => {
|
|
40
|
+
resolve = res;
|
|
30
41
|
});
|
|
31
|
-
|
|
32
|
-
|
|
42
|
+
this.queue = this.queue.then(() => promise);
|
|
43
|
+
return () => {
|
|
44
|
+
this.locked = false;
|
|
45
|
+
resolve();
|
|
33
46
|
};
|
|
34
47
|
}
|
|
35
|
-
async dispatch(
|
|
36
|
-
const
|
|
48
|
+
async dispatch(fn, timeoutMs = defaultLockTimeout) {
|
|
49
|
+
const unlock = await this.lock(timeoutMs);
|
|
37
50
|
try {
|
|
38
|
-
return await
|
|
51
|
+
return await fn();
|
|
39
52
|
} finally {
|
|
40
|
-
|
|
53
|
+
unlock();
|
|
41
54
|
}
|
|
42
55
|
}
|
|
43
|
-
}
|
|
56
|
+
};
|
|
57
|
+
__name(_AsyncLock, "AsyncLock");
|
|
58
|
+
let AsyncLock = _AsyncLock;
|
|
44
59
|
export {
|
|
45
|
-
|
|
46
|
-
|
|
60
|
+
AsyncLock,
|
|
61
|
+
defaultLockTimeout
|
|
47
62
|
};
|
|
48
63
|
//# sourceMappingURL=asyncLock.es.js.map
|
package/dist/asyncLock.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncLock.es.js","sources":["D:/Src/my/actdim/public/utico/src/asyncLock.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"asyncLock.es.js","sources":["D:/Src/my/actdim/public/utico/src/asyncLock.ts"],"sourcesContent":["import { Executor } from './typeCore';\n/**\n * Example:\n * const lock = new AsyncLock();\n * await lock.dispatch(async () => {...});\n */\n\nexport let defaultLockTimeout = 1000 * 5; // 5 seconds\n\nclass AsyncLock {\n private queue = Promise.resolve();\n\n private locked = false;\n\n async lock(timeoutMs = defaultLockTimeout): Promise<() => void> {\n let begin: (unlock: () => void) => void = () => { };\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const previous = this.queue;\n this.queue = this.queue.then(() => new Promise(begin));\n this.locked = true;\n\n const lockPromise = new Promise<() => void>((resolve, reject) => {\n begin = resolve;\n\n if (timeoutMs) {\n timer = setTimeout(() => {\n reject(new Error(\"Lock timeout\"));\n }, timeoutMs);\n }\n });\n\n try {\n const unlock = await lockPromise;\n clearTimeout(timer);\n return () => {\n this.locked = false;\n unlock();\n };\n } catch (err) {\n this.queue = previous;\n this.locked = false;\n throw err;\n }\n }\n\n tryLock(): (() => void) | null {\n if (this.locked) return null;\n\n this.locked = true;\n let resolve!: () => void;\n const promise = new Promise<void>(res => { resolve = res; });\n this.queue = this.queue.then(() => promise);\n return () => {\n this.locked = false;\n resolve();\n };\n }\n\n async dispatch<T>(fn: Executor<T>, timeoutMs = defaultLockTimeout): Promise<T> {\n const unlock = await this.lock(timeoutMs);\n try {\n return await fn();\n } finally {\n unlock();\n }\n }\n}\n\n\nexport {\n AsyncLock\n};\n"],"names":[],"mappings":";;AAOO,IAAI,qBAAqB,MAAO;AAEvC,MAAM,aAAN,MAAM,WAAU;AAAA,EACJ,QAAQ,QAAQ,QAAA;AAAA,EAEhB,SAAS;AAAA,EAEjB,MAAM,KAAK,YAAY,oBAAyC;AAC5D,QAAI,QAAsC,6BAAM;AAAA,IAAE,GAAR;AAC1C,QAAI;AAEJ,UAAM,WAAW,KAAK;AACtB,SAAK,QAAQ,KAAK,MAAM,KAAK,MAAM,IAAI,QAAQ,KAAK,CAAC;AACrD,SAAK,SAAS;AAEd,UAAM,cAAc,IAAI,QAAoB,CAAC,SAAS,WAAW;AAC7D,cAAQ;AAER,UAAI,WAAW;AACX,gBAAQ,WAAW,MAAM;AACrB,iBAAO,IAAI,MAAM,cAAc,CAAC;AAAA,QACpC,GAAG,SAAS;AAAA,MAChB;AAAA,IACJ,CAAC;AAED,QAAI;AACA,YAAM,SAAS,MAAM;AACrB,mBAAa,KAAK;AAClB,aAAO,MAAM;AACT,aAAK,SAAS;AACd,eAAA;AAAA,MACJ;AAAA,IACJ,SAAS,KAAK;AACV,WAAK,QAAQ;AACb,WAAK,SAAS;AACd,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,UAA+B;AAC3B,QAAI,KAAK,OAAQ,QAAO;AAExB,SAAK,SAAS;AACd,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAA,QAAO;AAAE,gBAAU;AAAA,IAAK,CAAC;AAC3D,SAAK,QAAQ,KAAK,MAAM,KAAK,MAAM,OAAO;AAC1C,WAAO,MAAM;AACT,WAAK,SAAS;AACd,cAAA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,SAAY,IAAiB,YAAY,oBAAgC;AAC3E,UAAM,SAAS,MAAM,KAAK,KAAK,SAAS;AACxC,QAAI;AACA,aAAO,MAAM,GAAA;AAAA,IACjB,UAAA;AACI,aAAA;AAAA,IACJ;AAAA,EACJ;AACJ;AA1DgB;AAAhB,IAAM,YAAN;"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { MetadataRecord } from "../store/storeContracts.es.js";
|
|
4
|
+
const _CacheMetadataRecord = class _CacheMetadataRecord extends MetadataRecord {
|
|
3
5
|
accessedAt;
|
|
4
6
|
// lastAccessed/lastAccessTime
|
|
5
7
|
slidingExpiration;
|
|
6
8
|
absoluteExpiration;
|
|
7
9
|
expiresAt;
|
|
8
10
|
// expiryTime
|
|
9
|
-
}
|
|
11
|
+
};
|
|
12
|
+
__name(_CacheMetadataRecord, "CacheMetadataRecord");
|
|
13
|
+
let CacheMetadataRecord = _CacheMetadataRecord;
|
|
10
14
|
export {
|
|
11
|
-
|
|
15
|
+
CacheMetadataRecord
|
|
12
16
|
};
|
|
13
17
|
//# sourceMappingURL=cacheContracts.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheContracts.es.js","sources":["D:/Src/my/actdim/public/utico/src/cache/cacheContracts.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"cacheContracts.es.js","sources":["D:/Src/my/actdim/public/utico/src/cache/cacheContracts.ts"],"sourcesContent":["import { DataRecord, MetadataRecord, StoreItem } from \"@/store/storeContracts\";\r\n\r\n// CacheMetadataEntry\r\nexport class CacheMetadataRecord extends MetadataRecord {\r\n accessedAt?: number; // lastAccessed/lastAccessTime\r\n slidingExpiration?: number;\r\n absoluteExpiration?: number;\r\n expiresAt?: number; // expiryTime\r\n}\r\n\r\nexport interface IPersistentCache<T extends CacheMetadataRecord = CacheMetadataRecord> {\r\n\r\n open(): Promise<void>;\r\n\r\n getKeys(): Promise<string[]>;\r\n\r\n contains(key: string): Promise<boolean>;\r\n\r\n delete(key: string): Promise<void>;\r\n\r\n bulkDelete(keys: string[]): Promise<void>;\r\n\r\n clear(): Promise<void>;\r\n\r\n get<TValue = any>(key: string): Promise<StoreItem<T, TValue>>;\r\n\r\n set<TValue = any>(metadataRecord: T, value: TValue): Promise<string>;\r\n\r\n getOrSet<TValue = any>(metadataRecord: T, factory: (metadataRecord: T) => TValue): Promise<StoreItem<T, TValue>>\r\n\r\n bulkGet<TValue = any>(keys: string[]): Promise<StoreItem<T, TValue>[]>;\r\n\r\n bulkSet<TValue = any>(metadataRecords: T[], dataRecords: DataRecord<TValue>[]): Promise<string[]>;\r\n}"],"names":[],"mappings":";;;AAGO,MAAM,uBAAN,MAAM,6BAA4B,eAAe;AAAA,EACpD;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AACJ;AALwD;AAAjD,IAAM,sBAAN;"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const _MemoryCache = class _MemoryCache {
|
|
2
4
|
map;
|
|
3
5
|
constructor() {
|
|
4
6
|
this.map = /* @__PURE__ */ new Map();
|
|
@@ -9,17 +11,21 @@ class i {
|
|
|
9
11
|
getKeys() {
|
|
10
12
|
return this.keys;
|
|
11
13
|
}
|
|
12
|
-
get(
|
|
13
|
-
return this.map.get(
|
|
14
|
+
get(key) {
|
|
15
|
+
return this.map.get(key);
|
|
14
16
|
}
|
|
15
|
-
contains(
|
|
16
|
-
return this.map.has(
|
|
17
|
+
contains(key) {
|
|
18
|
+
return this.map.has(key);
|
|
17
19
|
}
|
|
18
|
-
remove(
|
|
19
|
-
this.map.delete(
|
|
20
|
+
remove(key) {
|
|
21
|
+
this.map.delete(key);
|
|
20
22
|
}
|
|
21
|
-
set(
|
|
22
|
-
|
|
23
|
+
set(key, valueOrValueFactory) {
|
|
24
|
+
if (valueOrValueFactory instanceof Function) {
|
|
25
|
+
this.map.set(key, valueOrValueFactory());
|
|
26
|
+
} else {
|
|
27
|
+
this.map.set(key, valueOrValueFactory);
|
|
28
|
+
}
|
|
23
29
|
}
|
|
24
30
|
get values() {
|
|
25
31
|
return this.getValues();
|
|
@@ -27,8 +33,15 @@ class i {
|
|
|
27
33
|
getValues() {
|
|
28
34
|
return this.map.values();
|
|
29
35
|
}
|
|
30
|
-
getOrSet(
|
|
31
|
-
|
|
36
|
+
getOrSet(key, valueOrValueFactory) {
|
|
37
|
+
if (!this.contains(key)) {
|
|
38
|
+
if (valueOrValueFactory instanceof Function) {
|
|
39
|
+
this.map.set(key, valueOrValueFactory());
|
|
40
|
+
} else {
|
|
41
|
+
this.map.set(key, valueOrValueFactory);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return this.get(key);
|
|
32
45
|
}
|
|
33
46
|
clear() {
|
|
34
47
|
this.map.clear();
|
|
@@ -42,8 +55,10 @@ class i {
|
|
|
42
55
|
get entries() {
|
|
43
56
|
return this.map.entries();
|
|
44
57
|
}
|
|
45
|
-
}
|
|
58
|
+
};
|
|
59
|
+
__name(_MemoryCache, "MemoryCache");
|
|
60
|
+
let MemoryCache = _MemoryCache;
|
|
46
61
|
export {
|
|
47
|
-
|
|
62
|
+
MemoryCache
|
|
48
63
|
};
|
|
49
64
|
//# sourceMappingURL=memoryCache.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryCache.es.js","sources":["D:/Src/my/actdim/public/utico/src/cache/memoryCache.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"memoryCache.es.js","sources":["D:/Src/my/actdim/public/utico/src/cache/memoryCache.ts"],"sourcesContent":["export type IMemoryCache<TKey = any, TValue = any> = {\r\n get keys(): Iterable<TKey>;\r\n getKeys: () => Iterable<TKey>;\r\n get: (key: TKey) => TValue;\r\n contains: (key: TKey) => boolean;\r\n remove: (key: TKey) => void;\r\n set: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => void;\r\n get values(): Iterable<TValue>;\r\n getValues: () => Iterable<TValue>;\r\n getOrSet: (key: TKey, valueOrValueFactory: TValue | (() => TValue)) => TValue;\r\n clear: () => void;\r\n get entries(): Iterable<[TKey, TValue]>;\r\n getEntries: () => Iterable<[TKey, TValue]>;\r\n};\r\n\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.map.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 if (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}"],"names":[],"mappings":";;AAeO,MAAM,eAAN,MAAM,aAA8D;AAAA,EAC/D;AAAA,EAER,cAAc;AACV,SAAK,0BAAU,IAAA;AAAA,EACnB;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,IAAI,KAAA;AAAA,EACpB;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,KAAW;AACX,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,SAAS,KAAW;AAChB,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,OAAO,KAAW;AACd,SAAK,IAAI,OAAO,GAAG;AAAA,EACvB;AAAA,EAEA,IAAI,KAAW,qBAA8C;AACzD,QAAI,+BAA+B,UAAU;AACzC,WAAK,IAAI,IAAI,KAAK,oBAAA,CAAqB;AAAA,IAC3C,OAAO;AACH,WAAK,IAAI,IAAI,KAAK,mBAAmB;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK,UAAA;AAAA,EAChB;AAAA,EAEA,YAAY;AACR,WAAO,KAAK,IAAI,OAAA;AAAA,EACpB;AAAA,EAEA,SAAS,KAAW,qBAA8C;AAC9D,QAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AAErB,UAAI,+BAA+B,UAAU;AAEzC,aAAK,IAAI,IAAI,KAAK,oBAAA,CAAqB;AAAA,MAC3C,OAAO;AACH,aAAK,IAAI,IAAI,KAAK,mBAAmB;AAAA,MACzC;AAAA,IACJ;AACA,WAAO,KAAK,IAAI,GAAG;AAAA,EACvB;AAAA,EAEA,QAAQ;AACJ,SAAK,IAAI,MAAA;AAAA,EACb;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK,IAAI,QAAA;AAAA,EACpB;AACJ;AAvE2E;AAApE,IAAM,cAAN;"}
|