@zajno/common 2.8.9 → 2.8.11
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 +2 -2
- package/cjs/lazy/promise.js +26 -5
- package/cjs/lazy/promise.js.map +1 -1
- package/cjs/structures/promiseCache/cache.js +124 -48
- package/cjs/structures/promiseCache/cache.js.map +1 -1
- package/cjs/structures/promiseCache/core.js +73 -37
- package/cjs/structures/promiseCache/core.js.map +1 -1
- package/esm/lazy/promise.js +26 -5
- package/esm/lazy/promise.js.map +1 -1
- package/esm/structures/promiseCache/cache.js +124 -48
- package/esm/structures/promiseCache/cache.js.map +1 -1
- package/esm/structures/promiseCache/core.js +73 -37
- package/esm/structures/promiseCache/core.js.map +1 -1
- package/package.json +4 -4
- package/types/lazy/promise.d.ts +6 -3
- package/types/lazy/types.d.ts +41 -5
- package/types/structures/promiseCache/cache.d.ts +54 -19
- package/types/structures/promiseCache/core.d.ts +56 -25
- package/types/structures/promiseCache/types.d.ts +17 -1
- package/types/structures/tempoCache.d.ts +1 -1
|
@@ -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.
|
|
@@ -80,19 +102,48 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
80
102
|
* @returns A promise that resolves to the result, whether it's cached or freshly fetched.
|
|
81
103
|
*/
|
|
82
104
|
get(id) {
|
|
83
|
-
const
|
|
105
|
+
const key = this._pk(id);
|
|
84
106
|
// return cached item if it's not invalidated
|
|
85
|
-
if (
|
|
86
|
-
this.
|
|
107
|
+
if (this._itemsCache.has(key) && !this.getIsInvalidated(key)) {
|
|
108
|
+
const item = this._itemsCache.get(key);
|
|
109
|
+
this.logger.log(key, 'get: item resolved to', item);
|
|
87
110
|
return Promise.resolve(item);
|
|
88
111
|
}
|
|
112
|
+
// Join an existing in-flight fetch/refresh if one exists
|
|
89
113
|
let promise = this._fetchCache.get(key);
|
|
90
114
|
if (promise != null) {
|
|
91
115
|
this.logger.log(key, 'get: item resolved to <promise>');
|
|
92
116
|
return promise;
|
|
93
117
|
}
|
|
118
|
+
// If a fetch is in progress or already completed (with error) and not invalidated,
|
|
119
|
+
// don't start a new fetch — error is "sticky". Use refresh() or invalidate() to retry.
|
|
120
|
+
if (this._itemsStatus.has(key) && !this.getIsInvalidated(key)) {
|
|
121
|
+
const status = this._itemsStatus.get(key);
|
|
122
|
+
this.logger.log(key, 'get: fetch already', status ? 'in progress' : 'completed (error)', '— returning initial value');
|
|
123
|
+
return Promise.resolve(this._getInitialValue(id));
|
|
124
|
+
}
|
|
94
125
|
this.setStatus(key, true);
|
|
95
|
-
promise = this._doFetchAsync(id, key);
|
|
126
|
+
promise = this._doFetchAsync(id, key, false);
|
|
127
|
+
this.setPromise(key, promise);
|
|
128
|
+
return promise;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Re-fetches the value for the specified key while keeping the stale cached value available.
|
|
132
|
+
*
|
|
133
|
+
* Does not change the loading status — consumers reading `getCurrent()` / `getLazy().value`
|
|
134
|
+
* continue to see the stale value as if nothing happened.
|
|
135
|
+
*
|
|
136
|
+
* Implements "latest wins" concurrency: if multiple refreshes are called concurrently,
|
|
137
|
+
* all promises resolve to the value from the latest refresh.
|
|
138
|
+
*
|
|
139
|
+
* On error, the stale value is preserved and the error is stored.
|
|
140
|
+
*
|
|
141
|
+
* @param id The key of the item to refresh.
|
|
142
|
+
* @returns A promise resolving to the refreshed value, or the stale value on error.
|
|
143
|
+
*/
|
|
144
|
+
refresh(id) {
|
|
145
|
+
const key = this._pk(id);
|
|
146
|
+
const promise = this._doFetchAsync(id, key, true);
|
|
96
147
|
this.setPromise(key, promise);
|
|
97
148
|
return promise;
|
|
98
149
|
}
|
|
@@ -102,20 +153,8 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
102
153
|
super.clear();
|
|
103
154
|
}
|
|
104
155
|
// ─── Protected overrides ─────────────────────────────────────────────
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const isInvalid = this.getIsInvalidated(key);
|
|
108
|
-
// make sure current item is hooked here from the cache (required by observers)
|
|
109
|
-
const item = this._itemsCache.get(key);
|
|
110
|
-
const keepInstance = !!this._invalidationConfig?.keepInstance;
|
|
111
|
-
if (isInvalid) {
|
|
112
|
-
this.logger.log(key, 'item is invalidated');
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
item: (isInvalid && !keepInstance) ? undefined : item,
|
|
116
|
-
key,
|
|
117
|
-
isInvalid,
|
|
118
|
-
};
|
|
156
|
+
_getInitialValue(id) {
|
|
157
|
+
return this._initialValueFactory ? this._initialValueFactory(id) : undefined;
|
|
119
158
|
}
|
|
120
159
|
getIsInvalidated(key) {
|
|
121
160
|
const config = this._invalidationConfig;
|
|
@@ -131,9 +170,9 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
131
170
|
}
|
|
132
171
|
}
|
|
133
172
|
// Check callback-based invalidation
|
|
134
|
-
if (config.invalidationCheck) {
|
|
173
|
+
if (config.invalidationCheck && this._itemsCache.has(key)) {
|
|
135
174
|
const value = this._itemsCache.get(key);
|
|
136
|
-
if (
|
|
175
|
+
if (config.invalidationCheck(key, value, ts ?? 0)) {
|
|
137
176
|
return true;
|
|
138
177
|
}
|
|
139
178
|
}
|
|
@@ -146,53 +185,85 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
146
185
|
}
|
|
147
186
|
// ─── Private ─────────────────────────────────────────────────────────
|
|
148
187
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
188
|
+
* Unified fetch method with "latest wins" semantics.
|
|
189
|
+
*
|
|
190
|
+
* - Tracks the active factory promise per key via `_activeFetchPromises`.
|
|
191
|
+
* - If superseded by a newer fetch, delegates to the newer promise.
|
|
192
|
+
* - On error, preserves the stale cached value.
|
|
193
|
+
*
|
|
194
|
+
* @param id The original key.
|
|
195
|
+
* @param key The string cache key.
|
|
196
|
+
* @returns A promise resolving to the fetched/refreshed value, or the stale value on error.
|
|
153
197
|
*/
|
|
154
|
-
async _doFetchAsync(id, key) {
|
|
198
|
+
async _doFetchAsync(id, key, refreshing) {
|
|
155
199
|
let isInSameVersion = true;
|
|
200
|
+
let isLatest = false;
|
|
156
201
|
try {
|
|
157
202
|
this.onBeforeFetch(key);
|
|
158
203
|
const v = this._version;
|
|
159
|
-
|
|
160
|
-
|
|
204
|
+
// Create the factory promise and mark it as the active one for this key (latest wins)
|
|
205
|
+
const factoryPromise = this.tryFetchInBatch(id, refreshing);
|
|
206
|
+
this._activeFetchPromises.set(key, factoryPromise);
|
|
207
|
+
let fetchResult;
|
|
161
208
|
try {
|
|
162
|
-
|
|
209
|
+
fetchResult = { ok: true, value: await factoryPromise };
|
|
163
210
|
}
|
|
164
211
|
catch (err) {
|
|
165
212
|
this._handleError(id, err);
|
|
166
|
-
|
|
167
|
-
res = undefined;
|
|
213
|
+
fetchResult = { ok: false };
|
|
168
214
|
}
|
|
169
215
|
if (v !== this._version) {
|
|
170
216
|
isInSameVersion = false;
|
|
217
|
+
this._activeFetchPromises.delete(key);
|
|
171
218
|
// resolve with actual result but don't store it
|
|
172
|
-
return
|
|
219
|
+
return fetchResult.ok ? fetchResult.value : this._getInitialValue(id);
|
|
173
220
|
}
|
|
174
|
-
if
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
221
|
+
// Check if this is still the active (latest) fetch for this key
|
|
222
|
+
isLatest = this._activeFetchPromises.get(key) === factoryPromise;
|
|
223
|
+
if (!isLatest) {
|
|
224
|
+
// Superseded by a newer refresh/fetch — delegate to the latest public promise.
|
|
225
|
+
// This ensures anyone awaiting this old promise gets the fresh value,
|
|
226
|
+
// mirroring LazyPromise's "latest wins" behavior.
|
|
227
|
+
const newerPromise = this._fetchCache.get(key);
|
|
228
|
+
if (newerPromise) {
|
|
229
|
+
// Catch errors from the newer promise — if it fails, fall back to stale/initial value.
|
|
230
|
+
return newerPromise.catch(() => this._getCachedOrInitial(key, id));
|
|
179
231
|
}
|
|
232
|
+
// Fallback: return current cached value or initial
|
|
233
|
+
return this._getCachedOrInitial(key, id);
|
|
234
|
+
}
|
|
235
|
+
// We are the latest — clean up tracking
|
|
236
|
+
this._activeFetchPromises.delete(key);
|
|
237
|
+
if (fetchResult.ok) {
|
|
238
|
+
const res = this.prepareResult(fetchResult.value);
|
|
239
|
+
this.logger.log(key, 'item\'s <promise> resolved to', res);
|
|
240
|
+
this.storeResult(key, res);
|
|
241
|
+
return res;
|
|
180
242
|
}
|
|
181
|
-
|
|
243
|
+
// Fetch failed — record timestamp for time-based invalidation expiry,
|
|
244
|
+
// and return stale value or initial.
|
|
245
|
+
this._timestamps.set(key, Date.now());
|
|
246
|
+
return this._getCachedOrInitial(key, id);
|
|
182
247
|
}
|
|
183
248
|
finally {
|
|
184
|
-
if (isInSameVersion) {
|
|
249
|
+
if (!isInSameVersion) {
|
|
250
|
+
this.logger.log(key, 'skipping item\'s resolve due to version change ("clear()" has been called)');
|
|
251
|
+
}
|
|
252
|
+
else if (isLatest) {
|
|
253
|
+
// Only the latest fetch should clean up the fetch state.
|
|
254
|
+
// Superseded fetches delegate to the latest and should not
|
|
255
|
+
// prematurely clear the fetch cache or loading status.
|
|
185
256
|
this.onFetchComplete(key);
|
|
186
257
|
}
|
|
187
258
|
else {
|
|
188
|
-
this.
|
|
259
|
+
this.onFetchSuperseded(key);
|
|
189
260
|
}
|
|
190
261
|
}
|
|
191
262
|
}
|
|
192
263
|
/** Performs a fetch operation in batch mode if available, otherwise uses the regular fetch. Throws on error. */
|
|
193
|
-
async tryFetchInBatch(id) {
|
|
264
|
+
async tryFetchInBatch(id, refreshing) {
|
|
194
265
|
if (!this._batch) {
|
|
195
|
-
return this.fetcher(id);
|
|
266
|
+
return this.fetcher(id, refreshing);
|
|
196
267
|
}
|
|
197
268
|
const res = await this._batch.push(id)
|
|
198
269
|
.catch(err => {
|
|
@@ -201,7 +272,7 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
201
272
|
});
|
|
202
273
|
if (!res || !res.result || res.result[res.index] === undefined) {
|
|
203
274
|
// batch call failed or returned no result — fallback to the direct fetcher
|
|
204
|
-
return this.fetcher(id);
|
|
275
|
+
return this.fetcher(id, refreshing);
|
|
205
276
|
}
|
|
206
277
|
return res.result[res.index];
|
|
207
278
|
}
|
|
@@ -221,9 +292,12 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
221
292
|
}
|
|
222
293
|
/**
|
|
223
294
|
* Enforces the max items limit by removing items to make room.
|
|
224
|
-
* Strategy: first removes invalid items, then oldest valid items.
|
|
295
|
+
* Strategy: first removes invalid items, then oldest valid items by timestamp.
|
|
225
296
|
* Items currently being fetched (in-flight) are not evicted.
|
|
226
297
|
*
|
|
298
|
+
* Note: Phase 2 scans all timestamps linearly (O(n) per eviction).
|
|
299
|
+
* This is acceptable for typical `maxItems` values (up to ~1000).
|
|
300
|
+
*
|
|
227
301
|
* @param incomingKey The key of the item about to be stored (excluded from eviction).
|
|
228
302
|
*/
|
|
229
303
|
_enforceMaxItems(incomingKey) {
|
|
@@ -245,9 +319,10 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
245
319
|
}
|
|
246
320
|
}
|
|
247
321
|
for (const key of invalidKeys) {
|
|
248
|
-
this.
|
|
322
|
+
this._deleteKey(key);
|
|
249
323
|
this._errorsMap.delete(key);
|
|
250
324
|
this._timestamps.delete(key);
|
|
325
|
+
this._activeFetchPromises.delete(key);
|
|
251
326
|
if (this._itemsCache.size < maxItems) {
|
|
252
327
|
return;
|
|
253
328
|
}
|
|
@@ -268,9 +343,10 @@ export class PromiseCache extends PromiseCacheCore {
|
|
|
268
343
|
}
|
|
269
344
|
}
|
|
270
345
|
if (oldestKey != null) {
|
|
271
|
-
this.
|
|
346
|
+
this._deleteKey(oldestKey);
|
|
272
347
|
this._timestamps.delete(oldestKey);
|
|
273
348
|
this._errorsMap.delete(oldestKey);
|
|
349
|
+
this._activeFetchPromises.delete(oldestKey);
|
|
274
350
|
}
|
|
275
351
|
else {
|
|
276
352
|
// 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,30 +142,37 @@ 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
|
|
136
149
|
const self = this;
|
|
137
|
-
|
|
150
|
+
const lazy = {
|
|
138
151
|
get value() { return self.getCurrent(key); },
|
|
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) && self.
|
|
155
|
+
return self._itemsCache.has(k) && !self._errorsMap.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
|
-
|
|
169
|
+
return self.refresh(key);
|
|
170
|
+
},
|
|
171
|
+
hasResolvedValue() {
|
|
172
|
+
return lazy.hasValue;
|
|
154
173
|
},
|
|
155
174
|
};
|
|
175
|
+
return lazy;
|
|
156
176
|
}
|
|
157
177
|
/**
|
|
158
178
|
* Returns a {@link DeferredGetter} object for a specified key.
|
|
@@ -175,7 +195,11 @@ export class PromiseCacheCore extends Loggable {
|
|
|
175
195
|
/**
|
|
176
196
|
* Returns the loading state of an item.
|
|
177
197
|
*
|
|
178
|
-
*
|
|
198
|
+
* Note: background refreshes via `refresh()` do **not** update per-key loading status.
|
|
199
|
+
* This method only reflects fetches initiated by `get()`. Use `loadingCount` for
|
|
200
|
+
* a global indicator that includes background refreshes.
|
|
201
|
+
*
|
|
202
|
+
* @returns true if loading, false if loading completed, undefined if loading was not started yet (or invalidated).
|
|
179
203
|
*/
|
|
180
204
|
getIsLoading(id) {
|
|
181
205
|
const key = this._pk(id);
|
|
@@ -193,10 +217,7 @@ export class PromiseCacheCore extends Loggable {
|
|
|
193
217
|
*/
|
|
194
218
|
getIsValid(id) {
|
|
195
219
|
const key = this._pk(id);
|
|
196
|
-
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
return !this.getIsInvalidated(key);
|
|
220
|
+
return this._itemsCache.has(key) && !this.getIsInvalidated(key);
|
|
200
221
|
}
|
|
201
222
|
/**
|
|
202
223
|
* Returns the last error that occurred during fetching for the specified key.
|
|
@@ -207,19 +228,20 @@ export class PromiseCacheCore extends Loggable {
|
|
|
207
228
|
const key = this._pk(id);
|
|
208
229
|
return this._errorsMap.get(key) ?? null;
|
|
209
230
|
}
|
|
210
|
-
/** Returns the current cached value, optionally triggering a fetch. */
|
|
231
|
+
/** Returns the current cached value, optionally triggering a fetch. Falls back to the initial value if configured. */
|
|
211
232
|
getCurrent(id, initiateFetch = true) {
|
|
212
|
-
const
|
|
233
|
+
const key = this._pk(id);
|
|
213
234
|
if (initiateFetch) {
|
|
214
235
|
this.get(id);
|
|
215
236
|
}
|
|
216
|
-
this.
|
|
217
|
-
|
|
237
|
+
const result = this._getCachedOrInitial(key, id);
|
|
238
|
+
this.logger.log(key, 'getCurrent: returns', result);
|
|
239
|
+
return result;
|
|
218
240
|
}
|
|
219
241
|
/** Returns true if the item is cached or fetching was initiated. Does not initiate fetching. */
|
|
220
242
|
hasKey(id) {
|
|
221
243
|
const key = this._pk(id);
|
|
222
|
-
return this._itemsCache.
|
|
244
|
+
return this._itemsCache.has(key) || this._itemsStatus.has(key);
|
|
223
245
|
}
|
|
224
246
|
keys(iterate = false) {
|
|
225
247
|
const iterator = this._itemsCache.keys();
|
|
@@ -246,14 +268,26 @@ export class PromiseCacheCore extends Loggable {
|
|
|
246
268
|
/** Instantly invalidates the cached item for the specified id, like it was never fetched/accessed. */
|
|
247
269
|
invalidate(id) {
|
|
248
270
|
const key = this._pk(id);
|
|
249
|
-
this.
|
|
271
|
+
this._deleteKey(key);
|
|
250
272
|
this._errorsMap.delete(key);
|
|
251
273
|
this._timestamps.delete(key);
|
|
274
|
+
this._activeFetchPromises.delete(key);
|
|
252
275
|
}
|
|
253
|
-
/**
|
|
254
|
-
|
|
276
|
+
/** 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. */
|
|
277
|
+
set(id, value) {
|
|
255
278
|
const key = this._pk(id);
|
|
256
|
-
this.
|
|
279
|
+
this._fetchCache.delete(key);
|
|
280
|
+
this._itemsStatus.delete(key);
|
|
281
|
+
this._itemsCache.set(key, value);
|
|
282
|
+
this._timestamps.set(key, Date.now());
|
|
283
|
+
this._errorsMap.delete(key);
|
|
284
|
+
this._activeFetchPromises.delete(key);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* @deprecated Use {@link set} instead.
|
|
288
|
+
*/
|
|
289
|
+
updateValueDirectly(id, value) {
|
|
290
|
+
return this.set(id, value);
|
|
257
291
|
}
|
|
258
292
|
/**
|
|
259
293
|
* Iterates over all cached items and removes those that are invalid (expired).
|
|
@@ -269,9 +303,10 @@ export class PromiseCacheCore extends Loggable {
|
|
|
269
303
|
}
|
|
270
304
|
}
|
|
271
305
|
for (const key of keysToRemove) {
|
|
272
|
-
this.
|
|
306
|
+
this._deleteKey(key);
|
|
273
307
|
this._errorsMap.delete(key);
|
|
274
308
|
this._timestamps.delete(key);
|
|
309
|
+
this._activeFetchPromises.delete(key);
|
|
275
310
|
removed++;
|
|
276
311
|
}
|
|
277
312
|
return removed;
|
|
@@ -285,12 +320,18 @@ export class PromiseCacheCore extends Loggable {
|
|
|
285
320
|
this._fetchCache.clear();
|
|
286
321
|
this._errorsMap.clear();
|
|
287
322
|
this._timestamps.clear();
|
|
323
|
+
this._activeFetchPromises.clear();
|
|
288
324
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
325
|
+
// ─── Protected hooks ─────────────────────────────────────────────────
|
|
326
|
+
/** Returns the cached value if present, otherwise the initial value for the key. */
|
|
327
|
+
_getCachedOrInitial(key, id) {
|
|
328
|
+
return this._itemsCache.has(key) ? this._itemsCache.get(key) : this._getInitialValue(id);
|
|
329
|
+
}
|
|
330
|
+
/** @internal Deletes all cache entries for a key (item, promise, status). */
|
|
331
|
+
_deleteKey(key) {
|
|
332
|
+
this._fetchCache.delete(key);
|
|
333
|
+
this._itemsStatus.delete(key);
|
|
334
|
+
this._itemsCache.delete(key);
|
|
294
335
|
}
|
|
295
336
|
/** Updates the loading status for the specified key. Override to add a hook. */
|
|
296
337
|
setStatus(key, status) {
|
|
@@ -317,18 +358,13 @@ export class PromiseCacheCore extends Loggable {
|
|
|
317
358
|
this._fetchCache.delete(key);
|
|
318
359
|
this._itemsStatus.set(key, false);
|
|
319
360
|
}
|
|
361
|
+
/** Hooks into the superseded fetch cleanup. Only decrements loading count — does not touch fetch cache or status. */
|
|
362
|
+
onFetchSuperseded(_key) {
|
|
363
|
+
this._loadingCount.value = this._loadingCount.value - 1;
|
|
364
|
+
}
|
|
320
365
|
/** Hooks into the result preparation process, before it's stored into the cache. */
|
|
321
366
|
prepareResult(res) {
|
|
322
367
|
return res;
|
|
323
368
|
}
|
|
324
|
-
/** @internal Helper to set or delete a value in a map. */
|
|
325
|
-
static _setMapX(key, map, val) {
|
|
326
|
-
if (val === undefined) {
|
|
327
|
-
map.delete(key);
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
map.set(key, val);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
369
|
}
|
|
334
370
|
//# sourceMappingURL=core.js.map
|
|
@@ -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
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zajno/common",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.11",
|
|
4
4
|
"description": "Zajno's re-usable utilities for JS/TS projects",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/
|
|
9
|
+
"url": "git+https://github.com/idudinov/common-utils.git"
|
|
10
10
|
},
|
|
11
11
|
"author": "Zajno <hello@zajno.com> (https://zajno.com)",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/
|
|
14
|
+
"url": "https://github.com/idudinov/common-utils/issues"
|
|
15
15
|
},
|
|
16
|
-
"homepage": "https://github.com/
|
|
16
|
+
"homepage": "https://github.com/idudinov/common-utils/tree/main/packages/common#readme",
|
|
17
17
|
"scripts": {
|
|
18
18
|
"clean": "scripty",
|
|
19
19
|
"dev": "scripty",
|