UNPKG

@thermopylae/lib.cache

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