mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 05:25:40 +09:00
fix(app): retry failed images at once when back online (#3327)
This commit is contained in:
1 parent
fff67ed9af
commit
12daeb758d
1 file changed
+25
-1
@@ -26,6 +26,8 @@ interface ImageCacheEntry {
|
|||||||
failedUntil: number;
|
failedUntil: number;
|
||||||
loadTimeoutId: number;
|
loadTimeoutId: number;
|
||||||
retryTimeoutId: number;
|
retryTimeoutId: number;
|
||||||
|
retryResume: (() => void) | null;
|
||||||
|
retryOnSettle: boolean;
|
||||||
connectivityListener: (() => void) | null;
|
connectivityListener: (() => void) | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +98,7 @@ function clearRetryState(entry: ImageCacheEntry): void {
|
|||||||
window.clearTimeout(entry.retryTimeoutId);
|
window.clearTimeout(entry.retryTimeoutId);
|
||||||
entry.retryTimeoutId = 0;
|
entry.retryTimeoutId = 0;
|
||||||
}
|
}
|
||||||
|
entry.retryResume = null;
|
||||||
if (entry.connectivityListener != null) {
|
if (entry.connectivityListener != null) {
|
||||||
window.removeEventListener('online', entry.connectivityListener);
|
window.removeEventListener('online', entry.connectivityListener);
|
||||||
entry.connectivityListener = null;
|
entry.connectivityListener = null;
|
||||||
@@ -148,6 +151,7 @@ function failEntry(entry: ImageCacheEntry): void {
|
|||||||
entry.failedCycles += 1;
|
entry.failedCycles += 1;
|
||||||
entry.retryDelayMs = IMAGE_RETRY_INITIAL_DELAY_MS;
|
entry.retryDelayMs = IMAGE_RETRY_INITIAL_DELAY_MS;
|
||||||
entry.failedUntil = Date.now() + failureCooldownMs(entry.failedCycles);
|
entry.failedUntil = Date.now() + failureCooldownMs(entry.failedCycles);
|
||||||
|
entry.retryOnSettle = false;
|
||||||
abandonEntry(entry);
|
abandonEntry(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,6 +166,7 @@ function settleLoaded(entry: ImageCacheEntry, image: HTMLImageElement): void {
|
|||||||
entry.failedCycles = 0;
|
entry.failedCycles = 0;
|
||||||
entry.retryDelayMs = IMAGE_RETRY_INITIAL_DELAY_MS;
|
entry.retryDelayMs = IMAGE_RETRY_INITIAL_DELAY_MS;
|
||||||
entry.failedUntil = 0;
|
entry.failedUntil = 0;
|
||||||
|
entry.retryOnSettle = false;
|
||||||
try {
|
try {
|
||||||
notifySubscribers(entry, true);
|
notifySubscribers(entry, true);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -217,9 +222,23 @@ function scheduleRetryOrFail(entry: ImageCacheEntry): void {
|
|||||||
window.addEventListener('online', resume, {once: true});
|
window.addEventListener('online', resume, {once: true});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (entry.retryOnSettle) {
|
||||||
|
entry.retryOnSettle = false;
|
||||||
|
resume();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
entry.retryResume = resume;
|
||||||
entry.retryTimeoutId = window.setTimeout(resume, retryDelayForAttempt(entry));
|
entry.retryTimeoutId = window.setTimeout(resume, retryDelayForAttempt(entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function expediteRetry(entry: ImageCacheEntry): void {
|
||||||
|
if (entry.retryResume != null) {
|
||||||
|
entry.retryResume();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (entry.image != null) entry.retryOnSettle = true;
|
||||||
|
}
|
||||||
|
|
||||||
function createEntry(src: string): ImageCacheEntry {
|
function createEntry(src: string): ImageCacheEntry {
|
||||||
const entry: ImageCacheEntry = {
|
const entry: ImageCacheEntry = {
|
||||||
src,
|
src,
|
||||||
@@ -234,6 +253,8 @@ function createEntry(src: string): ImageCacheEntry {
|
|||||||
failedUntil: 0,
|
failedUntil: 0,
|
||||||
loadTimeoutId: 0,
|
loadTimeoutId: 0,
|
||||||
retryTimeoutId: 0,
|
retryTimeoutId: 0,
|
||||||
|
retryResume: null,
|
||||||
|
retryOnSettle: false,
|
||||||
connectivityListener: null,
|
connectivityListener: null,
|
||||||
};
|
};
|
||||||
imageCache.set(src, entry);
|
imageCache.set(src, entry);
|
||||||
@@ -394,8 +415,11 @@ function attemptRecovery(recovery: ImageRecovery): void {
|
|||||||
|
|
||||||
function wakeRecoveries(): void {
|
function wakeRecoveries(): void {
|
||||||
for (const recovery of [...recoveries.values()]) {
|
for (const recovery of [...recoveries.values()]) {
|
||||||
if (recovery.cancelLoad != null) continue;
|
|
||||||
const entry = imageCache.peek(recovery.src);
|
const entry = imageCache.peek(recovery.src);
|
||||||
|
if (recovery.cancelLoad != null) {
|
||||||
|
if (entry != null) expediteRetry(entry);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (entry != null && !isLoadInFlight(entry)) entry.failedUntil = 0;
|
if (entry != null && !isLoadInFlight(entry)) entry.failedUntil = 0;
|
||||||
attemptRecovery(recovery);
|
attemptRecovery(recovery);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user