forked from clintonwoo/hackernews-react-graphql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcache-warmer.ts
64 lines (47 loc) · 1.86 KB
/
cache-warmer.ts
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { debug } from 'debug';
import { FeedType, NewsItemModel } from '../../src/data/models';
import type { FeedService } from '../services/feed-service';
import type { HnCache } from './cache';
import type { HnDatabase } from './database';
const logger = debug('app:cache-warmer');
logger.log = console.log.bind(console);
const FIFTEEN_MINUTES = 1000 * 60 * 15;
export function warmCache(db: HnDatabase, cache: HnCache, feedService: FeedService): void {
// Fetch the front pages
feedService.getForType(FeedType.TOP, 30, 0);
feedService.getForType(FeedType.NEW, 30, 0);
setTimeout(() => warmCache(db, cache, feedService), FIFTEEN_MINUTES);
}
function rebuildFeed(db: HnDatabase, cache: HnCache, feedType: FeedType): void {
setTimeout(() => rebuildFeed(db, cache, feedType), 1000 * 60 * 15, feedType);
db.getFeed(feedType)
.then((feed) => {
if (feed) {
return Promise.all(feed.map((id: number) => db.fetchNewsItem(id))).then((newsItems) => {
logger(newsItems);
cache[`${feedType}NewsItems`] = newsItems.filter(
(newsItem) => newsItem !== undefined && newsItem !== null
) as NewsItemModel[];
cache[feedType] = feed;
logger('Updated Feed ids for type: ', feedType);
});
}
return undefined;
})
.catch((reason) => logger('Error building feed: ', reason));
}
/* END NEWS ITEMS */
/* BEGIN SEED DATA */
export function seedCache(db: HnDatabase, cache: HnCache, delay: number): void {
logger('Waiting ms before seeding the app with data:', delay);
// Delay seeding the cache so we don't spam in dev
setTimeout(() => {
logger('Seeding cache');
[FeedType.TOP, FeedType.NEW, FeedType.BEST, FeedType.SHOW, FeedType.ASK, FeedType.JOB].forEach(
(feedType): void => {
rebuildFeed(db, cache, feedType);
}
);
}, delay);
}
/* END SEED DATA */