diff --git a/src/mediasources.ts b/src/mediasources.ts index 6c1b6404..133fb3ad 100644 --- a/src/mediasources.ts +++ b/src/mediasources.ts @@ -45,7 +45,11 @@ function MediaSources() { // Can be overridden with media.subtitlesRequestTimeout let subtitlesRequestTimeout = 5000 - let failoverResetTimeMs = 120000 + let failoverResetTimeMs = 5000 + + // Array of CDN names that failed for the playback session + // and we added back in after 120 seconds (failoverResetTimeMs) + const failBackCdns: string[] = [] function init(media: MediaDescriptor, setAudioDescribedOn?: boolean): Promise { return new Promise((resolve, reject) => { @@ -81,6 +85,7 @@ function MediaSources() { } function failover(failoverParams: FailoverParams): Promise { + DebugTool.info("*** Failover! ***") return new Promise((resolve, reject) => { if (!isFailoverInfoValid(failoverParams)) { return reject(new TypeError("Invalid failover params")) @@ -278,15 +283,24 @@ function MediaSources() { sources[currentSources] = failoverSort(sources[currentSources]) } - const failoverResetToken = setTimeout(() => { - if (mediaSource == null || sources[currentSources].length === 0) return + const hasFailedBack = failBackCdns.includes(mediaSource.cdn) - DebugTool.info(`${mediaSource.cdn} has been added back in to available CDNs`) - sources[currentSources].push(mediaSource) - updateDebugOutput() - }, failoverResetTimeMs) + // If CDN does not exist in failBackCdns, add + // back in to the available mediasource CDNs + if (!hasFailedBack) { + const failoverResetToken = setTimeout(() => { + DebugTool.info("*** Adding CDN back! ***") + if (mediaSource == null || sources[currentSources].length === 0) return + + DebugTool.info(`${mediaSource.cdn} has been added back in to available CDNs`) + sources[currentSources].push(mediaSource) - failoverResetTokens.push(failoverResetToken as unknown as number) + updateDebugOutput() + }, failoverResetTimeMs) + + failoverResetTokens.push(failoverResetToken as unknown as number) + failBackCdns.push(mediaSource.cdn) + } } function updateCdns(serviceLocation: string | undefined): void {