From 499cb40d3a9befd4f5cd8d6a1215bddd49a31ee3 Mon Sep 17 00:00:00 2001 From: calli Date: Sun, 9 Nov 2025 22:54:56 +0200 Subject: [PATCH] cache planets for one minute so we dont spam ESI --- src/planets.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/planets.ts b/src/planets.ts index 8b9e7dc..31ced9f 100644 --- a/src/planets.ts +++ b/src/planets.ts @@ -22,10 +22,51 @@ export const getPlanets = async (character: AccessToken): Promise => { return planets; }; +interface CachedPlanetData { + data: PlanetInfo; + timestamp: number; +} + +const CACHE_DURATION_MS = 60_000; // 1 minute +const CACHE_STORAGE_KEY = "planet_cache"; + +const loadCacheFromStorage = (): Map => { + try { + const stored = localStorage.getItem(CACHE_STORAGE_KEY); + if (stored) { + const parsed = JSON.parse(stored); + return new Map(Object.entries(parsed)); + } + } catch (error) { + console.error("Failed to load planet cache from localStorage:", error); + } + return new Map(); +}; + +const saveCacheToStorage = (cache: Map) => { + try { + const obj = Object.fromEntries(cache); + localStorage.setItem(CACHE_STORAGE_KEY, JSON.stringify(obj)); + } catch (error) { + console.error("Failed to save planet cache to localStorage:", error); + } +}; + +const planetCache = loadCacheFromStorage(); + export const getPlanet = async ( character: AccessToken, planet: Planet, ): Promise => { + const cacheKey = `${character.character.characterId}-${planet.planet_id}`; + const cached = planetCache.get(cacheKey); + + if (cached && Date.now() - cached.timestamp < CACHE_DURATION_MS) { + console.log(`[Cache HIT] Planet ${planet.planet_id} for character ${character.character.characterId}`); + return cached.data; + } + + console.log(`[Cache MISS] Fetching planet ${planet.planet_id} for character ${character.character.characterId}`); const api = new Api(); const planetInfo = ( await api.v3.getCharactersCharacterIdPlanetsPlanetId( @@ -36,6 +77,15 @@ export const getPlanet = async ( }, ) ).data; + + planetCache.set(cacheKey, { + data: planetInfo, + timestamp: Date.now(), + }); + + // Persist to localStorage + saveCacheToStorage(planetCache); + return planetInfo; };