Skip to content

Commit c39095c

Browse files
committed
fix: Expire cache after 1 day
1 parent ac7d3b0 commit c39095c

5 files changed

Lines changed: 61 additions & 7 deletions

File tree

src/apis/firefox-api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import consola from "consola";
2+
13
export function createFirefoxApiClient() {
24
return {
35
getAddon: async (
46
idOrSlugOrGuid: number | string
57
): Promise<Gql.FirefoxAddon> => {
8+
consola.info("Fetching " + idOrSlugOrGuid);
69
const url = new URL(
710
`https://addons.mozilla.org/api/v5/addons/addon/${idOrSlugOrGuid}`
811
);

src/services/chrome-service.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
import DataLoader from "dataloader";
21
import { chrome } from "../crawlers";
2+
import { createCachedDataLoader, createInMemoryCache } from "../utils/cache";
3+
import { DAY_MS } from "../utils/time";
34

45
export function createChromeService() {
5-
const loader = new DataLoader<string, Gql.ChromeExtension | undefined>(
6-
(ids) => Promise.all(ids.map((id) => chrome.crawlExtension(id, "en")))
6+
const loader = createCachedDataLoader<
7+
string,
8+
Gql.ChromeExtension | undefined
9+
>(DAY_MS, (ids) =>
10+
Promise.all(ids.map((id) => chrome.crawlExtension(id, "en")))
711
);
812

913
return {

src/services/firefox-service.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
import DataLoader from "dataloader";
21
import { createFirefoxApiClient } from "../apis";
2+
import { DAY_MS } from "../utils/time";
3+
import { createCachedDataLoader } from "../utils/cache";
34

45
export function createFirefoxService() {
56
const firefox = createFirefoxApiClient();
67

7-
const loader = new DataLoader<string | number, Gql.FirefoxAddon | undefined>(
8-
(ids) => Promise.all(ids.map((id) => firefox.getAddon(id)))
9-
);
8+
const loader = createCachedDataLoader<
9+
string | number,
10+
Gql.FirefoxAddon | undefined
11+
>(DAY_MS, (ids) => Promise.all(ids.map((id) => firefox.getAddon(id))));
1012

1113
return {
1214
getAddon: (id: string | number) => loader.load(id),

src/utils/cache.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import DataLoader, { CacheMap } from "dataloader";
2+
3+
export function createInMemoryCache<K, V>(config: {
4+
ttl: number;
5+
}): CacheMap<K, V> {
6+
const cache = new Map<K, CacheEntry<V>>();
7+
return {
8+
set(key, value) {
9+
cache.set(key, {
10+
setAt: Date.now(),
11+
value,
12+
});
13+
},
14+
get(key) {
15+
const entry = cache.get(key);
16+
if (entry === undefined) return undefined;
17+
if (entry.setAt + config.ttl < Date.now()) return undefined;
18+
return entry.value ?? undefined;
19+
},
20+
clear() {
21+
cache.clear();
22+
},
23+
delete(key) {
24+
cache.delete(key);
25+
},
26+
};
27+
}
28+
29+
interface CacheEntry<T> {
30+
setAt: number;
31+
value: T | null;
32+
}
33+
34+
export function createCachedDataLoader<K, V>(
35+
ttl: number,
36+
batchLoadFn: DataLoader.BatchLoadFn<K, V>
37+
) {
38+
return new DataLoader(batchLoadFn, {
39+
cacheMap: createInMemoryCache({ ttl }),
40+
});
41+
}

src/utils/time.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const SECOND_MS = 1000;
2+
export const MINUTE_MS = 60 * SECOND_MS;
3+
export const HOUR_MS = 60 * MINUTE_MS;
4+
export const DAY_MS = 24 * HOUR_MS;

0 commit comments

Comments
 (0)