File size: 1,492 Bytes
4083225
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/** In-memory cache for route remounts; keys = topic + timeframe (+ iso for article lists). FIFO cap per map. */

const MAX_ENTRIES = 16;

const mapDivergence = new Map();
const mapArticles = new Map();
const timelinePayload = new Map();

function keyTopicTf(topic, newsTimeframe) {
  return `${topic.trim()}\u0000${newsTimeframe}`;
}

function keyArticles(topic, newsTimeframe, iso) {
  return `${keyTopicTf(topic, newsTimeframe)}\u0000${iso ?? "all"}`;
}

function setBounded(map, key, value) {
  if (map.has(key)) {
    map.delete(key);
  } else if (map.size >= MAX_ENTRIES) {
    const oldest = map.keys().next().value;
    map.delete(oldest);
  }
  map.set(key, value);
}

export function getCachedMapDivergence(topic, newsTimeframe) {
  return mapDivergence.get(keyTopicTf(topic, newsTimeframe));
}

export function setCachedMapDivergence(topic, newsTimeframe, data) {
  setBounded(mapDivergence, keyTopicTf(topic, newsTimeframe), data);
}

export function getCachedMapArticles(topic, newsTimeframe, iso) {
  return mapArticles.get(keyArticles(topic, newsTimeframe, iso));
}

export function setCachedMapArticles(topic, newsTimeframe, iso, data) {
  setBounded(mapArticles, keyArticles(topic, newsTimeframe, iso), data);
}

export function getCachedTimeline(topic, newsTimeframe) {
  return timelinePayload.get(keyTopicTf(topic, newsTimeframe));
}

export function setCachedTimeline(topic, newsTimeframe, data) {
  setBounded(timelinePayload, keyTopicTf(topic, newsTimeframe), data);
}