@zajno/common 2.8.8 → 2.8.10
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 +1 -1
- package/cjs/functions/safe.js +16 -0
- package/cjs/functions/safe.js.map +1 -1
- package/cjs/lazy/lazy.js +6 -10
- package/cjs/lazy/lazy.js.map +1 -1
- package/cjs/lazy/light.js +4 -1
- package/cjs/lazy/light.js.map +1 -1
- package/cjs/lazy/promise.js +26 -14
- package/cjs/lazy/promise.js.map +1 -1
- package/cjs/structures/promiseCache/cache.js +112 -26
- package/cjs/structures/promiseCache/cache.js.map +1 -1
- package/cjs/structures/promiseCache/core.js +82 -8
- package/cjs/structures/promiseCache/core.js.map +1 -1
- package/cjs/structures/promiseCache/types.js +2 -2
- package/cjs/structures/promiseCache/types.js.map +1 -1
- package/esm/functions/safe.js +15 -0
- package/esm/functions/safe.js.map +1 -1
- package/esm/lazy/lazy.js +6 -10
- package/esm/lazy/lazy.js.map +1 -1
- package/esm/lazy/light.js +4 -1
- package/esm/lazy/light.js.map +1 -1
- package/esm/lazy/promise.js +26 -14
- package/esm/lazy/promise.js.map +1 -1
- package/esm/structures/promiseCache/cache.js +112 -26
- package/esm/structures/promiseCache/cache.js.map +1 -1
- package/esm/structures/promiseCache/core.js +82 -8
- package/esm/structures/promiseCache/core.js.map +1 -1
- package/esm/structures/promiseCache/types.js +2 -2
- package/esm/structures/promiseCache/types.js.map +1 -1
- package/package.json +1 -1
- package/types/functions/safe.d.ts +7 -0
- package/types/lazy/lazy.d.ts +3 -2
- package/types/lazy/promise.d.ts +5 -4
- package/types/lazy/types.d.ts +20 -8
- package/types/structures/promiseCache/cache.d.ts +56 -16
- package/types/structures/promiseCache/core.d.ts +71 -18
- package/types/structures/promiseCache/types.d.ts +26 -7
- package/types/structures/tempoCache.d.ts +1 -1
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ The motivation to have this – just to control and organize some shared code th
|
|
|
51
51
|
* [Structures](./src/structures)
|
|
52
52
|
- [`Path`](./src/structures/path/index.ts): a helper to build (almost) type-safe dynamic paths (useful for routing definitions);
|
|
53
53
|
- [`Queues`](./src/structures/queue/): [`ParallelQueue`](./src/structures/queue/parallel.ts) (helps run & track multiple prioritized async tasks), [`TasksQueue`](./src/structures/queue/tasks.ts) (a simple queue for async tasks with a limit for concurrent tasks);
|
|
54
|
-
- [`PromiseCache`](./src/structures/promiseCache.
|
|
54
|
+
- [`PromiseCache`](./src/structures/promiseCache/README.md): a cache for Promise'd values; supports TTL, invalidation, stale-while-revalidate refresh, custom keys, deferred getters and more;
|
|
55
55
|
- [`PromiseExtended`](./src/structures/promiseExtended.ts): a Promise wrapper which never rejects but provides `onSuccess` and `onError` callbacks;
|
|
56
56
|
- [`PromiseProxy`](./src/structures/promiseProxy.ts): a Promise wrapper to mimic (fake) a resolved value's properties until it's actually resolved;
|
|
57
57
|
- [`Enum helpers`](./src/structures/helpers/enum.ts): `EnumHelper`, `EnumStringHelper`, `EnumBitwiseHelper`;
|
package/cjs/functions/safe.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.catchPromise = catchPromise;
|
|
4
4
|
exports.wrapAsync = wrapAsync;
|
|
5
|
+
exports.formatError = formatError;
|
|
5
6
|
function catchPromise(promise, errorCb) {
|
|
6
7
|
Promise.resolve(promise).catch(err => errorCb?.(err));
|
|
7
8
|
}
|
|
@@ -12,4 +13,19 @@ function wrapAsync(fn, errorCb) {
|
|
|
12
13
|
}
|
|
13
14
|
};
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Formats an unknown caught value into a human-readable string.
|
|
18
|
+
*
|
|
19
|
+
* Useful at presentation boundaries where a display string is needed.
|
|
20
|
+
* Prefer keeping the raw error for programmatic handling (instanceof checks, .cause, etc.).
|
|
21
|
+
*/
|
|
22
|
+
function formatError(err) {
|
|
23
|
+
if (typeof err === 'string') {
|
|
24
|
+
return err;
|
|
25
|
+
}
|
|
26
|
+
if (err instanceof Error) {
|
|
27
|
+
return err.message;
|
|
28
|
+
}
|
|
29
|
+
return String(err) || 'Unknown error';
|
|
30
|
+
}
|
|
15
31
|
//# sourceMappingURL=safe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe.js","sourceRoot":"","sources":["../../../src/functions/safe.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAED,8BAMC;
|
|
1
|
+
{"version":3,"file":"safe.js","sourceRoot":"","sources":["../../../src/functions/safe.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAED,8BAMC;AAQD,kCAQC;AA1BD,SAAgB,YAAY,CAAC,OAAwB,EAAE,OAA4B;IAC/E,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,SAAS,CAAyB,EAA+C,EAAE,OAA4B;IAC3H,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;QACtB,IAAI,EAAE,EAAE,CAAC;YACL,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;IACL,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;AAC1C,CAAC"}
|
package/cjs/lazy/lazy.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Lazy = void 0;
|
|
4
4
|
const disposer_js_1 = require("../functions/disposer.js");
|
|
5
|
+
const safe_js_1 = require("../functions/safe.js");
|
|
5
6
|
/**
|
|
6
7
|
* Synchronous lazy-loading container that initializes a value on first access.
|
|
7
8
|
* The value is cached until reset or expired. Supports custom disposal and cache expiration.
|
|
@@ -22,6 +23,10 @@ class Lazy {
|
|
|
22
23
|
}
|
|
23
24
|
get currentValue() { return this._instance; }
|
|
24
25
|
get error() { return this._error; }
|
|
26
|
+
/** @deprecated Use {@link error} instead. */
|
|
27
|
+
get errorMessage() {
|
|
28
|
+
return this._error != null ? (0, safe_js_1.formatError)(this._error) : null;
|
|
29
|
+
}
|
|
25
30
|
/** Override me: additional way to make sure instance is valid */
|
|
26
31
|
get isValid() {
|
|
27
32
|
if (!this.hasValue) {
|
|
@@ -81,17 +86,8 @@ class Lazy {
|
|
|
81
86
|
this.setInstance(res);
|
|
82
87
|
}
|
|
83
88
|
catch (e) {
|
|
84
|
-
this._error =
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
parseError(err) {
|
|
88
|
-
if (typeof err === 'string') {
|
|
89
|
-
return err;
|
|
90
|
-
}
|
|
91
|
-
if (err instanceof Error) {
|
|
92
|
-
return err.message;
|
|
89
|
+
this._error = e;
|
|
93
90
|
}
|
|
94
|
-
return String(err) || 'Unknown error';
|
|
95
91
|
}
|
|
96
92
|
}
|
|
97
93
|
exports.Lazy = Lazy;
|
package/cjs/lazy/lazy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/lazy/lazy.ts"],"names":[],"mappings":";;;AAAA,0DAAwE;
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/lazy/lazy.ts"],"names":[],"mappings":"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"}
|
package/cjs/lazy/light.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createLazy = createLazy;
|
|
4
|
+
const safe_js_1 = require("../functions/safe.js");
|
|
4
5
|
function createLazy(factory) {
|
|
5
6
|
const _factory = factory;
|
|
6
7
|
let _instance = undefined;
|
|
@@ -13,7 +14,7 @@ function createLazy(factory) {
|
|
|
13
14
|
_instance = _factory();
|
|
14
15
|
}
|
|
15
16
|
catch (e) {
|
|
16
|
-
_error = e
|
|
17
|
+
_error = e;
|
|
17
18
|
throw e;
|
|
18
19
|
}
|
|
19
20
|
}
|
|
@@ -22,6 +23,8 @@ function createLazy(factory) {
|
|
|
22
23
|
get currentValue() { return _instance; },
|
|
23
24
|
get hasValue() { return _instance !== undefined; },
|
|
24
25
|
get error() { return _error; },
|
|
26
|
+
/** @deprecated Use {@link error} instead. */
|
|
27
|
+
get errorMessage() { return _error != null ? (0, safe_js_1.formatError)(_error) : null; },
|
|
25
28
|
reset: () => {
|
|
26
29
|
_instance = undefined;
|
|
27
30
|
_error = null;
|
package/cjs/lazy/light.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light.js","sourceRoot":"","sources":["../../../src/lazy/light.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"light.js","sourceRoot":"","sources":["../../../src/lazy/light.ts"],"names":[],"mappings":";;AAKA,gCA+BC;AAnCD,kDAAmD;AAInD,SAAgB,UAAU,CAAI,OAAgB;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,SAAS,GAAkB,SAAS,CAAC;IACzC,IAAI,MAAM,GAAY,IAAI,CAAC;IAE3B,MAAM,GAAG,GAA8C;QACnD,IAAI,KAAK;YACL,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC;oBACD,SAAS,GAAG,QAAQ,EAAE,CAAC;gBAC3B,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,MAAM,GAAG,CAAC,CAAC;oBACX,MAAM,CAAC,CAAC;gBACZ,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,YAAY,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAC9B,6CAA6C;QAC7C,IAAI,YAAY,KAAK,OAAO,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,KAAK,EAAE,GAAG,EAAE;YACR,SAAS,GAAG,SAAS,CAAC;YACtB,MAAM,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;KAC7B,CAAC;IAEF,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/cjs/lazy/promise.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LazyPromise = void 0;
|
|
4
4
|
const disposer_js_1 = require("../functions/disposer.js");
|
|
5
|
+
const safe_js_1 = require("../functions/safe.js");
|
|
5
6
|
/**
|
|
6
7
|
* Asynchronous lazy-loading container that initializes via a promise-based factory.
|
|
7
8
|
* Handles concurrent operations with "latest wins" semantics: multiple refreshes are automatically
|
|
@@ -29,6 +30,10 @@ class LazyPromise {
|
|
|
29
30
|
get isLoading() { return this._state; }
|
|
30
31
|
get hasValue() { return this._state === false; }
|
|
31
32
|
get error() { return this._error; }
|
|
33
|
+
/** @deprecated Use {@link error} instead. */
|
|
34
|
+
get errorMessage() {
|
|
35
|
+
return this._error != null ? (0, safe_js_1.formatError)(this._error) : null;
|
|
36
|
+
}
|
|
32
37
|
get promise() {
|
|
33
38
|
this.ensureInstanceLoading();
|
|
34
39
|
return this._promise;
|
|
@@ -165,7 +170,9 @@ class LazyPromise {
|
|
|
165
170
|
}
|
|
166
171
|
if (nextState !== undefined) {
|
|
167
172
|
if (this._isAsyncStateChange) {
|
|
168
|
-
|
|
173
|
+
Promise.resolve().then(() => {
|
|
174
|
+
this.updateState(nextState);
|
|
175
|
+
});
|
|
169
176
|
}
|
|
170
177
|
else {
|
|
171
178
|
this.updateState(nextState);
|
|
@@ -177,7 +184,16 @@ class LazyPromise {
|
|
|
177
184
|
// Case when refreshing already is happening - we have an active promise
|
|
178
185
|
return;
|
|
179
186
|
}
|
|
180
|
-
|
|
187
|
+
let factoryResult;
|
|
188
|
+
try {
|
|
189
|
+
factoryResult = this._factory(refreshing);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
// Re-throwing the original error from the synchronous factory call
|
|
193
|
+
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
|
|
194
|
+
factoryResult = Promise.reject(err);
|
|
195
|
+
}
|
|
196
|
+
const factoryPromise = Promise.resolve(factoryResult)
|
|
181
197
|
.then(res => {
|
|
182
198
|
if (!this._activeFactoryPromise) {
|
|
183
199
|
// this promise was abandoned: was superseded or reset called
|
|
@@ -196,10 +212,15 @@ class LazyPromise {
|
|
|
196
212
|
return this._activeFactoryPromise;
|
|
197
213
|
})
|
|
198
214
|
.catch(err => {
|
|
199
|
-
if (!this._activeFactoryPromise
|
|
215
|
+
if (!this._activeFactoryPromise) {
|
|
216
|
+
// Abandoned (reset/dispose was called) — don't corrupt state
|
|
217
|
+
return this._instance ?? this._initial;
|
|
218
|
+
}
|
|
219
|
+
if (this._activeFactoryPromise === factoryPromise) {
|
|
200
220
|
return this.onRejected(err);
|
|
201
221
|
}
|
|
202
|
-
|
|
222
|
+
// Stale promise — delegate to the latest active promise instead of re-throwing
|
|
223
|
+
return this._activeFactoryPromise;
|
|
203
224
|
});
|
|
204
225
|
const hadActive = !!this._activeFactoryPromise;
|
|
205
226
|
// This is now the active promise - any previous one is superseded
|
|
@@ -224,20 +245,11 @@ class LazyPromise {
|
|
|
224
245
|
this._state = isLoading;
|
|
225
246
|
}
|
|
226
247
|
setError(err) {
|
|
227
|
-
this._error =
|
|
248
|
+
this._error = err;
|
|
228
249
|
}
|
|
229
250
|
clearError() {
|
|
230
251
|
this._error = null;
|
|
231
252
|
}
|
|
232
|
-
parseError(err) {
|
|
233
|
-
if (typeof err === 'string') {
|
|
234
|
-
return err;
|
|
235
|
-
}
|
|
236
|
-
if (err instanceof Error) {
|
|
237
|
-
return err.message;
|
|
238
|
-
}
|
|
239
|
-
return String(err) || 'Unknown error';
|
|
240
|
-
}
|
|
241
253
|
}
|
|
242
254
|
exports.LazyPromise = LazyPromise;
|
|
243
255
|
//# sourceMappingURL=promise.js.map
|
package/cjs/lazy/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":";;;AAAA,0DAAwE;
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
19
19
|
_batch = null;
|
|
20
20
|
_invalidationConfig = null;
|
|
21
21
|
_onError = null;
|
|
22
|
+
_initialValueFactory = null;
|
|
22
23
|
/**
|
|
23
24
|
* Creates an instance of PromiseCache.
|
|
24
25
|
* @param fetcher Function to fetch data by key.
|
|
@@ -47,10 +48,12 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
47
48
|
* This is a convenience wrapper around {@link useInvalidation}.
|
|
48
49
|
*
|
|
49
50
|
* @param ms Time in milliseconds after which the item will be considered invalid. If null, auto-invalidation is disabled.
|
|
50
|
-
*
|
|
51
|
+
*
|
|
52
|
+
* @deprecated The `keepInstance` parameter is deprecated and ignored — stale values are now always kept during invalidation.
|
|
53
|
+
* Use `invalidate()` followed by `get()` if you need to clear the stale value before re-fetching.
|
|
51
54
|
*/
|
|
52
|
-
useInvalidationTime(ms,
|
|
53
|
-
return this.useInvalidation(ms != null ? { expirationMs: ms
|
|
55
|
+
useInvalidationTime(ms, _keepInstance) {
|
|
56
|
+
return this.useInvalidation(ms != null ? { expirationMs: ms } : null);
|
|
54
57
|
}
|
|
55
58
|
/**
|
|
56
59
|
* Configures advanced invalidation policy.
|
|
@@ -73,6 +76,25 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
73
76
|
this._onError = callback;
|
|
74
77
|
return this;
|
|
75
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Sets a default/initial value returned before the fetch completes or on error when no stale value exists.
|
|
81
|
+
*
|
|
82
|
+
* Accepts either a static value or a per-key factory function `(key: K) => TInitial`.
|
|
83
|
+
* The value is **not** stored in the cache — it's a synthetic default (same as `LazyPromise`'s initial value).
|
|
84
|
+
*
|
|
85
|
+
* **Note:** Functions are always interpreted as factories. If `T` is a function type,
|
|
86
|
+
* wrap it: `useInitialValue((key) => myFallbackFn)`.
|
|
87
|
+
*
|
|
88
|
+
* @param initial A value (non-function) or `(key: K) => TInitial` factory.
|
|
89
|
+
* @returns `this` for chaining.
|
|
90
|
+
*/
|
|
91
|
+
useInitialValue(initial) {
|
|
92
|
+
const self = this;
|
|
93
|
+
self._initialValueFactory = typeof initial === 'function'
|
|
94
|
+
? initial
|
|
95
|
+
: (_key) => initial;
|
|
96
|
+
return self;
|
|
97
|
+
}
|
|
76
98
|
// ─── Core implementation ─────────────────────────────────────────────
|
|
77
99
|
/**
|
|
78
100
|
* Returns a promise that resolves to the cached value of the item if loaded already, otherwise starts fetching and the promise will be resolved to the final value.
|
|
@@ -86,16 +108,37 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
86
108
|
const { item, key, isInvalid } = this._getCurrent(id);
|
|
87
109
|
// return cached item if it's not invalidated
|
|
88
110
|
if (item !== undefined && !isInvalid) {
|
|
89
|
-
this.logger.log(key, 'get: item resolved to', item
|
|
111
|
+
this.logger.log(key, 'get: item resolved to', item);
|
|
90
112
|
return Promise.resolve(item);
|
|
91
113
|
}
|
|
114
|
+
// Join an existing in-flight fetch/refresh if one exists
|
|
92
115
|
let promise = this._fetchCache.get(key);
|
|
93
116
|
if (promise != null) {
|
|
94
117
|
this.logger.log(key, 'get: item resolved to <promise>');
|
|
95
118
|
return promise;
|
|
96
119
|
}
|
|
97
120
|
this.setStatus(key, true);
|
|
98
|
-
promise = this._doFetchAsync(id, key);
|
|
121
|
+
promise = this._doFetchAsync(id, key, false);
|
|
122
|
+
this.setPromise(key, promise);
|
|
123
|
+
return promise;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Re-fetches the value for the specified key while keeping the stale cached value available.
|
|
127
|
+
*
|
|
128
|
+
* Does not change the loading status — consumers reading `getCurrent()` / `getLazy().value`
|
|
129
|
+
* continue to see the stale value as if nothing happened.
|
|
130
|
+
*
|
|
131
|
+
* Implements "latest wins" concurrency: if multiple refreshes are called concurrently,
|
|
132
|
+
* all promises resolve to the value from the latest refresh.
|
|
133
|
+
*
|
|
134
|
+
* On error, the stale value is preserved and the error is stored.
|
|
135
|
+
*
|
|
136
|
+
* @param id The key of the item to refresh.
|
|
137
|
+
* @returns A promise resolving to the refreshed value, or the stale value on error.
|
|
138
|
+
*/
|
|
139
|
+
refresh(id) {
|
|
140
|
+
const key = this._pk(id);
|
|
141
|
+
const promise = this._doFetchAsync(id, key, true);
|
|
99
142
|
this.setPromise(key, promise);
|
|
100
143
|
return promise;
|
|
101
144
|
}
|
|
@@ -105,17 +148,21 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
105
148
|
super.clear();
|
|
106
149
|
}
|
|
107
150
|
// ─── Protected overrides ─────────────────────────────────────────────
|
|
151
|
+
_getInitialValue(id) {
|
|
152
|
+
return this._initialValueFactory ? this._initialValueFactory(id) : undefined;
|
|
153
|
+
}
|
|
108
154
|
_getCurrent(id) {
|
|
109
155
|
const key = this._pk(id);
|
|
110
156
|
const isInvalid = this.getIsInvalidated(key);
|
|
111
157
|
// make sure current item is hooked here from the cache (required by observers)
|
|
112
158
|
const item = this._itemsCache.get(key);
|
|
113
|
-
const keepInstance = !!this._invalidationConfig?.keepInstance;
|
|
114
159
|
if (isInvalid) {
|
|
115
160
|
this.logger.log(key, 'item is invalidated');
|
|
116
161
|
}
|
|
117
162
|
return {
|
|
118
|
-
|
|
163
|
+
// Always keep the stale value visible — stale-while-revalidate by default.
|
|
164
|
+
// Use `invalidate()` + `get()` to clear the stale value before re-fetching.
|
|
165
|
+
item,
|
|
119
166
|
key,
|
|
120
167
|
isInvalid,
|
|
121
168
|
};
|
|
@@ -149,53 +196,87 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
149
196
|
}
|
|
150
197
|
// ─── Private ─────────────────────────────────────────────────────────
|
|
151
198
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
199
|
+
* Unified fetch method with "latest wins" semantics.
|
|
200
|
+
*
|
|
201
|
+
* - Tracks the active factory promise per key via `_activeFetchPromises`.
|
|
202
|
+
* - If superseded by a newer fetch, delegates to the newer promise.
|
|
203
|
+
* - On error, preserves the stale cached value.
|
|
204
|
+
*
|
|
205
|
+
* @param id The original key.
|
|
206
|
+
* @param key The string cache key.
|
|
207
|
+
* @returns A promise resolving to the fetched/refreshed value, or the stale value on error.
|
|
156
208
|
*/
|
|
157
|
-
async _doFetchAsync(id, key) {
|
|
209
|
+
async _doFetchAsync(id, key, refreshing) {
|
|
158
210
|
let isInSameVersion = true;
|
|
211
|
+
let isLatest = false;
|
|
159
212
|
try {
|
|
160
213
|
this.onBeforeFetch(key);
|
|
161
214
|
const v = this._version;
|
|
215
|
+
// Create the factory promise and mark it as the active one for this key (latest wins)
|
|
216
|
+
const factoryPromise = this.tryFetchInBatch(id, refreshing);
|
|
217
|
+
this._activeFetchPromises.set(key, factoryPromise);
|
|
162
218
|
let res;
|
|
163
219
|
let fetchFailed = false;
|
|
164
220
|
try {
|
|
165
|
-
res = await
|
|
221
|
+
res = await factoryPromise;
|
|
166
222
|
}
|
|
167
223
|
catch (err) {
|
|
168
224
|
this._handleError(id, err);
|
|
169
225
|
fetchFailed = true;
|
|
170
|
-
res =
|
|
226
|
+
res = undefined;
|
|
171
227
|
}
|
|
172
228
|
if (v !== this._version) {
|
|
173
229
|
isInSameVersion = false;
|
|
230
|
+
this._activeFetchPromises.delete(key);
|
|
174
231
|
// resolve with actual result but don't store it
|
|
175
|
-
return res;
|
|
232
|
+
return res ?? this._getInitialValue(id);
|
|
233
|
+
}
|
|
234
|
+
// Check if this is still the active (latest) fetch for this key
|
|
235
|
+
isLatest = this._activeFetchPromises.get(key) === factoryPromise;
|
|
236
|
+
if (!isLatest) {
|
|
237
|
+
// Superseded by a newer refresh/fetch — delegate to the latest public promise.
|
|
238
|
+
// This ensures anyone awaiting this old promise gets the fresh value,
|
|
239
|
+
// mirroring LazyPromise's "latest wins" behavior.
|
|
240
|
+
const newerPromise = this._fetchCache.get(key);
|
|
241
|
+
if (newerPromise) {
|
|
242
|
+
// Catch errors from the newer promise — if it fails, fall back to stale/initial value.
|
|
243
|
+
return newerPromise.catch(() => this._itemsCache.get(key) ?? this._getInitialValue(id));
|
|
244
|
+
}
|
|
245
|
+
// Fallback: return current cached value or initial
|
|
246
|
+
return this._itemsCache.get(key) ?? this._getInitialValue(id);
|
|
176
247
|
}
|
|
177
|
-
|
|
248
|
+
// We are the latest — clean up tracking
|
|
249
|
+
this._activeFetchPromises.delete(key);
|
|
250
|
+
if (!fetchFailed && res !== undefined) {
|
|
178
251
|
this.logger.log(key, 'item\'s <promise> resolved to', res);
|
|
179
252
|
res = this.prepareResult(res);
|
|
180
|
-
|
|
181
|
-
this.storeResult(key, res);
|
|
182
|
-
}
|
|
253
|
+
this.storeResult(key, res);
|
|
183
254
|
}
|
|
184
|
-
|
|
255
|
+
else if (fetchFailed) {
|
|
256
|
+
// Keep stale value — return whatever is in cache, or initial value
|
|
257
|
+
return this._itemsCache.get(key) ?? this._getInitialValue(id);
|
|
258
|
+
}
|
|
259
|
+
return res ?? this._getInitialValue(id);
|
|
185
260
|
}
|
|
186
261
|
finally {
|
|
187
|
-
if (isInSameVersion) {
|
|
262
|
+
if (!isInSameVersion) {
|
|
263
|
+
this.logger.log(key, 'skipping item\'s resolve due to version change ("clear()" has been called)');
|
|
264
|
+
}
|
|
265
|
+
else if (isLatest) {
|
|
266
|
+
// Only the latest fetch should clean up the fetch state.
|
|
267
|
+
// Superseded fetches delegate to the latest and should not
|
|
268
|
+
// prematurely clear the fetch cache or loading status.
|
|
188
269
|
this.onFetchComplete(key);
|
|
189
270
|
}
|
|
190
271
|
else {
|
|
191
|
-
this.
|
|
272
|
+
this.onFetchSuperseded(key);
|
|
192
273
|
}
|
|
193
274
|
}
|
|
194
275
|
}
|
|
195
276
|
/** Performs a fetch operation in batch mode if available, otherwise uses the regular fetch. Throws on error. */
|
|
196
|
-
async tryFetchInBatch(id) {
|
|
277
|
+
async tryFetchInBatch(id, refreshing) {
|
|
197
278
|
if (!this._batch) {
|
|
198
|
-
return this.fetcher(id);
|
|
279
|
+
return this.fetcher(id, refreshing);
|
|
199
280
|
}
|
|
200
281
|
const res = await this._batch.push(id)
|
|
201
282
|
.catch(err => {
|
|
@@ -204,7 +285,7 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
204
285
|
});
|
|
205
286
|
if (!res || !res.result || res.result[res.index] === undefined) {
|
|
206
287
|
// batch call failed or returned no result — fallback to the direct fetcher
|
|
207
|
-
return this.fetcher(id);
|
|
288
|
+
return this.fetcher(id, refreshing);
|
|
208
289
|
}
|
|
209
290
|
return res.result[res.index];
|
|
210
291
|
}
|
|
@@ -224,9 +305,12 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
224
305
|
}
|
|
225
306
|
/**
|
|
226
307
|
* Enforces the max items limit by removing items to make room.
|
|
227
|
-
* Strategy: first removes invalid items, then oldest valid items.
|
|
308
|
+
* Strategy: first removes invalid items, then oldest valid items by timestamp.
|
|
228
309
|
* Items currently being fetched (in-flight) are not evicted.
|
|
229
310
|
*
|
|
311
|
+
* Note: Phase 2 scans all timestamps linearly (O(n) per eviction).
|
|
312
|
+
* This is acceptable for typical `maxItems` values (up to ~1000).
|
|
313
|
+
*
|
|
230
314
|
* @param incomingKey The key of the item about to be stored (excluded from eviction).
|
|
231
315
|
*/
|
|
232
316
|
_enforceMaxItems(incomingKey) {
|
|
@@ -251,6 +335,7 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
251
335
|
this._set(key, undefined, undefined, undefined);
|
|
252
336
|
this._errorsMap.delete(key);
|
|
253
337
|
this._timestamps.delete(key);
|
|
338
|
+
this._activeFetchPromises.delete(key);
|
|
254
339
|
if (this._itemsCache.size < maxItems) {
|
|
255
340
|
return;
|
|
256
341
|
}
|
|
@@ -274,6 +359,7 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
274
359
|
this._set(oldestKey, undefined, undefined, undefined);
|
|
275
360
|
this._timestamps.delete(oldestKey);
|
|
276
361
|
this._errorsMap.delete(oldestKey);
|
|
362
|
+
this._activeFetchPromises.delete(oldestKey);
|
|
277
363
|
}
|
|
278
364
|
else {
|
|
279
365
|
// No evictable items found (all are in-flight or incoming)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/cache.ts"],"names":[],"mappings":";;;AAAA,6DAAgE;AAChE,uCAA6C;AAG7C,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;;;;;;;EASE;AACF,MAAa,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/cache.ts"],"names":[],"mappings":"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"}
|