code-share/server/api/thumbnail.ts

45 lines
938 B
TypeScript
Raw Normal View History

2024-02-24 04:38:19 +00:00
import { Request, Response } from "express";
import { screenshot } from "../lib/screenshot";
2024-02-24 04:56:53 +00:00
const cache = new Map<string, { data: Buffer; timestamp: number }>();
2024-02-24 04:38:19 +00:00
2024-02-24 04:56:53 +00:00
const regenerateThumbnail = async (slug: string) => {
const curCache = cache.get(slug);
2024-02-24 04:38:19 +00:00
2024-02-24 04:56:53 +00:00
if (curCache?.data) {
cache.set(slug, {
data: curCache.data,
timestamp: Date.now(),
});
2024-02-24 04:38:19 +00:00
}
const result = await screenshot(slug);
if (!result) {
2024-02-24 04:56:53 +00:00
return curCache;
2024-02-24 04:38:19 +00:00
}
2024-02-24 04:56:53 +00:00
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);
}
2024-02-24 04:38:19 +00:00
res.contentType("image/jpeg");
2024-02-24 04:56:53 +00:00
res.send(cacheData?.data);
2024-02-24 04:38:19 +00:00
};