From da159bb0632010657599f350f416447ecb841e90 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:28:10 +0100 Subject: [PATCH] Stop retrying requests when the source is disposed, log warning in possible CORS detection case (see #158) --- src/misc.ts | 9 +++++++++ src/source.ts | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/misc.ts b/src/misc.ts index dfbc42d..b11c45f 100644 --- a/src/misc.ts +++ b/src/misc.ts @@ -584,6 +584,7 @@ export const retriedFetch = async ( url: string | URL | Request, requestInit: RequestInit, getRetryDelay: (previousAttempts: number, error: unknown, url: string | URL | Request) => number | null, + shouldStop: () => boolean, ) => { let attempts = 0; @@ -591,6 +592,10 @@ export const retriedFetch = async ( try { return await fetchFn(url, requestInit); } catch (error) { + if (shouldStop()) { + throw error; + } + attempts++; const retryDelayInSeconds = getRetryDelay(attempts, error, url); @@ -607,6 +612,10 @@ export const retriedFetch = async ( if (retryDelayInSeconds > 0) { await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds)); } + + if (shouldStop()) { + throw error; + } } } }; diff --git a/src/source.ts b/src/source.ts index 68ebac1..0f936a8 100644 --- a/src/source.ts +++ b/src/source.ts @@ -297,6 +297,10 @@ const DEFAULT_RETRY_DELAY = typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true; if (isOnline && originOfSrc !== null && originOfSrc !== window.location.origin) { + console.warn( + `Request will not be retried because a CORS error was suspected due to different origins. You can` + + ` modify this behavior by providing your own function for the 'getRetryDelay' option.`, + ); return null; } } @@ -425,6 +429,7 @@ export class UrlSource extends Source { signal: abortController.signal, }), this._getRetryDelay, + () => this._disposed, ); if (!response.ok) { @@ -492,6 +497,7 @@ export class UrlSource extends Source { signal: abortController.signal, }), this._getRetryDelay, + () => this._disposed, ); } @@ -539,6 +545,11 @@ export class UrlSource extends Source { try { readResult = await reader.read(); } catch (error) { + if (this._disposed) { + // No need to try to retry + throw error; + } + const retryDelayInSeconds = this._getRetryDelay(1, error, this._url); if (retryDelayInSeconds !== null) { console.error('Error while reading response stream. Attempting to resume.', error);