diff --git a/bun.lockb b/bun.lockb index 3b1debe..efceee9 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/projects/backend/package.json b/projects/backend/package.json index 8f1a9d2..a051333 100644 --- a/projects/backend/package.json +++ b/projects/backend/package.json @@ -22,6 +22,7 @@ "elysia-rate-limit": "^4.1.0", "ky": "^1.7.2", "mongoose": "^8.7.0", + "node-cache": "^5.1.2", "react": "^18.3.1" }, "devDependencies": { diff --git a/projects/backend/src/service/image.service.tsx b/projects/backend/src/service/image.service.tsx index 58b75d2..281b8c3 100644 --- a/projects/backend/src/service/image.service.tsx +++ b/projects/backend/src/service/image.service.tsx @@ -3,6 +3,12 @@ import { scoresaberService } from "@ssr/common/service/impl/scoresaber"; import React from "react"; import { formatNumberWithCommas, formatPp } from "@ssr/common/utils/number-utils"; import { getDifficultyFromScoreSaberDifficulty } from "website/src/common/scoresaber-utils"; +import NodeCache from "node-cache"; + +const imageCache = new NodeCache({ + stdTTL: 60 * 60, // 1 hour + checkperiod: 120, +}); export class ImageService { /** @@ -11,11 +17,16 @@ export class ImageService { * @param id the player's id */ public static async generatePlayerImage(id: string) { + const cacheKey = `player-${id}`; + if (imageCache.has(cacheKey)) { + return imageCache.get(cacheKey) as ImageResponse; + } + const player = await scoresaberService.lookupPlayer(id); if (player == undefined) { return undefined; } - return new ImageResponse( + const imageResponse = new ImageResponse( (