@thermopylae/lib.cache
Version:
59 lines (58 loc) • 1.99 kB
JavaScript
import { AbsoluteExpirationPolicy } from "./absolute.js";
import { EXPIRES_AT_SYM, INFINITE_EXPIRATION } from "../../constants.js";
import { HeapGarbageCollector } from "../../garbage-collectors/heap-gc.js";
class ProactiveExpirationPolicy extends AbsoluteExpirationPolicy {
gc;
constructor(gc) {
super();
this.gc = gc || new HeapGarbageCollector();
this.gc.setEntryExpiredCallback((expiredEntry) => {
this.deleteFromCache(expiredEntry);
});
}
get size() {
return this.gc.size;
}
onHit() {
return 1 ;
}
onSet(entry, options) {
if (options == null || ProactiveExpirationPolicy.isNonExpirable(options)) {
return;
}
ProactiveExpirationPolicy.setEntryExpiration(entry, options.expiresAfter, options.expiresFrom);
this.gc.manage(entry);
}
onUpdate(entry, options) {
if (options == null || options.expiresAfter == null) {
return undefined;
}
if (entry[EXPIRES_AT_SYM]) {
if (options.expiresAfter === INFINITE_EXPIRATION) {
return this.onDelete(entry);
}
const oldExpiration = entry[EXPIRES_AT_SYM];
ProactiveExpirationPolicy.setEntryExpiration(entry, options.expiresAfter, options.expiresFrom);
if (oldExpiration === entry[EXPIRES_AT_SYM]) {
return undefined;
}
return this.gc.update(oldExpiration, entry);
}
if (options.expiresAfter !== INFINITE_EXPIRATION) {
ProactiveExpirationPolicy.setEntryExpiration(entry, options.expiresAfter, options.expiresFrom);
return this.gc.manage(entry);
}
return undefined;
}
onDelete(entry) {
this.gc.leave(entry);
super.onDelete(entry);
}
onClear() {
this.gc.clear();
}
isIdle() {
return this.gc.idle;
}
}
export { ProactiveExpirationPolicy };