42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { getMessageById } from "$lib/api/message";
|
|
import { isErrorResponse, type Message } from "$lib/types";
|
|
import { get, writable, type Writable } from "svelte/store";
|
|
|
|
const messagesCache: Writable<Map<number, Message>> = writable(new Map<number, Message>());
|
|
|
|
const runningCaches = new Set();
|
|
|
|
export function addMessageToCache(message: Message) {
|
|
messagesCache.update((messages) => messages.set(message.id, message));
|
|
}
|
|
|
|
export async function getCachedMessage(messageId: number): Promise<Message | null> {
|
|
const cached = get(messagesCache).get(messageId);
|
|
|
|
if (cached)
|
|
return cached;
|
|
|
|
if (runningCaches.has(messageId))
|
|
return await new Promise((resolve) => {
|
|
messagesCache.subscribe((users) => {
|
|
|
|
const user = users.get(messageId);
|
|
if (user) {
|
|
runningCaches.delete(messageId);
|
|
resolve(user);
|
|
}
|
|
});
|
|
});
|
|
|
|
runningCaches.add(messageId);
|
|
|
|
const response = await getMessageById(messageId);
|
|
if (isErrorResponse(response))
|
|
return null;
|
|
|
|
const message = response as Message;
|
|
|
|
addMessageToCache(message);
|
|
|
|
return message;
|
|
} |