diff --git a/api-extractor/report/hls.js.api.md b/api-extractor/report/hls.js.api.md index 30d9d4914ab..a828e25191b 100644 --- a/api-extractor/report/hls.js.api.md +++ b/api-extractor/report/hls.js.api.md @@ -1555,13 +1555,10 @@ export interface Loader { context: T; // (undocumented) destroy(): void; - // (undocumented) - getResponseHeader(name: string): string | null; + getCacheAge(): number; // (undocumented) load(context: LoaderContext, config: LoaderConfiguration, callbacks: LoaderCallbacks): void; // (undocumented) - loader: any; - // (undocumented) stats: LoaderStats; } diff --git a/package-lock.json b/package-lock.json index 3ce85d5b0cd..1f41d2ac320 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6007,6 +6007,16 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -10966,6 +10976,13 @@ "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -15801,6 +15818,13 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, "nanoid": { "version": "3.1.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", @@ -21861,7 +21885,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", @@ -22511,7 +22539,11 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", diff --git a/src/loader/playlist-loader.ts b/src/loader/playlist-loader.ts index 4dfb45daac8..ce8f4ccb5c1 100644 --- a/src/loader/playlist-loader.ts +++ b/src/loader/playlist-loader.ts @@ -684,8 +684,7 @@ class PlaylistLoader { } if (levelDetails.live) { - const ageHeader = loader.getResponseHeader('age'); - levelDetails.ageHeader = ageHeader ? parseFloat(ageHeader) : 0; + levelDetails.ageHeader = loader.getCacheAge(); } switch (type) { diff --git a/src/types/loader.ts b/src/types/loader.ts index 3bcf950904f..4b2745b2562 100644 --- a/src/types/loader.ts +++ b/src/types/loader.ts @@ -120,9 +120,12 @@ export interface Loader { config: LoaderConfiguration, callbacks: LoaderCallbacks ): void; - getResponseHeader(name: string): string | null; + /** + * Returns the time, in seconds, that this object has been in a proxy cache. + * For HTTP based loaders, this returns the value of the "age" HTTP header. + */ + getCacheAge(): number; context: T; - loader: any; stats: LoaderStats; } diff --git a/src/utils/fetch-loader.ts b/src/utils/fetch-loader.ts index 4fb139eaf69..ee3fc28ab77 100644 --- a/src/utils/fetch-loader.ts +++ b/src/utils/fetch-loader.ts @@ -37,7 +37,7 @@ class FetchLoader implements Loader { private config: LoaderConfiguration | null = null; private callbacks: LoaderCallbacks | null = null; public stats: LoaderStats; - public loader: Response | null = null; + private loader: Response | null = null; constructor(config /* HlsConfig */) { this.fetchSetup = config.fetchSetup || getRequest; @@ -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..6232ad9a624 100644 --- a/src/utils/xhr-loader.ts +++ b/src/utils/xhr-loader.ts @@ -17,7 +17,7 @@ class XhrLoader implements Loader { private callbacks: LoaderCallbacks | null = null; public context!: LoaderContext; - public loader: XMLHttpRequest | null = null; + private loader: XMLHttpRequest | null = null; public stats: LoaderStats; constructor(config /* HlsConfig */) { @@ -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; } } diff --git a/tests/unit/loader/fragment-loader.ts b/tests/unit/loader/fragment-loader.ts index 0fd614fc9f2..24705077dce 100644 --- a/tests/unit/loader/fragment-loader.ts +++ b/tests/unit/loader/fragment-loader.ts @@ -22,7 +22,6 @@ const expect = chai.expect; class MockXhr implements Loader { context!: LoaderContext; - loader: any; stats: LoadStats; callbacks?: LoaderCallbacks; @@ -36,8 +35,8 @@ class MockXhr implements Loader { abort() {} destroy(): void {} - getResponseHeader(name: string): string | null { - return null; + getCacheAge(): number { + return 0; } }