Skip to content

Commit ecf9bb5

Browse files
authored
fix(client): retry failed image preloads instead of giving up silently (#2649)
1 parent 64ac820 commit ecf9bb5

1 file changed

Lines changed: 11 additions & 0 deletions

File tree

packages/client/composables/usePreloadImages.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ function resolveUrl(url: string): string {
1414
return `${base}${url.startsWith('/') ? url : `/${url}`}`
1515
}
1616

17+
const RETRY_LIMIT = 2
18+
const retries = new Map<string, number>()
19+
1720
function preloadImage(url: string): void {
1821
const resolved = resolveUrl(url)
1922
if (loaded.has(resolved) || loading.has(resolved))
@@ -23,9 +26,17 @@ function preloadImage(url: string): void {
2326
img.onload = () => {
2427
loading.delete(resolved)
2528
loaded.add(resolved)
29+
retries.delete(resolved)
2630
}
2731
img.onerror = () => {
2832
loading.delete(resolved)
33+
// Retry transient preload failures (e.g. flaky network) instead of silently
34+
// giving up; bounded so genuinely-missing assets aren't hammered.
35+
const attempts = retries.get(resolved) ?? 0
36+
if (attempts < RETRY_LIMIT) {
37+
retries.set(resolved, attempts + 1)
38+
setTimeout(preloadImage, 1000 * (attempts + 1), url)
39+
}
2940
}
3041
img.src = resolved
3142
}

0 commit comments

Comments
 (0)