@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
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Zajno's Toolbox
|
|
2
2
|
|
|
3
|
-
[](https://coveralls.io/github/idudinov/common-utils?branch=main)
|
|
4
4
|
|
|
5
5
|
This is a library with a useful utils/helpers to share across our projects.
|
|
6
6
|
|
|
@@ -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/lazy/promise.js
CHANGED
|
@@ -28,8 +28,13 @@ class LazyPromise {
|
|
|
28
28
|
}
|
|
29
29
|
/** Current loading state: true = loading, false = loaded, null = not started */
|
|
30
30
|
get isLoading() { return this._state; }
|
|
31
|
-
|
|
31
|
+
/** Returns true if a value of type `T` has been successfully loaded (no error). */
|
|
32
|
+
get hasValue() { return this._state === false && this._error == null; }
|
|
32
33
|
get error() { return this._error; }
|
|
34
|
+
/** @inheritdoc */
|
|
35
|
+
hasResolvedValue() {
|
|
36
|
+
return this._state === false && this._error == null;
|
|
37
|
+
}
|
|
33
38
|
/** @deprecated Use {@link error} instead. */
|
|
34
39
|
get errorMessage() {
|
|
35
40
|
return this._error != null ? (0, safe_js_1.formatError)(this._error) : null;
|
|
@@ -170,7 +175,9 @@ class LazyPromise {
|
|
|
170
175
|
}
|
|
171
176
|
if (nextState !== undefined) {
|
|
172
177
|
if (this._isAsyncStateChange) {
|
|
173
|
-
|
|
178
|
+
Promise.resolve().then(() => {
|
|
179
|
+
this.updateState(nextState);
|
|
180
|
+
});
|
|
174
181
|
}
|
|
175
182
|
else {
|
|
176
183
|
this.updateState(nextState);
|
|
@@ -182,7 +189,16 @@ class LazyPromise {
|
|
|
182
189
|
// Case when refreshing already is happening - we have an active promise
|
|
183
190
|
return;
|
|
184
191
|
}
|
|
185
|
-
|
|
192
|
+
let factoryResult;
|
|
193
|
+
try {
|
|
194
|
+
factoryResult = this._factory(refreshing);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
// Re-throwing the original error from the synchronous factory call
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
|
|
199
|
+
factoryResult = Promise.reject(err);
|
|
200
|
+
}
|
|
201
|
+
const factoryPromise = Promise.resolve(factoryResult)
|
|
186
202
|
.then(res => {
|
|
187
203
|
if (!this._activeFactoryPromise) {
|
|
188
204
|
// this promise was abandoned: was superseded or reset called
|
|
@@ -201,10 +217,15 @@ class LazyPromise {
|
|
|
201
217
|
return this._activeFactoryPromise;
|
|
202
218
|
})
|
|
203
219
|
.catch(err => {
|
|
204
|
-
if (!this._activeFactoryPromise
|
|
220
|
+
if (!this._activeFactoryPromise) {
|
|
221
|
+
// Abandoned (reset/dispose was called) — don't corrupt state
|
|
222
|
+
return this._instance ?? this._initial;
|
|
223
|
+
}
|
|
224
|
+
if (this._activeFactoryPromise === factoryPromise) {
|
|
205
225
|
return this.onRejected(err);
|
|
206
226
|
}
|
|
207
|
-
|
|
227
|
+
// Stale promise — delegate to the latest active promise instead of re-throwing
|
|
228
|
+
return this._activeFactoryPromise;
|
|
208
229
|
});
|
|
209
230
|
const hadActive = !!this._activeFactoryPromise;
|
|
210
231
|
// This is now the active promise - any previous one is superseded
|
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;AACxE,kDAAmD;AAKnD;;;;GAIG;AACH,MAAa,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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"}
|
|
@@ -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.
|
|
@@ -83,19 +105,48 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
83
105
|
* @returns A promise that resolves to the result, whether it's cached or freshly fetched.
|
|
84
106
|
*/
|
|
85
107
|
get(id) {
|
|
86
|
-
const
|
|
108
|
+
const key = this._pk(id);
|
|
87
109
|
// return cached item if it's not invalidated
|
|
88
|
-
if (
|
|
89
|
-
this.
|
|
110
|
+
if (this._itemsCache.has(key) && !this.getIsInvalidated(key)) {
|
|
111
|
+
const item = this._itemsCache.get(key);
|
|
112
|
+
this.logger.log(key, 'get: item resolved to', item);
|
|
90
113
|
return Promise.resolve(item);
|
|
91
114
|
}
|
|
115
|
+
// Join an existing in-flight fetch/refresh if one exists
|
|
92
116
|
let promise = this._fetchCache.get(key);
|
|
93
117
|
if (promise != null) {
|
|
94
118
|
this.logger.log(key, 'get: item resolved to <promise>');
|
|
95
119
|
return promise;
|
|
96
120
|
}
|
|
121
|
+
// If a fetch is in progress or already completed (with error) and not invalidated,
|
|
122
|
+
// don't start a new fetch — error is "sticky". Use refresh() or invalidate() to retry.
|
|
123
|
+
if (this._itemsStatus.has(key) && !this.getIsInvalidated(key)) {
|
|
124
|
+
const status = this._itemsStatus.get(key);
|
|
125
|
+
this.logger.log(key, 'get: fetch already', status ? 'in progress' : 'completed (error)', '— returning initial value');
|
|
126
|
+
return Promise.resolve(this._getInitialValue(id));
|
|
127
|
+
}
|
|
97
128
|
this.setStatus(key, true);
|
|
98
|
-
promise = this._doFetchAsync(id, key);
|
|
129
|
+
promise = this._doFetchAsync(id, key, false);
|
|
130
|
+
this.setPromise(key, promise);
|
|
131
|
+
return promise;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Re-fetches the value for the specified key while keeping the stale cached value available.
|
|
135
|
+
*
|
|
136
|
+
* Does not change the loading status — consumers reading `getCurrent()` / `getLazy().value`
|
|
137
|
+
* continue to see the stale value as if nothing happened.
|
|
138
|
+
*
|
|
139
|
+
* Implements "latest wins" concurrency: if multiple refreshes are called concurrently,
|
|
140
|
+
* all promises resolve to the value from the latest refresh.
|
|
141
|
+
*
|
|
142
|
+
* On error, the stale value is preserved and the error is stored.
|
|
143
|
+
*
|
|
144
|
+
* @param id The key of the item to refresh.
|
|
145
|
+
* @returns A promise resolving to the refreshed value, or the stale value on error.
|
|
146
|
+
*/
|
|
147
|
+
refresh(id) {
|
|
148
|
+
const key = this._pk(id);
|
|
149
|
+
const promise = this._doFetchAsync(id, key, true);
|
|
99
150
|
this.setPromise(key, promise);
|
|
100
151
|
return promise;
|
|
101
152
|
}
|
|
@@ -105,20 +156,8 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
105
156
|
super.clear();
|
|
106
157
|
}
|
|
107
158
|
// ─── Protected overrides ─────────────────────────────────────────────
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const isInvalid = this.getIsInvalidated(key);
|
|
111
|
-
// make sure current item is hooked here from the cache (required by observers)
|
|
112
|
-
const item = this._itemsCache.get(key);
|
|
113
|
-
const keepInstance = !!this._invalidationConfig?.keepInstance;
|
|
114
|
-
if (isInvalid) {
|
|
115
|
-
this.logger.log(key, 'item is invalidated');
|
|
116
|
-
}
|
|
117
|
-
return {
|
|
118
|
-
item: (isInvalid && !keepInstance) ? undefined : item,
|
|
119
|
-
key,
|
|
120
|
-
isInvalid,
|
|
121
|
-
};
|
|
159
|
+
_getInitialValue(id) {
|
|
160
|
+
return this._initialValueFactory ? this._initialValueFactory(id) : undefined;
|
|
122
161
|
}
|
|
123
162
|
getIsInvalidated(key) {
|
|
124
163
|
const config = this._invalidationConfig;
|
|
@@ -134,9 +173,9 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
134
173
|
}
|
|
135
174
|
}
|
|
136
175
|
// Check callback-based invalidation
|
|
137
|
-
if (config.invalidationCheck) {
|
|
176
|
+
if (config.invalidationCheck && this._itemsCache.has(key)) {
|
|
138
177
|
const value = this._itemsCache.get(key);
|
|
139
|
-
if (
|
|
178
|
+
if (config.invalidationCheck(key, value, ts ?? 0)) {
|
|
140
179
|
return true;
|
|
141
180
|
}
|
|
142
181
|
}
|
|
@@ -149,53 +188,85 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
149
188
|
}
|
|
150
189
|
// ─── Private ─────────────────────────────────────────────────────────
|
|
151
190
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
191
|
+
* Unified fetch method with "latest wins" semantics.
|
|
192
|
+
*
|
|
193
|
+
* - Tracks the active factory promise per key via `_activeFetchPromises`.
|
|
194
|
+
* - If superseded by a newer fetch, delegates to the newer promise.
|
|
195
|
+
* - On error, preserves the stale cached value.
|
|
196
|
+
*
|
|
197
|
+
* @param id The original key.
|
|
198
|
+
* @param key The string cache key.
|
|
199
|
+
* @returns A promise resolving to the fetched/refreshed value, or the stale value on error.
|
|
156
200
|
*/
|
|
157
|
-
async _doFetchAsync(id, key) {
|
|
201
|
+
async _doFetchAsync(id, key, refreshing) {
|
|
158
202
|
let isInSameVersion = true;
|
|
203
|
+
let isLatest = false;
|
|
159
204
|
try {
|
|
160
205
|
this.onBeforeFetch(key);
|
|
161
206
|
const v = this._version;
|
|
162
|
-
|
|
163
|
-
|
|
207
|
+
// Create the factory promise and mark it as the active one for this key (latest wins)
|
|
208
|
+
const factoryPromise = this.tryFetchInBatch(id, refreshing);
|
|
209
|
+
this._activeFetchPromises.set(key, factoryPromise);
|
|
210
|
+
let fetchResult;
|
|
164
211
|
try {
|
|
165
|
-
|
|
212
|
+
fetchResult = { ok: true, value: await factoryPromise };
|
|
166
213
|
}
|
|
167
214
|
catch (err) {
|
|
168
215
|
this._handleError(id, err);
|
|
169
|
-
|
|
170
|
-
res = undefined;
|
|
216
|
+
fetchResult = { ok: false };
|
|
171
217
|
}
|
|
172
218
|
if (v !== this._version) {
|
|
173
219
|
isInSameVersion = false;
|
|
220
|
+
this._activeFetchPromises.delete(key);
|
|
174
221
|
// resolve with actual result but don't store it
|
|
175
|
-
return
|
|
222
|
+
return fetchResult.ok ? fetchResult.value : this._getInitialValue(id);
|
|
176
223
|
}
|
|
177
|
-
if
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
224
|
+
// Check if this is still the active (latest) fetch for this key
|
|
225
|
+
isLatest = this._activeFetchPromises.get(key) === factoryPromise;
|
|
226
|
+
if (!isLatest) {
|
|
227
|
+
// Superseded by a newer refresh/fetch — delegate to the latest public promise.
|
|
228
|
+
// This ensures anyone awaiting this old promise gets the fresh value,
|
|
229
|
+
// mirroring LazyPromise's "latest wins" behavior.
|
|
230
|
+
const newerPromise = this._fetchCache.get(key);
|
|
231
|
+
if (newerPromise) {
|
|
232
|
+
// Catch errors from the newer promise — if it fails, fall back to stale/initial value.
|
|
233
|
+
return newerPromise.catch(() => this._getCachedOrInitial(key, id));
|
|
182
234
|
}
|
|
235
|
+
// Fallback: return current cached value or initial
|
|
236
|
+
return this._getCachedOrInitial(key, id);
|
|
237
|
+
}
|
|
238
|
+
// We are the latest — clean up tracking
|
|
239
|
+
this._activeFetchPromises.delete(key);
|
|
240
|
+
if (fetchResult.ok) {
|
|
241
|
+
const res = this.prepareResult(fetchResult.value);
|
|
242
|
+
this.logger.log(key, 'item\'s <promise> resolved to', res);
|
|
243
|
+
this.storeResult(key, res);
|
|
244
|
+
return res;
|
|
183
245
|
}
|
|
184
|
-
|
|
246
|
+
// Fetch failed — record timestamp for time-based invalidation expiry,
|
|
247
|
+
// and return stale value or initial.
|
|
248
|
+
this._timestamps.set(key, Date.now());
|
|
249
|
+
return this._getCachedOrInitial(key, id);
|
|
185
250
|
}
|
|
186
251
|
finally {
|
|
187
|
-
if (isInSameVersion) {
|
|
252
|
+
if (!isInSameVersion) {
|
|
253
|
+
this.logger.log(key, 'skipping item\'s resolve due to version change ("clear()" has been called)');
|
|
254
|
+
}
|
|
255
|
+
else if (isLatest) {
|
|
256
|
+
// Only the latest fetch should clean up the fetch state.
|
|
257
|
+
// Superseded fetches delegate to the latest and should not
|
|
258
|
+
// prematurely clear the fetch cache or loading status.
|
|
188
259
|
this.onFetchComplete(key);
|
|
189
260
|
}
|
|
190
261
|
else {
|
|
191
|
-
this.
|
|
262
|
+
this.onFetchSuperseded(key);
|
|
192
263
|
}
|
|
193
264
|
}
|
|
194
265
|
}
|
|
195
266
|
/** Performs a fetch operation in batch mode if available, otherwise uses the regular fetch. Throws on error. */
|
|
196
|
-
async tryFetchInBatch(id) {
|
|
267
|
+
async tryFetchInBatch(id, refreshing) {
|
|
197
268
|
if (!this._batch) {
|
|
198
|
-
return this.fetcher(id);
|
|
269
|
+
return this.fetcher(id, refreshing);
|
|
199
270
|
}
|
|
200
271
|
const res = await this._batch.push(id)
|
|
201
272
|
.catch(err => {
|
|
@@ -204,7 +275,7 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
204
275
|
});
|
|
205
276
|
if (!res || !res.result || res.result[res.index] === undefined) {
|
|
206
277
|
// batch call failed or returned no result — fallback to the direct fetcher
|
|
207
|
-
return this.fetcher(id);
|
|
278
|
+
return this.fetcher(id, refreshing);
|
|
208
279
|
}
|
|
209
280
|
return res.result[res.index];
|
|
210
281
|
}
|
|
@@ -224,9 +295,12 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
224
295
|
}
|
|
225
296
|
/**
|
|
226
297
|
* Enforces the max items limit by removing items to make room.
|
|
227
|
-
* Strategy: first removes invalid items, then oldest valid items.
|
|
298
|
+
* Strategy: first removes invalid items, then oldest valid items by timestamp.
|
|
228
299
|
* Items currently being fetched (in-flight) are not evicted.
|
|
229
300
|
*
|
|
301
|
+
* Note: Phase 2 scans all timestamps linearly (O(n) per eviction).
|
|
302
|
+
* This is acceptable for typical `maxItems` values (up to ~1000).
|
|
303
|
+
*
|
|
230
304
|
* @param incomingKey The key of the item about to be stored (excluded from eviction).
|
|
231
305
|
*/
|
|
232
306
|
_enforceMaxItems(incomingKey) {
|
|
@@ -248,9 +322,10 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
248
322
|
}
|
|
249
323
|
}
|
|
250
324
|
for (const key of invalidKeys) {
|
|
251
|
-
this.
|
|
325
|
+
this._deleteKey(key);
|
|
252
326
|
this._errorsMap.delete(key);
|
|
253
327
|
this._timestamps.delete(key);
|
|
328
|
+
this._activeFetchPromises.delete(key);
|
|
254
329
|
if (this._itemsCache.size < maxItems) {
|
|
255
330
|
return;
|
|
256
331
|
}
|
|
@@ -271,9 +346,10 @@ class PromiseCache extends core_js_1.PromiseCacheCore {
|
|
|
271
346
|
}
|
|
272
347
|
}
|
|
273
348
|
if (oldestKey != null) {
|
|
274
|
-
this.
|
|
349
|
+
this._deleteKey(oldestKey);
|
|
275
350
|
this._timestamps.delete(oldestKey);
|
|
276
351
|
this._errorsMap.delete(oldestKey);
|
|
352
|
+
this._activeFetchPromises.delete(oldestKey);
|
|
277
353
|
}
|
|
278
354
|
else {
|
|
279
355
|
// 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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"}
|