multi-layers-cache
Version:
A very simple multi layers cache.
101 lines (97 loc) • 2.58 kB
JavaScript
;
var l = Object.defineProperty;
var c = Object.getOwnPropertyDescriptor;
var m = Object.getOwnPropertyNames;
var u = Object.prototype.hasOwnProperty;
var h = (s, e) => {
for (var n in e)
l(s, n, { get: e[n], enumerable: !0 });
}, f = (s, e, n, t) => {
if (e && typeof e == "object" || typeof e == "function")
for (let a of m(e))
!u.call(s, a) && a !== n && l(s, a, { get: () => e[a], enumerable: !(t = c(e, a)) || t.enumerable });
return s;
};
var x = (s) => f(l({}, "__esModule", { value: !0 }), s);
// src/index.ts
var g = {};
h(g, {
LRUCache: () => i,
newCacheStorage: () => d,
newLRUCache: () => p
});
module.exports = x(g);
// src/lru.ts
var i = class extends Map {
max;
maxAge;
stale;
constructor(e = {}) {
super(), typeof e == "number" && (e = { max: e });
let { max: n, maxAge: t } = e;
this.max = n && n > 0 ? n : 1 / 0, this.maxAge = t !== void 0 ? t : -1, this.stale = !!e.stale;
}
peek(e) {
return this.get(e, !1);
}
set(e, n, t = this.maxAge) {
this.has(e) && this.delete(e), this.size + 1 > this.max && this.delete(this.keys().next().value);
let a = t > -1 ? t + Date.now() : t;
return super.set(e, { expires: a, content: n });
}
/**
*
* @param key
* @param mut Update the ttl
* @returns
*/
get(e, n = !1) {
let t = super.get(e);
if (t === void 0)
return t;
let { expires: a, content: r } = t, o = { expireAt: a > 0 ? (a - Date.now()) / 1e3 : a, value: r, key: e };
return a !== !1 && a !== -1 && Date.now() >= a ? (this.delete(e), this.stale ? o : void 0) : (n && this.set(e, r), o);
}
};
function p(s = { maxItems: 10 }) {
let e = new i({
max: s.maxItems
});
return {
async del(n) {
e.delete(n);
},
async get(n) {
return e.get(n);
},
async set(n, t, a) {
e.set(n, t, a && a * 1e3);
}
};
}
// src/index.ts
function d({ layers: s }) {
let e = s.slice();
if (!e.length)
throw new Error("At least a caching layer must be set.");
return {
async del(n) {
await Promise.all(e.map((t) => t.del(n)));
},
async get(n) {
let t, a = 0;
for (; a < e.length && (t = await e[a].get(n), !t); a++)
;
return t && a > 0 && await Promise.all(e.slice(0, a - 1).map((r) => r.set(n, t.value, t.expireAt))), t;
},
async set(n, t, a) {
await Promise.all(e.map((r) => r.set(n, t, a)));
}
};
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
LRUCache,
newCacheStorage,
newLRUCache
});