@zajno/common 2.8.9 → 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/lazy/promise.js +20 -4
- 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 +50 -13
- package/cjs/structures/promiseCache/core.js.map +1 -1
- package/esm/lazy/promise.js +20 -4
- 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 +50 -13
- package/esm/structures/promiseCache/core.js.map +1 -1
- package/package.json +1 -1
- package/types/lazy/promise.d.ts +2 -2
- package/types/lazy/types.d.ts +10 -4
- package/types/structures/promiseCache/cache.d.ts +54 -14
- package/types/structures/promiseCache/core.d.ts +50 -13
- package/types/structures/promiseCache/types.d.ts +17 -1
- package/types/structures/tempoCache.d.ts +1 -1
package/esm/lazy/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKnD;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAEZ,QAAQ,CAAiB;IAChB,QAAQ,CAAW;IAE5B,SAAS,CAAe;IAEhC,gFAAgF;IACxE,MAAM,GAAmB,IAAI,CAAC;IAE9B,mBAAmB,GAAG,KAAK,CAAC;IAE5B,QAAQ,
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../../src/lazy/promise.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
16
16
|
_batch = null;
|
|
17
17
|
_invalidationConfig = null;
|
|
18
18
|
_onError = null;
|
|
19
|
+
_initialValueFactory = null;
|
|
19
20
|
/**
|
|
20
21
|
* Creates an instance of PromiseCache.
|
|
21
22
|
* @param fetcher Function to fetch data by key.
|
|
@@ -44,10 +45,12 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
44
45
|
* This is a convenience wrapper around {@link useInvalidation}.
|
|
45
46
|
*
|
|
46
47
|
* @param ms Time in milliseconds after which the item will be considered invalid. If null, auto-invalidation is disabled.
|
|
47
|
-
*
|
|
48
|
+
*
|
|
49
|
+
* @deprecated The `keepInstance` parameter is deprecated and ignored — stale values are now always kept during invalidation.
|
|
50
|
+
* Use `invalidate()` followed by `get()` if you need to clear the stale value before re-fetching.
|
|
48
51
|
*/
|
|
49
|
-
useInvalidationTime(ms,
|
|
50
|
-
return this.useInvalidation(ms != null ? { expirationMs: ms
|
|
52
|
+
useInvalidationTime(ms, _keepInstance) {
|
|
53
|
+
return this.useInvalidation(ms != null ? { expirationMs: ms } : null);
|
|
51
54
|
}
|
|
52
55
|
/**
|
|
53
56
|
* Configures advanced invalidation policy.
|
|
@@ -70,6 +73,25 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
70
73
|
this._onError = callback;
|
|
71
74
|
return this;
|
|
72
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Sets a default/initial value returned before the fetch completes or on error when no stale value exists.
|
|
78
|
+
*
|
|
79
|
+
* Accepts either a static value or a per-key factory function `(key: K) => TInitial`.
|
|
80
|
+
* The value is **not** stored in the cache — it's a synthetic default (same as `LazyPromise`'s initial value).
|
|
81
|
+
*
|
|
82
|
+
* **Note:** Functions are always interpreted as factories. If `T` is a function type,
|
|
83
|
+
* wrap it: `useInitialValue((key) => myFallbackFn)`.
|
|
84
|
+
*
|
|
85
|
+
* @param initial A value (non-function) or `(key: K) => TInitial` factory.
|
|
86
|
+
* @returns `this` for chaining.
|
|
87
|
+
*/
|
|
88
|
+
useInitialValue(initial) {
|
|
89
|
+
const self = this;
|
|
90
|
+
self._initialValueFactory = typeof initial === 'function'
|
|
91
|
+
? initial
|
|
92
|
+
: (_key) => initial;
|
|
93
|
+
return self;
|
|
94
|
+
}
|
|
73
95
|
// ─── Core implementation ─────────────────────────────────────────────
|
|
74
96
|
/**
|
|
75
97
|
* 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.
|
|
@@ -83,16 +105,37 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
83
105
|
const { item, key, isInvalid } = this._getCurrent(id);
|
|
84
106
|
// return cached item if it's not invalidated
|
|
85
107
|
if (item !== undefined && !isInvalid) {
|
|
86
|
-
this.logger.log(key, 'get: item resolved to', item
|
|
108
|
+
this.logger.log(key, 'get: item resolved to', item);
|
|
87
109
|
return Promise.resolve(item);
|
|
88
110
|
}
|
|
111
|
+
// Join an existing in-flight fetch/refresh if one exists
|
|
89
112
|
let promise = this._fetchCache.get(key);
|
|
90
113
|
if (promise != null) {
|
|
91
114
|
this.logger.log(key, 'get: item resolved to <promise>');
|
|
92
115
|
return promise;
|
|
93
116
|
}
|
|
94
117
|
this.setStatus(key, true);
|
|
95
|
-
promise = this._doFetchAsync(id, key);
|
|
118
|
+
promise = this._doFetchAsync(id, key, false);
|
|
119
|
+
this.setPromise(key, promise);
|
|
120
|
+
return promise;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Re-fetches the value for the specified key while keeping the stale cached value available.
|
|
124
|
+
*
|
|
125
|
+
* Does not change the loading status — consumers reading `getCurrent()` / `getLazy().value`
|
|
126
|
+
* continue to see the stale value as if nothing happened.
|
|
127
|
+
*
|
|
128
|
+
* Implements "latest wins" concurrency: if multiple refreshes are called concurrently,
|
|
129
|
+
* all promises resolve to the value from the latest refresh.
|
|
130
|
+
*
|
|
131
|
+
* On error, the stale value is preserved and the error is stored.
|
|
132
|
+
*
|
|
133
|
+
* @param id The key of the item to refresh.
|
|
134
|
+
* @returns A promise resolving to the refreshed value, or the stale value on error.
|
|
135
|
+
*/
|
|
136
|
+
refresh(id) {
|
|
137
|
+
const key = this._pk(id);
|
|
138
|
+
const promise = this._doFetchAsync(id, key, true);
|
|
96
139
|
this.setPromise(key, promise);
|
|
97
140
|
return promise;
|
|
98
141
|
}
|
|
@@ -102,17 +145,21 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
102
145
|
super.clear();
|
|
103
146
|
}
|
|
104
147
|
// ─── Protected overrides ─────────────────────────────────────────────
|
|
148
|
+
_getInitialValue(id) {
|
|
149
|
+
return this._initialValueFactory ? this._initialValueFactory(id) : undefined;
|
|
150
|
+
}
|
|
105
151
|
_getCurrent(id) {
|
|
106
152
|
const key = this._pk(id);
|
|
107
153
|
const isInvalid = this.getIsInvalidated(key);
|
|
108
154
|
// make sure current item is hooked here from the cache (required by observers)
|
|
109
155
|
const item = this._itemsCache.get(key);
|
|
110
|
-
const keepInstance = !!this._invalidationConfig?.keepInstance;
|
|
111
156
|
if (isInvalid) {
|
|
112
157
|
this.logger.log(key, 'item is invalidated');
|
|
113
158
|
}
|
|
114
159
|
return {
|
|
115
|
-
|
|
160
|
+
// Always keep the stale value visible — stale-while-revalidate by default.
|
|
161
|
+
// Use `invalidate()` + `get()` to clear the stale value before re-fetching.
|
|
162
|
+
item,
|
|
116
163
|
key,
|
|
117
164
|
isInvalid,
|
|
118
165
|
};
|
|
@@ -146,20 +193,29 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
146
193
|
}
|
|
147
194
|
// ─── Private ─────────────────────────────────────────────────────────
|
|
148
195
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
196
|
+
* Unified fetch method with "latest wins" semantics.
|
|
197
|
+
*
|
|
198
|
+
* - Tracks the active factory promise per key via `_activeFetchPromises`.
|
|
199
|
+
* - If superseded by a newer fetch, delegates to the newer promise.
|
|
200
|
+
* - On error, preserves the stale cached value.
|
|
201
|
+
*
|
|
202
|
+
* @param id The original key.
|
|
203
|
+
* @param key The string cache key.
|
|
204
|
+
* @returns A promise resolving to the fetched/refreshed value, or the stale value on error.
|
|
153
205
|
*/
|
|
154
|
-
async _doFetchAsync(id, key) {
|
|
206
|
+
async _doFetchAsync(id, key, refreshing) {
|
|
155
207
|
let isInSameVersion = true;
|
|
208
|
+
let isLatest = false;
|
|
156
209
|
try {
|
|
157
210
|
this.onBeforeFetch(key);
|
|
158
211
|
const v = this._version;
|
|
212
|
+
// Create the factory promise and mark it as the active one for this key (latest wins)
|
|
213
|
+
const factoryPromise = this.tryFetchInBatch(id, refreshing);
|
|
214
|
+
this._activeFetchPromises.set(key, factoryPromise);
|
|
159
215
|
let res;
|
|
160
216
|
let fetchFailed = false;
|
|
161
217
|
try {
|
|
162
|
-
res = await
|
|
218
|
+
res = await factoryPromise;
|
|
163
219
|
}
|
|
164
220
|
catch (err) {
|
|
165
221
|
this._handleError(id, err);
|
|
@@ -168,31 +224,56 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
168
224
|
}
|
|
169
225
|
if (v !== this._version) {
|
|
170
226
|
isInSameVersion = false;
|
|
227
|
+
this._activeFetchPromises.delete(key);
|
|
171
228
|
// resolve with actual result but don't store it
|
|
172
|
-
return res;
|
|
229
|
+
return res ?? this._getInitialValue(id);
|
|
173
230
|
}
|
|
174
|
-
if
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
231
|
+
// Check if this is still the active (latest) fetch for this key
|
|
232
|
+
isLatest = this._activeFetchPromises.get(key) === factoryPromise;
|
|
233
|
+
if (!isLatest) {
|
|
234
|
+
// Superseded by a newer refresh/fetch — delegate to the latest public promise.
|
|
235
|
+
// This ensures anyone awaiting this old promise gets the fresh value,
|
|
236
|
+
// mirroring LazyPromise's "latest wins" behavior.
|
|
237
|
+
const newerPromise = this._fetchCache.get(key);
|
|
238
|
+
if (newerPromise) {
|
|
239
|
+
// Catch errors from the newer promise — if it fails, fall back to stale/initial value.
|
|
240
|
+
return newerPromise.catch(() => this._itemsCache.get(key) ?? this._getInitialValue(id));
|
|
179
241
|
}
|
|
242
|
+
// Fallback: return current cached value or initial
|
|
243
|
+
return this._itemsCache.get(key) ?? this._getInitialValue(id);
|
|
180
244
|
}
|
|
181
|
-
|
|
245
|
+
// We are the latest — clean up tracking
|
|
246
|
+
this._activeFetchPromises.delete(key);
|
|
247
|
+
if (!fetchFailed && res !== undefined) {
|
|
248
|
+
this.logger.log(key, 'item\'s <promise> resolved to', res);
|
|
249
|
+
res = this.prepareResult(res);
|
|
250
|
+
this.storeResult(key, res);
|
|
251
|
+
}
|
|
252
|
+
else if (fetchFailed) {
|
|
253
|
+
// Keep stale value — return whatever is in cache, or initial value
|
|
254
|
+
return this._itemsCache.get(key) ?? this._getInitialValue(id);
|
|
255
|
+
}
|
|
256
|
+
return res ?? this._getInitialValue(id);
|
|
182
257
|
}
|
|
183
258
|
finally {
|
|
184
|
-
if (isInSameVersion) {
|
|
259
|
+
if (!isInSameVersion) {
|
|
260
|
+
this.logger.log(key, 'skipping item\'s resolve due to version change ("clear()" has been called)');
|
|
261
|
+
}
|
|
262
|
+
else if (isLatest) {
|
|
263
|
+
// Only the latest fetch should clean up the fetch state.
|
|
264
|
+
// Superseded fetches delegate to the latest and should not
|
|
265
|
+
// prematurely clear the fetch cache or loading status.
|
|
185
266
|
this.onFetchComplete(key);
|
|
186
267
|
}
|
|
187
268
|
else {
|
|
188
|
-
this.
|
|
269
|
+
this.onFetchSuperseded(key);
|
|
189
270
|
}
|
|
190
271
|
}
|
|
191
272
|
}
|
|
192
273
|
/** Performs a fetch operation in batch mode if available, otherwise uses the regular fetch. Throws on error. */
|
|
193
|
-
async tryFetchInBatch(id) {
|
|
274
|
+
async tryFetchInBatch(id, refreshing) {
|
|
194
275
|
if (!this._batch) {
|
|
195
|
-
return this.fetcher(id);
|
|
276
|
+
return this.fetcher(id, refreshing);
|
|
196
277
|
}
|
|
197
278
|
const res = await this._batch.push(id)
|
|
198
279
|
.catch(err => {
|
|
@@ -201,7 +282,7 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
201
282
|
});
|
|
202
283
|
if (!res || !res.result || res.result[res.index] === undefined) {
|
|
203
284
|
// batch call failed or returned no result — fallback to the direct fetcher
|
|
204
|
-
return this.fetcher(id);
|
|
285
|
+
return this.fetcher(id, refreshing);
|
|
205
286
|
}
|
|
206
287
|
return res.result[res.index];
|
|
207
288
|
}
|
|
@@ -221,9 +302,12 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
221
302
|
}
|
|
222
303
|
/**
|
|
223
304
|
* Enforces the max items limit by removing items to make room.
|
|
224
|
-
* Strategy: first removes invalid items, then oldest valid items.
|
|
305
|
+
* Strategy: first removes invalid items, then oldest valid items by timestamp.
|
|
225
306
|
* Items currently being fetched (in-flight) are not evicted.
|
|
226
307
|
*
|
|
308
|
+
* Note: Phase 2 scans all timestamps linearly (O(n) per eviction).
|
|
309
|
+
* This is acceptable for typical `maxItems` values (up to ~1000).
|
|
310
|
+
*
|
|
227
311
|
* @param incomingKey The key of the item about to be stored (excluded from eviction).
|
|
228
312
|
*/
|
|
229
313
|
_enforceMaxItems(incomingKey) {
|
|
@@ -248,6 +332,7 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
248
332
|
this._set(key, undefined, undefined, undefined);
|
|
249
333
|
this._errorsMap.delete(key);
|
|
250
334
|
this._timestamps.delete(key);
|
|
335
|
+
this._activeFetchPromises.delete(key);
|
|
251
336
|
if (this._itemsCache.size < maxItems) {
|
|
252
337
|
return;
|
|
253
338
|
}
|
|
@@ -271,6 +356,7 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
271
356
|
this._set(oldestKey, undefined, undefined, undefined);
|
|
272
357
|
this._timestamps.delete(oldestKey);
|
|
273
358
|
this._errorsMap.delete(oldestKey);
|
|
359
|
+
this._activeFetchPromises.delete(oldestKey);
|
|
274
360
|
}
|
|
275
361
|
else {
|
|
276
362
|
// 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,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;;;;;;;EASE;AACF,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatError } from '../../functions/safe.js';
|
|
1
2
|
import { Loggable } from '../../logger/loggable.js';
|
|
2
3
|
import { Model } from '../../models/Model.js';
|
|
3
4
|
/**
|
|
@@ -9,7 +10,7 @@ import { Model } from '../../models/Model.js';
|
|
|
9
10
|
* - promise caching
|
|
10
11
|
* - error storage
|
|
11
12
|
* - timestamps for cached items
|
|
12
|
-
* - direct cache manipulation (invalidate,
|
|
13
|
+
* - direct cache manipulation (invalidate, set, clear)
|
|
13
14
|
* - keys iteration
|
|
14
15
|
*
|
|
15
16
|
* Subclasses are expected to implement fetching logic, invalidation policies, etc.
|
|
@@ -29,6 +30,11 @@ export class PromiseCacheCore extends Loggable {
|
|
|
29
30
|
_errorsMap;
|
|
30
31
|
/** Stores items resolve timestamps (for expiration) in map by id. */
|
|
31
32
|
_timestamps = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Tracks the latest in-flight factory promise per key for "latest wins" refresh semantics.
|
|
35
|
+
* Separate from `_fetchCache` (which stores the public-facing promise returned to callers).
|
|
36
|
+
*/
|
|
37
|
+
_activeFetchPromises = new Map();
|
|
32
38
|
_version = 0;
|
|
33
39
|
constructor(keyAdapter, keyParser) {
|
|
34
40
|
super();
|
|
@@ -41,7 +47,14 @@ export class PromiseCacheCore extends Loggable {
|
|
|
41
47
|
this._errorsMap = this.pure_createErrorsMap();
|
|
42
48
|
}
|
|
43
49
|
// ─── Counts ──────────────────────────────────────────────────────────
|
|
44
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Returns the number of items currently being fetched (includes background refreshes).
|
|
52
|
+
*
|
|
53
|
+
* Note: `loadingCount` includes background refreshes started via `refresh()`,
|
|
54
|
+
* but `getIsLoading(key)` does **not** reflect background refreshes — it only
|
|
55
|
+
* tracks the per-key status set by `get()`. Use `loadingCount` for global
|
|
56
|
+
* "something is loading" indicators.
|
|
57
|
+
*/
|
|
45
58
|
get loadingCount() { return this._loadingCount.value; }
|
|
46
59
|
/** Returns the number of cached items (resolved values). */
|
|
47
60
|
get cachedCount() { return this._itemsCache.size; }
|
|
@@ -129,7 +142,7 @@ export class PromiseCacheCore extends Loggable {
|
|
|
129
142
|
*
|
|
130
143
|
* - `value` / `promise` trigger a fetch if not started.
|
|
131
144
|
* - `currentValue` reads without triggering.
|
|
132
|
-
* - `refresh()`
|
|
145
|
+
* - `refresh()` re-fetches while keeping the stale value available.
|
|
133
146
|
*/
|
|
134
147
|
getLazy(key) {
|
|
135
148
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
@@ -139,18 +152,21 @@ export class PromiseCacheCore extends Loggable {
|
|
|
139
152
|
get currentValue() { return self.getCurrent(key, false); },
|
|
140
153
|
get hasValue() {
|
|
141
154
|
const k = self._pk(key);
|
|
142
|
-
return self._itemsCache.has(k)
|
|
155
|
+
return self._itemsCache.has(k);
|
|
143
156
|
},
|
|
144
157
|
get error() { return self.getLastError(key); },
|
|
145
|
-
|
|
158
|
+
/** @deprecated Use {@link error} instead. */
|
|
159
|
+
get errorMessage() {
|
|
160
|
+
const err = self.getLastError(key);
|
|
161
|
+
return err != null ? formatError(err) : null;
|
|
162
|
+
},
|
|
146
163
|
get isLoading() {
|
|
147
164
|
const v = self.getIsLoading(key);
|
|
148
165
|
return v === undefined ? null : v;
|
|
149
166
|
},
|
|
150
167
|
get promise() { return self.get(key); },
|
|
151
168
|
refresh() {
|
|
152
|
-
self.
|
|
153
|
-
return self.get(key);
|
|
169
|
+
return self.refresh(key);
|
|
154
170
|
},
|
|
155
171
|
};
|
|
156
172
|
}
|
|
@@ -175,7 +191,11 @@ export class PromiseCacheCore extends Loggable {
|
|
|
175
191
|
/**
|
|
176
192
|
* Returns the loading state of an item.
|
|
177
193
|
*
|
|
178
|
-
*
|
|
194
|
+
* Note: background refreshes via `refresh()` do **not** update per-key loading status.
|
|
195
|
+
* This method only reflects fetches initiated by `get()`. Use `loadingCount` for
|
|
196
|
+
* a global indicator that includes background refreshes.
|
|
197
|
+
*
|
|
198
|
+
* @returns true if loading, false if loading completed, undefined if loading was not started yet (or invalidated).
|
|
179
199
|
*/
|
|
180
200
|
getIsLoading(id) {
|
|
181
201
|
const key = this._pk(id);
|
|
@@ -207,14 +227,15 @@ export class PromiseCacheCore extends Loggable {
|
|
|
207
227
|
const key = this._pk(id);
|
|
208
228
|
return this._errorsMap.get(key) ?? null;
|
|
209
229
|
}
|
|
210
|
-
/** Returns the current cached value, optionally triggering a fetch. */
|
|
230
|
+
/** Returns the current cached value, optionally triggering a fetch. Falls back to the initial value if configured. */
|
|
211
231
|
getCurrent(id, initiateFetch = true) {
|
|
212
232
|
const { item, key } = this._getCurrent(id);
|
|
213
233
|
if (initiateFetch) {
|
|
214
234
|
this.get(id);
|
|
215
235
|
}
|
|
216
|
-
|
|
217
|
-
|
|
236
|
+
const result = item ?? this._getInitialValue(id);
|
|
237
|
+
this.logger.log(key, 'getCurrent: returns', result);
|
|
238
|
+
return result;
|
|
218
239
|
}
|
|
219
240
|
/** Returns true if the item is cached or fetching was initiated. Does not initiate fetching. */
|
|
220
241
|
hasKey(id) {
|
|
@@ -249,11 +270,21 @@ export class PromiseCacheCore extends Loggable {
|
|
|
249
270
|
this._set(key, undefined, undefined, undefined);
|
|
250
271
|
this._errorsMap.delete(key);
|
|
251
272
|
this._timestamps.delete(key);
|
|
273
|
+
this._activeFetchPromises.delete(key);
|
|
252
274
|
}
|
|
253
|
-
/**
|
|
254
|
-
|
|
275
|
+
/** Injects a value into the cache for the specified key, as if it had been fetched. Sets the timestamp and clears any previous error. Cancels any in-flight fetch for this key. */
|
|
276
|
+
set(id, value) {
|
|
255
277
|
const key = this._pk(id);
|
|
256
278
|
this._set(key, value, undefined, undefined);
|
|
279
|
+
this._timestamps.set(key, Date.now());
|
|
280
|
+
this._errorsMap.delete(key);
|
|
281
|
+
this._activeFetchPromises.delete(key);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* @deprecated Use {@link set} instead.
|
|
285
|
+
*/
|
|
286
|
+
updateValueDirectly(id, value) {
|
|
287
|
+
return this.set(id, value);
|
|
257
288
|
}
|
|
258
289
|
/**
|
|
259
290
|
* Iterates over all cached items and removes those that are invalid (expired).
|
|
@@ -272,6 +303,7 @@ export class PromiseCacheCore extends Loggable {
|
|
|
272
303
|
this._set(key, undefined, undefined, undefined);
|
|
273
304
|
this._errorsMap.delete(key);
|
|
274
305
|
this._timestamps.delete(key);
|
|
306
|
+
this._activeFetchPromises.delete(key);
|
|
275
307
|
removed++;
|
|
276
308
|
}
|
|
277
309
|
return removed;
|
|
@@ -285,6 +317,7 @@ export class PromiseCacheCore extends Loggable {
|
|
|
285
317
|
this._fetchCache.clear();
|
|
286
318
|
this._errorsMap.clear();
|
|
287
319
|
this._timestamps.clear();
|
|
320
|
+
this._activeFetchPromises.clear();
|
|
288
321
|
}
|
|
289
322
|
/** @internal updates all caches states at once. */
|
|
290
323
|
_set(key, item, promise, isLoading) {
|
|
@@ -317,6 +350,10 @@ export class PromiseCacheCore extends Loggable {
|
|
|
317
350
|
this._fetchCache.delete(key);
|
|
318
351
|
this._itemsStatus.set(key, false);
|
|
319
352
|
}
|
|
353
|
+
/** Hooks into the superseded fetch cleanup. Only decrements loading count — does not touch fetch cache or status. */
|
|
354
|
+
onFetchSuperseded(_key) {
|
|
355
|
+
this._loadingCount.value = this._loadingCount.value - 1;
|
|
356
|
+
}
|
|
320
357
|
/** Hooks into the result preparation process, before it's stored into the cache. */
|
|
321
358
|
prepareResult(res) {
|
|
322
359
|
return res;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI9C;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAgB,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/core.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/types/lazy/promise.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export declare class LazyPromise<T, TInitial extends T | undefined = undefined>
|
|
|
26
26
|
get error(): unknown;
|
|
27
27
|
/** @deprecated Use {@link error} instead. */
|
|
28
28
|
get errorMessage(): string | null;
|
|
29
|
-
get promise(): Promise<T>;
|
|
29
|
+
get promise(): Promise<T | TInitial>;
|
|
30
30
|
get value(): T | TInitial;
|
|
31
31
|
/** Returns current value without triggering loading. */
|
|
32
32
|
get currentValue(): T | TInitial;
|
|
@@ -79,7 +79,7 @@ export declare class LazyPromise<T, TInitial extends T | undefined = undefined>
|
|
|
79
79
|
*
|
|
80
80
|
* @returns Promise resolving to the refreshed value
|
|
81
81
|
*/
|
|
82
|
-
refresh(): Promise<T>;
|
|
82
|
+
refresh(): Promise<T | TInitial>;
|
|
83
83
|
reset(): void;
|
|
84
84
|
dispose(): void;
|
|
85
85
|
private ensureInstanceLoading;
|
package/types/lazy/types.d.ts
CHANGED
|
@@ -23,12 +23,18 @@ export interface ILazyPromise<T, TInitial extends T | undefined = undefined> ext
|
|
|
23
23
|
* Does not trigger loading.
|
|
24
24
|
*/
|
|
25
25
|
readonly isLoading: boolean | null | undefined;
|
|
26
|
-
/**
|
|
27
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Returns the promise for the value, triggering loading if not started.
|
|
28
|
+
*
|
|
29
|
+
* On error, resolves to the current value (stale or initial) instead of rejecting.
|
|
30
|
+
*/
|
|
31
|
+
readonly promise: Promise<T | TInitial>;
|
|
28
32
|
/**
|
|
29
33
|
* Re-executes the factory to get fresh data. If concurrent refreshes occur, the latest wins.
|
|
30
34
|
* All awaiting promises will resolve to the final refreshed value.
|
|
31
35
|
*
|
|
36
|
+
* On error, resolves to the current value (stale or initial) instead of rejecting.
|
|
37
|
+
*
|
|
32
38
|
* **⚠️ Use sparingly:** Only refresh when explicitly needed for fresh data.
|
|
33
39
|
* Over-use defeats lazy loading and caching benefits.
|
|
34
40
|
*
|
|
@@ -43,9 +49,9 @@ export interface ILazyPromise<T, TInitial extends T | undefined = undefined> ext
|
|
|
43
49
|
* - Using instead of cache expiration (use `withExpire`)
|
|
44
50
|
* - Calling in loops or high-frequency events without debouncing
|
|
45
51
|
*
|
|
46
|
-
* @returns Promise resolving to the refreshed value
|
|
52
|
+
* @returns Promise resolving to the refreshed value, or the current value on error
|
|
47
53
|
*/
|
|
48
|
-
refresh(): Promise<T>;
|
|
54
|
+
refresh(): Promise<T | TInitial>;
|
|
49
55
|
}
|
|
50
56
|
/**
|
|
51
57
|
* Controllable lazy promise with manual state management.
|