@thermopylae/lib.cache
Version:
58 lines (57 loc) • 2.13 kB
JavaScript
import { chrono } from '@thermopylae/lib.utils';
import { AbstractExpirationPolicy } from "./abstract.js";
import { EXPIRES_AT_SYM, INFINITE_EXPIRATION } from "../../constants.js";
const TIME_SPAN_SYM = Symbol('TIME_SPAN_SYM_REACTIVE');
class SlidingReactiveExpirationPolicy extends AbstractExpirationPolicy {
onHit(entry) {
if (entry[TIME_SPAN_SYM] == null) {
return 1 ;
}
if (entry[EXPIRES_AT_SYM] <= chrono.unixTime()) {
this.deleteFromCache(entry);
return 0 ;
}
SlidingReactiveExpirationPolicy.setEntryExpiration(entry, entry[TIME_SPAN_SYM]);
return 1 ;
}
onSet(entry, options) {
if (options == null || SlidingReactiveExpirationPolicy.isNonExpirable(options)) {
return;
}
SlidingReactiveExpirationPolicy.storeExpirationMetadata(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 undefined;
}
SlidingReactiveExpirationPolicy.storeExpirationMetadata(entry, options);
return undefined;
}
if (options.timeSpan !== INFINITE_EXPIRATION) {
SlidingReactiveExpirationPolicy.storeExpirationMetadata(entry, options);
}
return undefined;
}
onDelete(entry) {
super.onDelete(entry);
entry[TIME_SPAN_SYM] = undefined;
}
onClear() {
return undefined;
}
static storeExpirationMetadata(entry, options) {
entry[TIME_SPAN_SYM] = options.timeSpan;
SlidingReactiveExpirationPolicy.setEntryExpiration(entry, options.timeSpan);
}
static isNonExpirable(options) {
return options.timeSpan == null || options.timeSpan === INFINITE_EXPIRATION;
}
}
export { SlidingReactiveExpirationPolicy, TIME_SPAN_SYM };