diff --git a/src/api/client.ts b/src/api/client.ts index 4adab2d..f891aa3 100644 --- a/src/api/client.ts +++ b/src/api/client.ts @@ -1,6 +1,7 @@ import { store } from "@store/state.svelte"; import { fetchAuthenticated, AuthRequiredError, uiAuth } from "../core/auth"; import { boot } from "@store/boot.svelte"; +import { getBlobUrl } from "@core/cache/imageCache"; const DEFAULT_URL = "http://127.0.0.1:4567"; @@ -25,20 +26,15 @@ export function getServerUrl(): string { export function plainThumbUrl(path: string): string { if (!path) return ""; if (path.startsWith("http")) return path; - - const base = `${getServerUrl()}${path}`; + return `${getServerUrl()}${path}`; +} + +export async function resolveImageUrl(path: string): Promise { + if (!path) return ""; + const url = path.startsWith("http") ? path : `${getServerUrl()}${path}`; const mode = store.settings.serverAuthMode ?? "NONE"; - - if (mode === "UI_LOGIN") { - const token = uiAuth.getToken(); - if (token) { - const url = new URL(base); - url.searchParams.set("authorization", token); - return url.toString(); - } - } - - return base; + if (mode === "NONE") return url; + return getBlobUrl(url); } export const thumbUrl = plainThumbUrl; diff --git a/src/core/cache/imageCache.ts b/src/core/cache/imageCache.ts index 18a8024..82a034a 100644 --- a/src/core/cache/imageCache.ts +++ b/src/core/cache/imageCache.ts @@ -56,7 +56,7 @@ function drain() { active++; doFetch(entry.url) .then(entry.resolve, entry.reject) - .finally(() => { inflight.delete(entry.url); active--; drain(); }); + .finally(() => { active--; drain(); }); } } @@ -67,7 +67,12 @@ function scheduleDrain() { } function enqueue(url: string, priority: number): Promise { - const promise = new Promise((resolve, reject) => { insertSorted({ url, priority, resolve, reject }); }); + const promise = new Promise((resolve, reject) => { + insertSorted({ url, priority, resolve, reject }); + }).catch(err => { + inflight.delete(url); + return Promise.reject(err); + }); inflight.set(url, promise); scheduleDrain(); return promise; diff --git a/src/core/cache/pageCache.ts b/src/core/cache/pageCache.ts index 9169a21..be7d9f8 100644 --- a/src/core/cache/pageCache.ts +++ b/src/core/cache/pageCache.ts @@ -1,5 +1,5 @@ import { gql, getServerUrl } from "@api/client"; -import { getBlobUrl, preloadBlobUrls } from "@core/cache/imageCache"; +import { getBlobUrl } from "@core/cache/imageCache"; import { dedupeRequest } from "@core/async/batchRequests"; import { FETCH_CHAPTER_PAGES } from "@api/mutations/chapters"; @@ -11,8 +11,14 @@ const aspectCache = new Map(); export function resolveUrl(url: string, useBlob: boolean, priority = 0): Promise { if (!useBlob) return Promise.resolve(url); - if (!resolvedUrlCache.has(url)) resolvedUrlCache.set(url, getBlobUrl(url, priority)); - return resolvedUrlCache.get(url)!; + const cached = resolvedUrlCache.get(url); + if (cached) return cached; + const p = getBlobUrl(url, priority).catch(err => { + resolvedUrlCache.delete(url); + return Promise.reject(err); + }); + resolvedUrlCache.set(url, p); + return p; } export function fetchPages( @@ -30,10 +36,7 @@ export function fetchPages( gql<{ fetchChapterPages: { pages: string[] } }>(FETCH_CHAPTER_PAGES, { chapterId }) .then(d => { const urls = d.fetchChapterPages.pages.map(p => p.startsWith("http") ? p : `${getServerUrl()}${p}`); - if (useBlob) { - if (urls[priorityPage]) getBlobUrl(urls[priorityPage], urls.length + 999); - preloadBlobUrls(urls.filter((_, i) => i !== priorityPage), urls.length); - } + if (useBlob && urls[priorityPage]) getBlobUrl(urls[priorityPage], 999); pageCache.set(chapterId, urls); return urls; }) diff --git a/src/core/cache/queryCache.ts b/src/core/cache/queryCache.ts index ddcbcff..b2fbd08 100644 --- a/src/core/cache/queryCache.ts +++ b/src/core/cache/queryCache.ts @@ -159,3 +159,16 @@ export function getTopSources(sources: T[]): T[] { } return sources.slice(0, MAX_FRECENCY_SOURCES); } + +export async function refreshMangaCache(mangaId: number, thumbnailUrl?: string): Promise { + cache.clear(CACHE_KEYS.MANGA(mangaId)); + cache.clear(CACHE_KEYS.CHAPTERS(mangaId)); + cache.clear(CACHE_KEYS.LIBRARY); + cache.clear(CACHE_KEYS.ALL_MANGA); + + if (thumbnailUrl) { + const { revokeBlobUrl, getBlobUrl } = await import("@core/cache/imageCache"); + revokeBlobUrl(thumbnailUrl); + getBlobUrl(thumbnailUrl, 999).catch(() => {}); + } +} \ No newline at end of file diff --git a/src/features/home/components/Home.svelte b/src/features/home/components/Home.svelte index 1f63872..cd040b2 100644 --- a/src/features/home/components/Home.svelte +++ b/src/features/home/components/Home.svelte @@ -1,7 +1,6 @@