47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
import { getUserById } from "$lib/api/user";
|
|
import { isErrorResponse, type User } from "$lib/types";
|
|
import { get, writable, type Writable } from "svelte/store";
|
|
|
|
const usersCache: Writable<Map<number, User>> = writable(new Map<number, User>());
|
|
|
|
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<User | null> {
|
|
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;
|
|
} |