import { getUserById } from "$lib/api/user"; import { isErrorResponse, type User } from "$lib/types"; import { get, writable, type Writable } from "svelte/store"; const usersCache: Writable> = writable(new Map()); const runningCaches = new Set(); usersCache.subscribe((users) => { console.log(`Cached users: ${JSON.stringify([...users.values()])}`); }) export function addUserToCache(user: User) { usersCache.update((users) => users.set(user.id, user)); } export async function getCachedUser(userId: number): Promise { const cachedUser = get(usersCache).get(userId); if (cachedUser) return cachedUser; if (runningCaches.has(userId)) { return await new Promise((resolve) => { usersCache.subscribe((users) => { console.log(`subsribed called`); const user = users.get(userId); if (user) { runningCaches.delete(userId); resolve(user); } }); }); } runningCaches.add(userId); const response = await getUserById(userId); if (isErrorResponse(response)) return null; const user = response as User; addUserToCache(user); return user; }