@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
81 lines (80 loc) • 3.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateCache = void 0;
var lang_1 = require("../../utils/lang");
var KeyBuilder_1 = require("../KeyBuilder");
var constants_1 = require("./constants");
var DEFAULT_CACHE_EXPIRATION_IN_DAYS = 10;
var MILLIS_IN_A_DAY = 86400000;
/**
* Validates if cache should be cleared and sets the cache `hash` if needed.
*
* @returns `true` if cache should be cleared, `false` otherwise
*/
function validateExpiration(options, settings, keys, currentTimestamp, isThereCache) {
var log = settings.log;
// Check expiration
var lastUpdatedTimestamp = parseInt(localStorage.getItem(keys.buildLastUpdatedKey()), 10);
if (!(0, lang_1.isNaNNumber)(lastUpdatedTimestamp)) {
var cacheExpirationInDays = (0, lang_1.isFiniteNumber)(options.expirationDays) && options.expirationDays >= 1 ? options.expirationDays : DEFAULT_CACHE_EXPIRATION_IN_DAYS;
var expirationTimestamp = currentTimestamp - MILLIS_IN_A_DAY * cacheExpirationInDays;
if (lastUpdatedTimestamp < expirationTimestamp) {
log.info(constants_1.LOG_PREFIX + 'Cache expired more than ' + cacheExpirationInDays + ' days ago. Cleaning up cache');
return true;
}
}
// Check hash
var storageHashKey = keys.buildHashKey();
var storageHash = localStorage.getItem(storageHashKey);
var currentStorageHash = (0, KeyBuilder_1.getStorageHash)(settings);
if (storageHash !== currentStorageHash) {
try {
localStorage.setItem(storageHashKey, currentStorageHash);
}
catch (e) {
log.error(constants_1.LOG_PREFIX + e);
}
if (isThereCache) {
log.info(constants_1.LOG_PREFIX + 'SDK key, flags filter criteria, or flags spec version has changed. Cleaning up cache');
return true;
}
return false; // No cache to clear
}
// Clear on init
if (options.clearOnInit) {
var lastClearTimestamp = parseInt(localStorage.getItem(keys.buildLastClear()), 10);
if ((0, lang_1.isNaNNumber)(lastClearTimestamp) || lastClearTimestamp < currentTimestamp - MILLIS_IN_A_DAY) {
log.info(constants_1.LOG_PREFIX + 'clearOnInit was set and cache was not cleared in the last 24 hours. Cleaning up cache');
return true;
}
}
}
/**
* Clean cache if:
* - it has expired, i.e., its `lastUpdated` timestamp is older than the given `expirationTimestamp`
* - its hash has changed, i.e., the SDK key, flags filter criteria or flags spec version was modified
* - `clearOnInit` was set and cache was not cleared in the last 24 hours
*
* @returns `true` if cache is ready to be used, `false` otherwise (cache was cleared or there is no cache)
*/
function validateCache(options, settings, keys, splits, rbSegments, segments, largeSegments) {
var currentTimestamp = Date.now();
var isThereCache = splits.getChangeNumber() > -1;
if (validateExpiration(options, settings, keys, currentTimestamp, isThereCache)) {
splits.clear();
rbSegments.clear();
segments.clear();
largeSegments.clear();
// Update last clear timestamp
try {
localStorage.setItem(keys.buildLastClear(), currentTimestamp + '');
}
catch (e) {
settings.log.error(constants_1.LOG_PREFIX + e);
}
return false;
}
// Check if ready from cache
return isThereCache;
}
exports.validateCache = validateCache;