UNPKG

@thermopylae/lib.cache

Version:
75 lines (74 loc) 2.63 kB
import { EXPIRES_AT_SYM, INFINITE_EXPIRATION } from "../../constants.js"; import { BucketGarbageCollector } from "../../garbage-collectors/bucket-gc.js"; import { AbstractExpirationPolicy } from "./abstract.js"; const TIME_SPAN_SYM = Symbol('TIME_SPAN_SYM_PROACTIVE'); class SlidingProactiveExpirationPolicy extends AbstractExpirationPolicy { gc; constructor(gc) { super(); this.gc = gc || new BucketGarbageCollector(); this.gc.setEntryExpiredCallback((expiredEntry) => { this.deleteFromCache(expiredEntry); }); } get size() { return this.gc.size; } get idle() { return this.gc.idle; } onHit(entry) { if (entry[TIME_SPAN_SYM] == null) { return 1 ; } const oldExpiration = entry[EXPIRES_AT_SYM]; SlidingProactiveExpirationPolicy.setEntryExpiration(entry, entry[TIME_SPAN_SYM]); this.gc.update(oldExpiration, entry); return 1 ; } onSet(entry, options) { if (options == null || SlidingProactiveExpirationPolicy.isNonExpirable(options)) { return; } this.scheduleEviction(entry, options); } onUpdate(entry, options) { if (options == null || options.timeSpan == null) { return undefined; } if (entry[TIME_SPAN_SYM]) { if (options.timeSpan === INFINITE_EXPIRATION) { return this.onDelete(entry); } if (options.timeSpan === entry[TIME_SPAN_SYM]) { return; } const oldExpiration = entry[EXPIRES_AT_SYM]; SlidingProactiveExpirationPolicy.storeExpirationMetadata(entry, options); return this.gc.update(oldExpiration, entry); } if (options.timeSpan !== INFINITE_EXPIRATION) { this.scheduleEviction(entry, options); } } onDelete(entry) { this.gc.leave(entry); super.onDelete(entry); entry[TIME_SPAN_SYM] = undefined; } onClear() { this.gc.clear(); } scheduleEviction(entry, options) { SlidingProactiveExpirationPolicy.storeExpirationMetadata(entry, options); this.gc.manage(entry); } static storeExpirationMetadata(entry, options) { entry[TIME_SPAN_SYM] = options.timeSpan; SlidingProactiveExpirationPolicy.setEntryExpiration(entry, options.timeSpan); } static isNonExpirable(options) { return options.timeSpan == null || options.timeSpan === INFINITE_EXPIRATION; } } export { SlidingProactiveExpirationPolicy, TIME_SPAN_SYM };