@thermopylae/lib.cache
Version:
75 lines (74 loc) • 2.63 kB
JavaScript
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 };