diff --git a/server/api/thumbnail.ts b/server/api/thumbnail.ts index 4320f3b..0444f59 100644 --- a/server/api/thumbnail.ts +++ b/server/api/thumbnail.ts @@ -1,24 +1,44 @@ import { Request, Response } from "express"; import { screenshot } from "../lib/screenshot"; -const cache = new Map(); +const cache = new Map(); -export const thumbnail = async (req: Request, res: Response) => { - const { slug } = req.params; - const cacheData = cache.get(slug); +const regenerateThumbnail = async (slug: string) => { + const curCache = cache.get(slug); - if (cacheData) { - res.contentType("image/jpeg"); - return res.send(cacheData); + if (curCache?.data) { + cache.set(slug, { + data: curCache.data, + timestamp: Date.now(), + }); } const result = await screenshot(slug); if (!result) { - return res.status(400).send("Cannot generate thumbnail!"); + return curCache; } - cache.set(slug, result); + const data = { + data: result, + timestamp: Date.now(), + }; + + cache.set(slug, data); + return data; +}; + +export const thumbnail = async (req: Request, res: Response) => { + const { slug } = req.params; + let cacheData = cache.get(slug); + + if (!cacheData) { + cacheData = await regenerateThumbnail(slug); + } + + if (cacheData && Date.now() - cacheData.timestamp > 10000) { + regenerateThumbnail(slug); + } res.contentType("image/jpeg"); - res.send(result); + res.send(cacheData?.data); }; diff --git a/server/lib/screenshot.ts b/server/lib/screenshot.ts index a1569ca..b8d1e30 100644 --- a/server/lib/screenshot.ts +++ b/server/lib/screenshot.ts @@ -28,6 +28,7 @@ export const screenshot = async (slug: string) => { closeHandler = setTimeout(() => { browser?.close(); + browser = null; closeHandler = null; }, 60000);