File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ import consola from "consola" ;
2+
13export 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 ) ;
Original file line number Diff line number Diff line change 1- import DataLoader from "dataloader" ;
21import { chrome } from "../crawlers" ;
2+ import { createCachedDataLoader , createInMemoryCache } from "../utils/cache" ;
3+ import { DAY_MS } from "../utils/time" ;
34
45export 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 {
Original file line number Diff line number Diff line change 1- import DataLoader from "dataloader" ;
21import { createFirefoxApiClient } from "../apis" ;
2+ import { DAY_MS } from "../utils/time" ;
3+ import { createCachedDataLoader } from "../utils/cache" ;
34
45export 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 ) ,
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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 ;
You can’t perform that action at this time.
0 commit comments