a
This commit is contained in:
42
src/lib/stores/cache/messages.ts
vendored
Normal file
42
src/lib/stores/cache/messages.ts
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user