diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e9112331..a6007e06d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ Changelog _Note: Gaps between patch versions are faulty, broken or test releases._ +## v4.0.0-alpha.46 (2024-09-18) + +#### :house: Internal + +* Changed the logic of the `addTTL` decorator to be lazy `core/cache/docorators/ttl` + ## v4.0.0-alpha.45 (2024-09-09) #### :bug: Bug Fix diff --git a/src/core/cache/decorators/helpers/add-emitter/index.ts b/src/core/cache/decorators/helpers/add-emitter/index.ts index 6269653cf..f62465c07 100644 --- a/src/core/cache/decorators/helpers/add-emitter/index.ts +++ b/src/core/cache/decorators/helpers/add-emitter/index.ts @@ -137,14 +137,12 @@ const addEmitter: AddEmitter = , V = unknown, K extends st clear: originalClear.bind(cacheWithEmitter), subscribe: ((method, obj, cb): void => { - emitter.on(method, handler); - - function handler(cacheWithEmitter: object, e: MutationEvent) { + emitter.on(method, (cacheWithEmitter: object, e: MutationEvent) => { // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (cacheWithEmitter === obj || {}.isPrototypeOf.call(cacheWithEmitter, obj)) { cb(e); } - } + }); }) }; }; diff --git a/src/core/cache/decorators/spec.js b/src/core/cache/decorators/spec.js index b0d6f1149..f6ace8068 100644 --- a/src/core/cache/decorators/spec.js +++ b/src/core/cache/decorators/spec.js @@ -17,8 +17,6 @@ import { INDEX_STORAGE_NAME } from 'core/cache/decorators/persistent/engines/con describe('core/cache/decorators', () => { it('complex test', async () => { - jest.spyOn(Date, 'now').mockReturnValue(0); - const opts = { loadFromStorage: 'onInit' }; @@ -44,6 +42,11 @@ describe('core/cache/decorators', () => { }); await new Promise((r) => setTimeout(r, 50)); + + expect(await persistentCache.get('bar')).toBe(undefined); + + await new Promise((r) => setTimeout(r, 0)); + expect(await asyncLocal.get(INDEX_STORAGE_NAME)).toEqual({ baz: Number.MAX_SAFE_INTEGER }); diff --git a/src/core/cache/decorators/ttl/CHANGELOG.md b/src/core/cache/decorators/ttl/CHANGELOG.md index 97a9316e2..6dc4cb01f 100644 --- a/src/core/cache/decorators/ttl/CHANGELOG.md +++ b/src/core/cache/decorators/ttl/CHANGELOG.md @@ -9,6 +9,12 @@ Changelog > - :house: [Internal] > - :nail_care: [Polish] +## v4.0.0-alpha.46 (2024-09-18) + +#### :house: Internal + +* Changed the logic of the `addTTL` decorator to be lazy + ## v3.47.0 (2021-05-17) #### :bug: Bug Fix diff --git a/src/core/cache/decorators/ttl/index.ts b/src/core/cache/decorators/ttl/index.ts index 123d1c871..9f1b2a9a8 100644 --- a/src/core/cache/decorators/ttl/index.ts +++ b/src/core/cache/decorators/ttl/index.ts @@ -54,8 +54,29 @@ export default function addTTL< } = addEmitter, V, K>(>cache); const - cacheWithTTL: TTLCache = Object.create(cache), - ttlTimers = new Map(); + store = new Map(); + + const + cacheWithTTL: TTLCache = Object.create(cache); + + cacheWithTTL.get = (key: K) => { + const + info = store.get(key); + + if (info != null) { + const + expired = Date.now() - info.date > info.ttl; + + if (expired) { + cacheWithTTL.remove(key); + return; + } + } + + return cache.get(key); + }; + + cacheWithTTL.has = (key: K) => cacheWithTTL.get(key) !== undefined; cacheWithTTL.set = (key: K, value: V, opts?: TTLDecoratorOptions & Parameters[2]) => { updateTTL(key, opts?.ttl); @@ -67,23 +88,18 @@ export default function addTTL< return originalRemove(key); }; - cacheWithTTL.removeTTLFrom = (key: K) => { - if (ttlTimers.has(key)) { - clearTimeout(ttlTimers.get(key)); - ttlTimers.delete(key); - return true; - } - - return false; - }; + cacheWithTTL.removeTTLFrom = (key: K) => store.delete(key); cacheWithTTL.clear = (filter?: ClearFilter) => { const removed = originalClear(filter); - removed.forEach((_, key) => { - cacheWithTTL.removeTTLFrom(key); - }); + if (filter == null) { + store.clear(); + + } else { + removed.forEach((_, key) => cacheWithTTL.removeTTLFrom(key)); + } return removed; }; @@ -101,9 +117,13 @@ export default function addTTL< return cacheWithTTL; function updateTTL(key: K, optionTTL?: number): void { - if (optionTTL != null || ttl != null) { - const time = optionTTL ?? ttl; - ttlTimers.set(key, setTimeout(() => cacheWithTTL.remove(key), time)); + const time = optionTTL ?? ttl; + + if (time != null) { + store.set(key, { + ttl: time, + date: Date.now() + }); } else { cacheWithTTL.removeTTLFrom(key);