@prezly/theme-kit-core
Version:
Data layer and utility library for developing Prezly themes with JavaScript
63 lines (62 loc) • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RECORDS_LIMIT = void 0;
exports.createSharedMemoryCache = createSharedMemoryCache;
var RECORDS_LIMIT = exports.RECORDS_LIMIT = 10000;
var GC_PROBABILITY = 1 / 100;
var CACHE = new Map();
function createSharedMemoryCache() {
var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
return {
get(key, latestVersion) {
var entry = CACHE.get("".concat(prefix).concat(key));
if (!entry) {
return undefined;
}
if (entry.version < latestVersion) {
CACHE.delete("".concat(prefix).concat(key));
return undefined;
}
var {
value,
version
} = entry;
CACHE.set("".concat(prefix).concat(key), {
value,
version,
accessed: new Date().getTime()
});
return value;
},
set(key, value, version) {
var entry = {
value,
version,
accessed: new Date().getTime()
};
CACHE.set("".concat(prefix).concat(key), entry);
if (CACHE.size > RECORDS_LIMIT && Math.random() < GC_PROBABILITY) {
gc();
}
},
namespace(namespace) {
return createSharedMemoryCache("".concat(prefix).concat(namespace, ":"));
}
};
}
function gc() {
Array.from(CACHE.entries()).sort((_ref, _ref2) => {
var [, a] = _ref;
var [, b] = _ref2;
return -cmp(a.accessed, b.accessed);
}).slice(RECORDS_LIMIT).forEach(_ref3 => {
var [key] = _ref3;
CACHE.delete(key);
});
}
function cmp(a, b) {
if (a === b) return 0;
return a < b ? -1 : 1;
}