diff --git a/src/mediasources.ts b/src/mediasources.ts index 6c1b6404..b4922e7f 100644 --- a/src/mediasources.ts +++ b/src/mediasources.ts @@ -47,6 +47,10 @@ function MediaSources() { let subtitlesRequestTimeout = 5000 let failoverResetTimeMs = 120000 + // 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) => { if (!media.urls?.length) { @@ -81,6 +85,7 @@ function MediaSources() { } function failover(failoverParams: FailoverParams): Promise { + console.log('*** 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 - - DebugTool.info(`${mediaSource.cdn} has been added back in to available CDNs`) - sources[currentSources].push(mediaSource) - updateDebugOutput() - }, failoverResetTimeMs) - - failoverResetTokens.push(failoverResetToken as unknown as number) + const hasFailedBack = failBackCdns.includes(mediaSource.cdn); + + // If CDN does not exist in failBackCdns, add + // back in to the available mediasource CDNs + if (!hasFailedBack) { + const failoverResetToken = setTimeout(() => { + console.log('*** 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) + + updateDebugOutput() + }, failoverResetTimeMs) + + failoverResetTokens.push(failoverResetToken as unknown as number) + failBackCdns.push(mediaSource.cdn); + } } function updateCdns(serviceLocation: string | undefined): void {