2025-11-13 13:13:34 -07:00

55 lines
1.5 KiB
JavaScript

import LRUCache from "mnemonist/lru-cache";
export class EndpointCache {
cache;
constructor(capacity) {
this.cache = new LRUCache(capacity);
}
getEndpoint(key) {
const endpointsWithExpiry = this.get(key);
if (!endpointsWithExpiry || endpointsWithExpiry.length === 0) {
return undefined;
}
const endpoints = endpointsWithExpiry.map((endpoint) => endpoint.Address);
return endpoints[Math.floor(Math.random() * endpoints.length)];
}
get(key) {
if (!this.has(key)) {
return;
}
const value = this.cache.get(key);
if (!value) {
return;
}
const now = Date.now();
const endpointsWithExpiry = value.filter((endpoint) => now < endpoint.Expires);
if (endpointsWithExpiry.length === 0) {
this.delete(key);
return undefined;
}
return endpointsWithExpiry;
}
set(key, endpoints) {
const now = Date.now();
this.cache.set(key, endpoints.map(({ Address, CachePeriodInMinutes }) => ({
Address,
Expires: now + CachePeriodInMinutes * 60 * 1000,
})));
}
delete(key) {
this.cache.set(key, []);
}
has(key) {
if (!this.cache.has(key)) {
return false;
}
const endpoints = this.cache.peek(key);
if (!endpoints) {
return false;
}
return endpoints.length > 0;
}
clear() {
this.cache.clear();
}
}