UNPKG

@thermopylae/lib.cache

Version:
59 lines (58 loc) 1.99 kB
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 };