multi-layers-cache
Version:
A very simple multi layers cache.
75 lines (73 loc) • 1.84 kB
JavaScript
// src/lru.ts
var i = class extends Map {
max;
maxAge;
stale;
constructor(e = {}) {
super(), typeof e == "number" && (e = { max: e });
let { max: a, maxAge: t } = e;
this.max = a && a > 0 ? a : 1 / 0, this.maxAge = t !== void 0 ? t : -1, this.stale = !!e.stale;
}
peek(e) {
return this.get(e, !1);
}
set(e, a, t = this.maxAge) {
this.has(e) && this.delete(e), this.size + 1 > this.max && this.delete(this.keys().next().value);
let n = t > -1 ? t + Date.now() : t;
return super.set(e, { expires: n, content: a });
}
/**
*
* @param key
* @param mut Update the ttl
* @returns
*/
get(e, a = !1) {
let t = super.get(e);
if (t === void 0)
return t;
let { expires: n, content: s } = t, l = { expireAt: n > 0 ? (n - Date.now()) / 1e3 : n, value: s, key: e };
return n !== !1 && n !== -1 && Date.now() >= n ? (this.delete(e), this.stale ? l : void 0) : (a && this.set(e, s), l);
}
};
function o(r = { maxItems: 10 }) {
let e = new i({
max: r.maxItems
});
return {
async del(a) {
e.delete(a);
},
async get(a) {
return e.get(a);
},
async set(a, t, n) {
e.set(a, t, n && n * 1e3);
}
};
}
// src/index.ts
function m({ layers: r }) {
let e = r.slice();
if (!e.length)
throw new Error("At least a caching layer must be set.");
return {
async del(a) {
await Promise.all(e.map((t) => t.del(a)));
},
async get(a) {
let t, n = 0;
for (; n < e.length && (t = await e[n].get(a), !t); n++)
;
return t && n > 0 && await Promise.all(e.slice(0, n - 1).map((s) => s.set(a, t.value, t.expireAt))), t;
},
async set(a, t, n) {
await Promise.all(e.map((s) => s.set(a, t, n)));
}
};
}
export {
i as LRUCache,
m as newCacheStorage,
o as newLRUCache
};