UNPKG

multi-layers-cache

Version:

A very simple multi layers cache.

75 lines (73 loc) 1.84 kB
// 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 };