From 06b864055ceca066f046fdf3376f2f43395e6cb9 Mon Sep 17 00:00:00 2001 From: Khairul Hidayat Date: Sat, 24 Feb 2024 04:56:53 +0000 Subject: [PATCH] feat: add caching to thumbnail creator --- server/api/thumbnail.ts | 40 ++++++++++++++++++++++++++++++---------- server/lib/screenshot.ts | 1 + 2 files changed, 31 insertions(+), 10 deletions(-) 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);