From d52000810c4b681cb93250900dd2ae5d1f11948a Mon Sep 17 00:00:00 2001 From: Jason Walton Date: Thu, 1 Apr 2021 16:28:35 -0400 Subject: [PATCH 1/2] fix: Replace Loader.getResponseHeader() with Loader.getCacheAge(). --- api-extractor/report/hls.js.api.md | 5 +++-- src/loader/playlist-loader.ts | 10 ++++++++-- src/types/loader.ts | 25 ++++++++++++++++++++++++- src/utils/fetch-loader.ts | 12 +++++------- src/utils/xhr-loader.ts | 13 +++++++++---- 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/api-extractor/report/hls.js.api.md b/api-extractor/report/hls.js.api.md index 30d9d4914ab..052627401cc 100644 --- a/api-extractor/report/hls.js.api.md +++ b/api-extractor/report/hls.js.api.md @@ -1555,8 +1555,9 @@ export interface Loader { context: T; // (undocumented) destroy(): void; - // (undocumented) - getResponseHeader(name: string): string | null; + getCacheAge?: () => number; + // @deprecated + getResponseHeader?: (name: 'age') => string | null; // (undocumented) load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks): void; // (undocumented) diff --git a/src/loader/playlist-loader.ts b/src/loader/playlist-loader.ts index 4dfb45daac8..e9c24671712 100644 --- a/src/loader/playlist-loader.ts +++ b/src/loader/playlist-loader.ts @@ -684,8 +684,14 @@ class PlaylistLoader { } if (levelDetails.live) { - const ageHeader = loader.getResponseHeader('age'); - levelDetails.ageHeader = ageHeader ? parseFloat(ageHeader) : 0; + if (loader.getCacheAge) { + levelDetails.ageHeader = loader.getCacheAge(); + } else if (loader.getResponseHeader) { + const ageHeaderStr = loader.getResponseHeader('age'); + levelDetails.ageHeader = ageHeaderStr ? parseFloat(ageHeaderStr) : 0; + } else { + levelDetails.ageHeader = 0; + } } switch (type) { diff --git a/src/types/loader.ts b/src/types/loader.ts index 3bcf950904f..7f3499ce459 100644 --- a/src/types/loader.ts +++ b/src/types/loader.ts @@ -120,7 +120,30 @@ export interface Loader { config: LoaderConfiguration, callbacks: LoaderCallbacks ): void; - getResponseHeader(name: string): string | null; + /** + * `getCacheAge()` is called by hls.js to get the duration that a given object + * has been sitting in a cache proxy when playing live. If implemented, + * this should return a value in seconds. + * + * For HTTP based loaders, this should return the contents of the "age" header. + * + * @returns time object being lodaded + */ + getCacheAge?: () => number; + /** + * `getResponseHeader()` is called by hls.js to get the duration that a given + * object has been sitting in a proxy cache when playing live. + * + * For HTTP based loaders, this should just return the "age" header. For + * non-HTTP based loaders, if the retrieved object has been cached, this + * should return the time the object has been in a cache, as a string, possibly + * with a decimal point. Otherwise implementers should return "0" or null. + * + * Note that HLS.js will never call this for a header other than "age". + * + * @deprecated - Implement `getCacheAge()` instead. + */ + getResponseHeader?: (name: 'age') => string | null; context: T; loader: any; stats: LoaderStats; diff --git a/src/utils/fetch-loader.ts b/src/utils/fetch-loader.ts index 4fb139eaf69..8614f6cf6e7 100644 --- a/src/utils/fetch-loader.ts +++ b/src/utils/fetch-loader.ts @@ -160,15 +160,13 @@ class FetchLoader implements Loader { }); } - getResponseHeader(name: string): string | null { + getCacheAge(): number { + let result: number = 0; if (this.response) { - try { - return this.response.headers.get(name); - } catch (error) { - /* Could not get header */ - } + const ageHeader = this.response.headers.get('age'); + result = ageHeader ? parseFloat(ageHeader) : 0; } - return null; + return result; } private loadProgressively( diff --git a/src/utils/xhr-loader.ts b/src/utils/xhr-loader.ts index ce6f2605d19..19fbc190c76 100644 --- a/src/utils/xhr-loader.ts +++ b/src/utils/xhr-loader.ts @@ -249,11 +249,16 @@ class XhrLoader implements Loader { } } - getResponseHeader(name: string): string | null { - if (this.loader && this.loader.getAllResponseHeaders().indexOf(name) >= 0) { - return this.loader.getResponseHeader(name); + getCacheAge(): number { + let result: number = 0; + if ( + this.loader && + this.loader.getAllResponseHeaders().indexOf('age') >= 0 + ) { + const ageHeader = this.loader.getResponseHeader('age'); + result = ageHeader ? parseFloat(ageHeader) : 0; } - return null; + return result; } } From ca962e5cff47719e8d049083d3384e58f713246b Mon Sep 17 00:00:00 2001 From: Jason Walton Date: Fri, 2 Apr 2021 18:08:34 -0400 Subject: [PATCH 2/2] refactor: Remove loader.getResponseHeader(). BREAKING CHANGE: Remove loader.getResponseHeader() in favor of loader.getCacheAge(). --- api-extractor/report/hls.js.api.md | 4 +--- src/loader/playlist-loader.ts | 8 +++----- src/types/loader.ts | 16 +--------------- src/utils/fetch-loader.ts | 6 +++--- src/utils/xhr-loader.ts | 6 +++--- tests/unit/loader/fragment-loader.ts | 3 --- 6 files changed, 11 insertions(+), 32 deletions(-) diff --git a/api-extractor/report/hls.js.api.md b/api-extractor/report/hls.js.api.md index 052627401cc..ad1df783d93 100644 --- a/api-extractor/report/hls.js.api.md +++ b/api-extractor/report/hls.js.api.md @@ -1555,9 +1555,7 @@ export interface Loader { context: T; // (undocumented) destroy(): void; - getCacheAge?: () => number; - // @deprecated - getResponseHeader?: (name: 'age') => string | null; + getCacheAge?: () => number | null; // (undocumented) load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks): void; // (undocumented) diff --git a/src/loader/playlist-loader.ts b/src/loader/playlist-loader.ts index e9c24671712..0eb16f62a3a 100644 --- a/src/loader/playlist-loader.ts +++ b/src/loader/playlist-loader.ts @@ -685,11 +685,9 @@ class PlaylistLoader { if (levelDetails.live) { if (loader.getCacheAge) { - levelDetails.ageHeader = loader.getCacheAge(); - } else if (loader.getResponseHeader) { - const ageHeaderStr = loader.getResponseHeader('age'); - levelDetails.ageHeader = ageHeaderStr ? parseFloat(ageHeaderStr) : 0; - } else { + levelDetails.ageHeader = loader.getCacheAge() || 0; + } + if (!loader.getCacheAge || isNaN(levelDetails.ageHeader)) { levelDetails.ageHeader = 0; } } diff --git a/src/types/loader.ts b/src/types/loader.ts index 7f3499ce459..fc1d03341fc 100644 --- a/src/types/loader.ts +++ b/src/types/loader.ts @@ -129,21 +129,7 @@ export interface Loader { * * @returns time object being lodaded */ - getCacheAge?: () => number; - /** - * `getResponseHeader()` is called by hls.js to get the duration that a given - * object has been sitting in a proxy cache when playing live. - * - * For HTTP based loaders, this should just return the "age" header. For - * non-HTTP based loaders, if the retrieved object has been cached, this - * should return the time the object has been in a cache, as a string, possibly - * with a decimal point. Otherwise implementers should return "0" or null. - * - * Note that HLS.js will never call this for a header other than "age". - * - * @deprecated - Implement `getCacheAge()` instead. - */ - getResponseHeader?: (name: 'age') => string | null; + getCacheAge?: () => number | null; context: T; loader: any; stats: LoaderStats; diff --git a/src/utils/fetch-loader.ts b/src/utils/fetch-loader.ts index 8614f6cf6e7..0edaf1be492 100644 --- a/src/utils/fetch-loader.ts +++ b/src/utils/fetch-loader.ts @@ -160,11 +160,11 @@ class FetchLoader implements Loader { }); } - getCacheAge(): number { - let result: number = 0; + getCacheAge(): number | null { + let result: number | null = null; if (this.response) { const ageHeader = this.response.headers.get('age'); - result = ageHeader ? parseFloat(ageHeader) : 0; + result = ageHeader ? parseFloat(ageHeader) : null; } return result; } diff --git a/src/utils/xhr-loader.ts b/src/utils/xhr-loader.ts index 19fbc190c76..c7b45fca004 100644 --- a/src/utils/xhr-loader.ts +++ b/src/utils/xhr-loader.ts @@ -249,14 +249,14 @@ class XhrLoader implements Loader { } } - getCacheAge(): number { - let result: number = 0; + getCacheAge(): number | null { + let result: number | null = null; if ( this.loader && this.loader.getAllResponseHeaders().indexOf('age') >= 0 ) { const ageHeader = this.loader.getResponseHeader('age'); - result = ageHeader ? parseFloat(ageHeader) : 0; + result = ageHeader ? parseFloat(ageHeader) : null; } return result; } diff --git a/tests/unit/loader/fragment-loader.ts b/tests/unit/loader/fragment-loader.ts index 0fd614fc9f2..3be1a4e0a25 100644 --- a/tests/unit/loader/fragment-loader.ts +++ b/tests/unit/loader/fragment-loader.ts @@ -36,9 +36,6 @@ class MockXhr implements Loader { abort() {} destroy(): void {} - getResponseHeader(name: string): string | null { - return null; - } } describe('FragmentLoader tests', function () {