stylelint
Version:
A mighty CSS linter that helps you avoid errors and enforce conventions.
69 lines (57 loc) • 1.37 kB
JavaScript
/**
* A bounded, in-memory key-value cache whose entries expire after a time-to-live.
*
* @template V
*/
export default class MemoryCache {
/** @type {Map<string, { value: V, timestamp: number }>} */
#entries = new Map();
#maxSize;
#ttlMs;
/**
* @param {object} [options]
* @param {number} [options.maxSize] Maximum number of entries before the oldest is evicted.
* @param {number} [options.ttlMs] Time-to-live in milliseconds.
*/
constructor({ maxSize = 1000, ttlMs = 30 * 60 * 1000 } = {}) {
this.#maxSize = maxSize;
this.#ttlMs = ttlMs;
}
/**
* @param {string} key
* @returns {V | undefined}
*/
get(key) {
const entry = this.#entries.get(key);
if (!entry) return undefined;
// Check if entry has expired.
if (Date.now() - entry.timestamp > this.#ttlMs) {
this.#entries.delete(key);
return undefined;
}
return entry.value;
}
/**
* @param {string} key
* @param {V} value
*/
set(key, value) {
// Evict oldest entry if cache is full.
if (this.#entries.size >= this.#maxSize) {
const oldestKey = this.#entries.keys().next().value;
if (oldestKey !== undefined) {
this.#entries.delete(oldestKey);
}
}
this.#entries.set(key, { value, timestamp: Date.now() });
}
/**
* @param {string} key
*/
delete(key) {
this.#entries.delete(key);
}
clear() {
this.#entries.clear();
}
}