diff --git a/bun.lockb b/bun.lockb index 4eba9f0..28c7ae4 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/projects/website/package.json b/projects/website/package.json index f6ba20c..c1103e0 100644 --- a/projects/website/package.json +++ b/projects/website/package.json @@ -37,9 +37,9 @@ "next-build-id": "^3.0.0", "next-themes": "^0.3.0", "node-cache": "^5.1.2", - "react": "19.0.0-rc-d5bba18b-20241009", + "react": "19.0.0-rc-3edc000d-20240926", "react-chartjs-2": "^5.2.0", - "react-dom": "19.0.0-rc-d5bba18b-20241009", + "react-dom": "19.0.0-rc-3edc000d-20240926", "react-hook-form": "^7.53.0", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", diff --git a/projects/website/src/app/(pages)/leaderboard/[...slug]/page.tsx b/projects/website/src/app/(pages)/leaderboard/[...slug]/page.tsx index 27b7cb8..cd74385 100644 --- a/projects/website/src/app/(pages)/leaderboard/[...slug]/page.tsx +++ b/projects/website/src/app/(pages)/leaderboard/[...slug]/page.tsx @@ -5,6 +5,7 @@ import { getAverageColor } from "@/common/image-utils"; import { LeaderboardData } from "@/components/leaderboard/leaderboard-data"; import { scoresaberService } from "@ssr/common/service/impl/scoresaber"; import ScoreSaberLeaderboardScoresPageToken from "@ssr/common/types/token/scoresaber/score-saber-leaderboard-scores-page-token"; +import NodeCache from "node-cache"; import ScoreSaberLeaderboardToken from "@ssr/common/types/token/scoresaber/score-saber-leaderboard-token"; const UNKNOWN_LEADERBOARD = { @@ -27,6 +28,8 @@ type LeaderboardData = { page: number; }; +const leaderboardCache = new NodeCache({ stdTTL: 60, checkperiod: 120 }); + /** * Gets the leaderboard data and scores * @@ -39,17 +42,25 @@ const getLeaderboardData = async ({ params }: Props, fetchScores: boolean = true const id = slug[0]; // The leaderboard id const page = parseInt(slug[1]) || 1; // The page number + const cacheId = `${id}-${page}`; + if (leaderboardCache.has(cacheId)) { + return leaderboardCache.get(cacheId) as LeaderboardData; + } + const leaderboard = await scoresaberService.lookupLeaderboard(id); let scores: ScoreSaberLeaderboardScoresPageToken | undefined; if (fetchScores) { scores = await scoresaberService.lookupLeaderboardScores(id + "", page); } - return { + const leaderboardData = { page: page, leaderboard: leaderboard, scores: scores, }; + + leaderboardCache.set(cacheId, leaderboardData); + return leaderboardData; }; export async function generateMetadata(props: Props): Promise { diff --git a/projects/website/src/app/(pages)/player/[...slug]/page.tsx b/projects/website/src/app/(pages)/player/[...slug]/page.tsx index 4488e24..f19057c 100644 --- a/projects/website/src/app/(pages)/player/[...slug]/page.tsx +++ b/projects/website/src/app/(pages)/player/[...slug]/page.tsx @@ -35,6 +35,8 @@ type PlayerData = { search: string; }; +const playerCache = new NodeCache({ stdTTL: 60, checkperiod: 120 }); + /** * Gets the player data and scores * @@ -49,6 +51,11 @@ const getPlayerData = async ({ params }: Props, fetchScores: boolean = true): Pr const page = parseInt(slug[2]) || 1; // The page number const search = (slug[3] as string) || ""; // The search query + const cacheId = `${id}-${sort}-${page}-${search}`; + if (playerCache.has(cacheId)) { + return playerCache.get(cacheId) as PlayerData; + } + const playerToken = await scoresaberService.lookupPlayer(id); const player = playerToken && (await getScoreSaberPlayerFromToken(playerToken, config.siteApi, cookies().get("playerId")?.value)); @@ -62,13 +69,15 @@ const getPlayerData = async ({ params }: Props, fetchScores: boolean = true): Pr }); } - return { + const playerData = { sort: sort, page: page, search: search, player: player, scores: scores, }; + playerCache.set(cacheId, playerData); + return playerData; }; export async function generateMetadata(props: Props): Promise {