@remcostoeten/fync
Version:
A unified TypeScript library for easy access to popular APIs (GitHub, Spotify, GitLab, etc.)
83 lines (82 loc) • 1.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createMemoryCache = createMemoryCache;
function createMemoryCache(options = {}) {
const cache = new Map();
const {
ttl: defaultTTL,
maxSize
} = options;
function isExpired(entry) {
if (!entry.expiry) return false;
return Date.now() > entry.expiry;
}
function evictExpired() {
const now = Date.now();
for (const [key, entry] of cache.entries()) {
if (entry.expiry && now > entry.expiry) {
cache.delete(key);
}
}
}
function evictOldest() {
if (!maxSize || cache.size <= maxSize) return;
const entries = globalThis.Array.from(cache.entries());
entries.sort(function compareTimestamps(a, b) {
return a[1].timestamp - b[1].timestamp;
});
const toDelete = entries.slice(0, cache.size - maxSize);
for (const [key] of toDelete) {
cache.delete(key);
}
}
function get(key) {
const entry = cache.get(key);
if (!entry) return undefined;
if (isExpired(entry)) {
cache.delete(key);
return undefined;
}
return entry.value;
}
function set(key, value, ttl) {
evictExpired();
const effectiveTTL = ttl ?? defaultTTL;
const entry = {
value,
timestamp: Date.now(),
expiry: effectiveTTL ? Date.now() + effectiveTTL : undefined
};
cache.set(key, entry);
evictOldest();
}
function deleteKey(key) {
return cache.delete(key);
}
function clear() {
cache.clear();
}
function has(key) {
const entry = cache.get(key);
if (!entry) return false;
if (isExpired(entry)) {
cache.delete(key);
return false;
}
return true;
}
function size() {
evictExpired();
return cache.size;
}
return {
get,
set,
delete: deleteKey,
clear,
has,
size
};
}