cached

tcmts.registry.cached · #4pivhz3y · term · runs anywhere

fn's answer for key, kept for five minutes; the least lately used are forgotten past REGISTRY_LIMITS.rememberedVisitors.

import { REGISTRY_LIMITS, visitorCache } from "#codebase/tcmts/registry";

export async function cached(key: string, fn: () => Promise<Set<string>>): Promise<Set<string>> {
  const kept = visitorCache.get(key);
  if (kept && Date.now() - kept.at < 300_000) {
    // (used: last to go)
    visitorCache.delete(key);
    visitorCache.set(key, kept);
    return kept.value;
  }
  const value = await fn();
  visitorCache.delete(key);
  visitorCache.set(key, { at: Date.now(), value });
  for (const old of visitorCache.keys()) {
    if (visitorCache.size <= REGISTRY_LIMITS.rememberedVisitors) break;
    visitorCache.delete(old);
  }
  return value;
}

uses

used by