rx-player 3.29.0-dev.2022091600 → 3.29.0-dev.2022103100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +22 -10
  2. package/MAINTAINERS.md +2 -1
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -1
  5. package/dist/_esm5.processed/compat/browser_detection.js +7 -1
  6. package/dist/_esm5.processed/compat/can_reuse_media_keys.d.ts +12 -0
  7. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +15 -0
  8. package/dist/_esm5.processed/compat/enable_audio_track.d.ts +11 -0
  9. package/dist/_esm5.processed/compat/enable_audio_track.js +26 -0
  10. package/dist/_esm5.processed/compat/index.d.ts +4 -2
  11. package/dist/_esm5.processed/compat/index.js +4 -2
  12. package/dist/_esm5.processed/compat/{should_renew_media_keys.d.ts → should_renew_media_key_system_access.d.ts} +3 -3
  13. package/dist/_esm5.processed/compat/{should_renew_media_keys.js → should_renew_media_key_system_access.js} +3 -3
  14. package/dist/_esm5.processed/config.d.ts +1 -0
  15. package/dist/_esm5.processed/core/api/playback_observer.d.ts +14 -5
  16. package/dist/_esm5.processed/core/api/playback_observer.js +54 -22
  17. package/dist/_esm5.processed/core/api/public_api.d.ts +7 -4
  18. package/dist/_esm5.processed/core/api/public_api.js +79 -61
  19. package/dist/_esm5.processed/core/api/tracks_management/media_element_track_choice_manager.js +9 -10
  20. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +1 -1
  21. package/dist/_esm5.processed/core/decrypt/find_key_system.js +3 -3
  22. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +4 -1
  23. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +98 -0
  24. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +173 -0
  25. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +4 -4
  26. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -1
  27. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +15 -16
  28. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +3 -1
  29. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +5 -2
  30. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +103 -0
  31. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +414 -0
  32. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.d.ts +4 -3
  33. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +21 -22
  34. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +18 -4
  35. package/dist/_esm5.processed/core/init/initialize_media_source.js +10 -2
  36. package/dist/_esm5.processed/core/init/load_on_media_source.js +7 -1
  37. package/dist/_esm5.processed/core/init/stall_avoider.js +3 -1
  38. package/dist/_esm5.processed/default_config.d.ts +11 -0
  39. package/dist/_esm5.processed/default_config.js +11 -0
  40. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +1 -1
  41. package/dist/_esm5.processed/manifest/manifest.js +11 -2
  42. package/dist/_esm5.processed/manifest/representation.d.ts +12 -1
  43. package/dist/_esm5.processed/manifest/representation.js +1 -0
  44. package/dist/_esm5.processed/manifest/representation_index/static.d.ts +1 -1
  45. package/dist/_esm5.processed/manifest/representation_index/static.js +2 -2
  46. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +32 -15
  47. package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -0
  48. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +10 -9
  49. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +11 -11
  50. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +1 -1
  51. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +3 -3
  52. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -1
  53. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +4 -4
  54. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +7 -7
  55. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +12 -8
  56. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +5 -6
  57. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +16 -16
  58. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +11 -10
  59. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +14 -13
  60. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +3 -4
  61. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -12
  62. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +2 -4
  63. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +1 -3
  64. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +6 -2
  65. package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +1 -2
  66. package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +3 -8
  67. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.d.ts +1 -1
  68. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +2 -20
  69. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +0 -6
  70. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +0 -11
  71. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +5 -1
  72. package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +2 -1
  73. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +2 -2
  74. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +7 -1
  75. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +17 -11
  76. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +2 -2
  77. package/dist/_esm5.processed/parsers/manifest/types.d.ts +24 -0
  78. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +8 -1
  79. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +9 -1
  80. package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +2 -1
  81. package/dist/_esm5.processed/transports/dash/construct_segment_url.d.ts +18 -0
  82. package/dist/_esm5.processed/transports/dash/construct_segment_url.js +21 -0
  83. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
  84. package/dist/_esm5.processed/transports/dash/image_pipelines.js +5 -3
  85. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -2
  86. package/dist/_esm5.processed/transports/dash/text_loader.js +4 -2
  87. package/dist/_esm5.processed/transports/dash/text_parser.js +3 -1
  88. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
  89. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
  90. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +8 -8
  91. package/dist/_esm5.processed/transports/smooth/pipelines.js +11 -7
  92. package/dist/_esm5.processed/transports/smooth/utils.d.ts +4 -2
  93. package/dist/_esm5.processed/transports/smooth/utils.js +7 -1
  94. package/dist/_esm5.processed/transports/types.d.ts +5 -3
  95. package/dist/_esm5.processed/utils/event_emitter.d.ts +1 -2
  96. package/dist/_esm5.processed/utils/resolve_url.d.ts +7 -4
  97. package/dist/_esm5.processed/utils/resolve_url.js +11 -8
  98. package/dist/mpd-parser.wasm +0 -0
  99. package/dist/rx-player.js +5656 -13236
  100. package/dist/rx-player.min.js +1 -1
  101. package/jest.config.js +28 -23
  102. package/package.json +29 -29
  103. package/sonar-project.properties +1 -1
  104. package/src/compat/__tests__/can_reuse_media_keys.test.ts +54 -0
  105. package/src/compat/__tests__/enable_audio_track.test.ts +341 -0
  106. package/src/compat/__tests__/{should_renew_media_keys.test.ts → should_renew_media_key_system_access.test.ts} +7 -5
  107. package/src/compat/browser_detection.ts +10 -0
  108. package/src/compat/can_reuse_media_keys.ts +19 -0
  109. package/src/compat/enable_audio_track.ts +33 -0
  110. package/src/compat/index.ts +6 -2
  111. package/src/compat/{should_renew_media_keys.ts → should_renew_media_key_system_access.ts} +3 -3
  112. package/src/core/api/playback_observer.ts +97 -33
  113. package/src/core/api/public_api.ts +126 -74
  114. package/src/core/api/tracks_management/media_element_track_choice_manager.ts +3 -11
  115. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +182 -0
  116. package/src/core/decrypt/__tests__/__global__/utils.ts +2 -0
  117. package/src/core/decrypt/find_key_system.ts +3 -3
  118. package/src/core/decrypt/get_media_keys.ts +5 -1
  119. package/src/core/fetchers/cdn_prioritizer.ts +198 -0
  120. package/src/core/fetchers/manifest/manifest_fetcher.ts +7 -11
  121. package/src/core/fetchers/segment/segment_fetcher.ts +12 -10
  122. package/src/core/fetchers/segment/segment_fetcher_creator.ts +10 -1
  123. package/src/core/fetchers/utils/schedule_request.ts +482 -0
  124. package/src/core/init/content_time_boundaries_observer.ts +12 -12
  125. package/src/core/init/initialize_media_source.ts +31 -4
  126. package/src/core/init/load_on_media_source.ts +11 -2
  127. package/src/core/init/stall_avoider.ts +4 -1
  128. package/src/core/stream/orchestrator/stream_orchestrator.ts +0 -1
  129. package/src/default_config.ts +12 -0
  130. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +1 -0
  131. package/src/manifest/manifest.ts +11 -2
  132. package/src/manifest/representation.ts +15 -0
  133. package/src/manifest/representation_index/__tests__/static.test.ts +1 -1
  134. package/src/manifest/representation_index/static.ts +3 -3
  135. package/src/manifest/representation_index/types.ts +33 -15
  136. package/src/manifest/update_period_in_place.ts +1 -0
  137. package/src/parsers/manifest/dash/common/indexes/base.ts +22 -23
  138. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +6 -4
  139. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +5 -5
  140. package/src/parsers/manifest/dash/common/indexes/list.ts +19 -20
  141. package/src/parsers/manifest/dash/common/indexes/template.ts +23 -27
  142. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +25 -23
  143. package/src/parsers/manifest/dash/common/indexes/tokens.ts +7 -18
  144. package/src/parsers/manifest/dash/common/parse_mpd.ts +2 -4
  145. package/src/parsers/manifest/dash/common/parse_representation_index.ts +1 -6
  146. package/src/parsers/manifest/dash/common/parse_representations.ts +9 -0
  147. package/src/parsers/manifest/dash/common/resolve_base_urls.ts +5 -9
  148. package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +2 -29
  149. package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/AdaptationSet.test.ts +7 -11
  150. package/src/parsers/manifest/dash/node_parser_types.ts +0 -7
  151. package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +3 -1
  152. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +1 -8
  153. package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +0 -13
  154. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +8 -0
  155. package/src/parsers/manifest/local/parse_local_manifest.ts +1 -0
  156. package/src/parsers/manifest/local/representation_index.ts +2 -2
  157. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +7 -1
  158. package/src/parsers/manifest/smooth/create_parser.ts +17 -13
  159. package/src/parsers/manifest/smooth/representation_index.ts +2 -2
  160. package/src/parsers/manifest/types.ts +26 -1
  161. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +15 -0
  162. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +15 -0
  163. package/src/parsers/texttracks/ttml/html/apply_extent.ts +8 -1
  164. package/src/parsers/texttracks/ttml/html/apply_origin.ts +9 -1
  165. package/src/parsers/texttracks/ttml/html/create_element.ts +2 -2
  166. package/src/transports/dash/construct_segment_url.ts +28 -0
  167. package/src/transports/dash/image_pipelines.ts +5 -2
  168. package/src/transports/dash/segment_loader.ts +5 -2
  169. package/src/transports/dash/text_loader.ts +5 -2
  170. package/src/transports/dash/text_parser.ts +3 -1
  171. package/src/transports/local/segment_loader.ts +3 -2
  172. package/src/transports/metaplaylist/pipelines.ts +28 -9
  173. package/src/transports/smooth/pipelines.ts +12 -6
  174. package/src/transports/smooth/utils.ts +13 -1
  175. package/src/transports/types.ts +6 -3
  176. package/src/utils/__tests__/event_emitter.test.ts +72 -67
  177. package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -7
  178. package/src/utils/__tests__/resolve_url.test.ts +27 -23
  179. package/src/utils/event_emitter.ts +1 -3
  180. package/src/utils/resolve_url.ts +11 -8
  181. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.d.ts +0 -85
  182. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +0 -264
  183. package/dummy +0 -1
  184. package/src/core/fetchers/utils/try_urls_with_backoff.ts +0 -287
package/jest.config.js CHANGED
@@ -9,7 +9,7 @@ module.exports = {
9
9
  // Without this, Jest just fails when importing rxjs, for some arcane
10
10
  // ESM-vs-CommonJS reasons linked to how it works internally.
11
11
  moduleNameMapper: {
12
- '^rxjs$': require.resolve('rxjs'),
12
+ "^rxjs$": require.resolve("rxjs"),
13
13
  },
14
14
  testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"],
15
15
  collectCoverageFrom: [
@@ -17,29 +17,34 @@ module.exports = {
17
17
  "!src/**/index.ts",
18
18
  "!**/__tests__/**",
19
19
  ],
20
- globals: {
21
- "ts-jest": {
22
- tsconfig: {
23
- target: "es2017",
24
- lib: ["es2017", "dom"],
25
- forceConsistentCasingInFileNames: true,
26
- skipLibCheck: false,
27
- noImplicitAny: true,
28
- strict: true,
29
- strictNullChecks: true,
30
- strictPropertyInitialization: true,
31
- noUnusedParameters: true,
32
- noUnusedLocals: true,
33
- types: ["node", "jest"],
34
- module: "es2015",
35
- moduleResolution: "node",
36
- esModuleInterop: true,
37
- typeRoots: [
38
- "./src/typings",
39
- "./node_modules/@types",
40
- ],
20
+ transform: {
21
+ "^.+\\.tsx?$": [
22
+ "ts-jest",
23
+ {
24
+ tsconfig: {
25
+ target: "es2017",
26
+ lib: ["es2017", "dom"],
27
+ forceConsistentCasingInFileNames: true,
28
+ skipLibCheck: false,
29
+ noImplicitAny: true,
30
+ strict: true,
31
+ strictNullChecks: true,
32
+ strictPropertyInitialization: true,
33
+ noUnusedParameters: true,
34
+ noUnusedLocals: true,
35
+ types: ["node", "jest"],
36
+ module: "es2015",
37
+ moduleResolution: "node",
38
+ esModuleInterop: true,
39
+ typeRoots: [
40
+ "./src/typings",
41
+ "./node_modules/@types",
42
+ ],
43
+ },
41
44
  },
42
- },
45
+ ],
46
+ },
47
+ globals: {
43
48
  __FEATURES__: {
44
49
  IS_DISABLED: 0,
45
50
  IS_ENABLED: 1,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rx-player",
3
3
  "author": "Canal+",
4
- "version": "3.29.0-dev.2022091600",
4
+ "version": "3.29.0-dev.2022103100",
5
5
  "description": "Canal+ HTML5 Video Player",
6
6
  "main": "./dist/rx-player.js",
7
7
  "keywords": [
@@ -78,59 +78,59 @@
78
78
  },
79
79
  "dependencies": {
80
80
  "next-tick": "1.1.0",
81
- "rxjs": "7.4.0"
81
+ "rxjs": "7.5.7"
82
82
  },
83
83
  "devDependencies": {
84
- "@babel/core": "7.18.13",
85
- "@babel/plugin-transform-runtime": "7.18.10",
86
- "@babel/preset-env": "7.18.10",
84
+ "@babel/core": "7.19.6",
85
+ "@babel/plugin-transform-runtime": "7.19.6",
86
+ "@babel/preset-env": "7.19.4",
87
87
  "@babel/preset-react": "7.18.6",
88
88
  "@types/chai": "4.3.3",
89
- "@types/jest": "28.1.8",
90
- "@types/mocha": "9.1.1",
91
- "@types/node": "18.7.14",
89
+ "@types/jest": "29.2.0",
90
+ "@types/mocha": "10.0.0",
91
+ "@types/node": "18.11.8",
92
92
  "@types/sinon": "10.0.13",
93
- "@typescript-eslint/eslint-plugin": "5.36.1",
94
- "@typescript-eslint/eslint-plugin-tslint": "5.36.1",
95
- "@typescript-eslint/parser": "5.36.1",
93
+ "@typescript-eslint/eslint-plugin": "5.41.0",
94
+ "@typescript-eslint/eslint-plugin-tslint": "5.41.0",
95
+ "@typescript-eslint/parser": "5.41.0",
96
96
  "arraybuffer-loader": "1.0.8",
97
- "babel-loader": "8.2.5",
97
+ "babel-loader": "9.0.0",
98
98
  "chai": "4.3.6",
99
99
  "cheerio": "1.0.0-rc.12",
100
- "core-js": "3.25.0",
101
- "esbuild": "0.15.6",
102
- "eslint": "8.23.0",
100
+ "core-js": "3.26.0",
101
+ "esbuild": "0.15.12",
102
+ "eslint": "8.26.0",
103
103
  "eslint-plugin-import": "2.26.0",
104
- "eslint-plugin-jsdoc": "39.3.6",
105
- "eslint-plugin-react": "7.31.1",
104
+ "eslint-plugin-jsdoc": "39.4.0",
105
+ "eslint-plugin-react": "7.31.10",
106
106
  "esm": "3.2.25",
107
- "express": "4.18.1",
107
+ "express": "4.18.2",
108
108
  "highlight.js": "11.6.0",
109
109
  "html-entities": "2.3.3",
110
- "jest": "28.1.3",
111
- "jest-environment-jsdom": "28.1.3",
112
- "karma": "6.4.0",
110
+ "jest": "29.2.2",
111
+ "jest-environment-jsdom": "29.2.2",
112
+ "karma": "6.4.1",
113
113
  "karma-chrome-launcher": "3.1.1",
114
114
  "karma-firefox-launcher": "2.1.2",
115
115
  "karma-mocha": "2.0.1",
116
116
  "karma-webpack": "5.0.0",
117
117
  "markdown-it": "13.0.1",
118
- "mocha": "10.0.0",
118
+ "mocha": "10.1.0",
119
119
  "mocha-loader": "5.1.5",
120
120
  "raw-loader": "4.0.2",
121
121
  "react": "18.2.0",
122
122
  "react-dom": "18.2.0",
123
- "regenerator-runtime": "0.13.9",
123
+ "regenerator-runtime": "0.13.10",
124
124
  "rimraf": "3.0.2",
125
- "semver": "7.3.7",
126
- "sinon": "14.0.0",
125
+ "semver": "7.3.8",
126
+ "sinon": "14.0.1",
127
127
  "terser-webpack-plugin": "5.3.6",
128
- "ts-jest": "28.0.8",
129
- "ts-loader": "9.3.1",
128
+ "ts-jest": "29.0.3",
129
+ "ts-loader": "9.4.1",
130
130
  "tslint": "6.1.3",
131
- "typescript": "4.8.2",
131
+ "typescript": "4.8.4",
132
132
  "webpack": "5.74.0",
133
- "webpack-bundle-analyzer": "4.6.1",
133
+ "webpack-bundle-analyzer": "4.7.0",
134
134
  "webpack-cli": "4.10.0"
135
135
  },
136
136
  "scripts-list": {
@@ -1,7 +1,7 @@
1
1
  sonar.projectKey=rx-player
2
2
  sonar.organization=rx-player
3
3
  sonar.projectName=rx-player
4
- sonar.projectVersion=3.29.0-dev.2022091600
4
+ sonar.projectVersion=3.29.0-dev.2022103100
5
5
  sonar.sources=./src,./demo,./tests
6
6
  sonar.exclusions=demo/full/bundle.js,demo/standalone/lib.js,demo/bundle.js
7
7
  sonar.host.url=https://sonarcloud.io
@@ -0,0 +1,54 @@
1
+ /* eslint-disable @typescript-eslint/no-var-requires */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
+
6
+ describe("Compat - canReuseMediaKeys", () => {
7
+ afterEach(() => {
8
+ jest.resetModules();
9
+ });
10
+
11
+ it("should return true on any browser but WebOS 2021 and 2022", () => {
12
+ jest.mock("../browser_detection", () => {
13
+ return { __esModule: true as const,
14
+ isWebOs2021: false,
15
+ isWebOs2022: false };
16
+ });
17
+ const canReuseMediaKeys =
18
+ jest.requireActual("../can_reuse_media_keys.ts");
19
+ expect(canReuseMediaKeys.default()).toBe(true);
20
+ });
21
+
22
+ it("should return false on WebOs 2021", () => {
23
+ jest.mock("../browser_detection", () => {
24
+ return { __esModule: true as const,
25
+ isWebOs2021: true,
26
+ isWebOs2022: false };
27
+ });
28
+ const canReuseMediaKeys =
29
+ jest.requireActual("../can_reuse_media_keys.ts");
30
+ expect(canReuseMediaKeys.default()).toBe(false);
31
+ });
32
+
33
+ it("should return false on WebOs 2022", () => {
34
+ jest.mock("../browser_detection", () => {
35
+ return { __esModule: true as const,
36
+ isWebOs2021: false,
37
+ isWebOs2022: true };
38
+ });
39
+ const canReuseMediaKeys =
40
+ jest.requireActual("../can_reuse_media_keys.ts");
41
+ expect(canReuseMediaKeys.default()).toBe(false);
42
+ });
43
+
44
+ it("should return false in the improbable case of both WebOs 2021 and 2022", () => {
45
+ jest.mock("../browser_detection", () => {
46
+ return { __esModule: true as const,
47
+ isWebOs2021: true,
48
+ isWebOs2022: true };
49
+ });
50
+ const canReuseMediaKeys =
51
+ jest.requireActual("../can_reuse_media_keys.ts");
52
+ expect(canReuseMediaKeys.default()).toBe(false);
53
+ });
54
+ });
@@ -0,0 +1,341 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
+ /* eslint-disable @typescript-eslint/no-var-requires */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
5
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
6
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
7
+ describe("compat - enableAudioTrack", () => {
8
+ beforeEach(() => {
9
+ jest.resetModules();
10
+ });
11
+
12
+ it("should enable the wanted audioTrack", () => {
13
+ jest.mock("../browser_detection", () => {
14
+ return {
15
+ __esModule: true as const,
16
+ isTizen: false,
17
+ };
18
+ });
19
+ const fakeAudioTracks = [
20
+ {
21
+ id: "id1",
22
+ kind: "descriptions",
23
+ label: "Toto",
24
+ language: "swa",
25
+ enabled: true,
26
+ },
27
+ {
28
+ id: "id2",
29
+ kind: "normal",
30
+ label: "Titi",
31
+ language: "fre",
32
+ enabled: false,
33
+ },
34
+ {
35
+ id: "id26",
36
+ kind: "bloop",
37
+ label: "hay",
38
+ language: "hay",
39
+ enabled: false,
40
+ },
41
+ ];
42
+ const enableAudioTrack = jest.requireActual("../enable_audio_track");
43
+ expect(enableAudioTrack.default(fakeAudioTracks, 2)).toEqual(true);
44
+ expect(fakeAudioTracks[0].enabled).toBe(false);
45
+ expect(fakeAudioTracks[1].enabled).toBe(false);
46
+ expect(fakeAudioTracks[2].enabled).toBe(true);
47
+ expect(enableAudioTrack.default(fakeAudioTracks, 1)).toEqual(true);
48
+ expect(fakeAudioTracks[0].enabled).toBe(false);
49
+ expect(fakeAudioTracks[1].enabled).toBe(true);
50
+ expect(fakeAudioTracks[2].enabled).toBe(false);
51
+ expect(enableAudioTrack.default(fakeAudioTracks, 0)).toEqual(true);
52
+ expect(fakeAudioTracks[0].enabled).toBe(true);
53
+ expect(fakeAudioTracks[1].enabled).toBe(false);
54
+ expect(fakeAudioTracks[2].enabled).toBe(false);
55
+ });
56
+
57
+ it("should enable the wanted audioTrack on Tizen", () => {
58
+ jest.mock("../browser_detection", () => {
59
+ return {
60
+ __esModule: true as const,
61
+ isTizen: true,
62
+ };
63
+ });
64
+ const fakeAudioTracks = [
65
+ {
66
+ id: "id1",
67
+ kind: "descriptions",
68
+ label: "Toto",
69
+ language: "swa",
70
+ enabled: true,
71
+ },
72
+ {
73
+ id: "id2",
74
+ kind: "normal",
75
+ label: "Titi",
76
+ language: "fre",
77
+ enabled: false,
78
+ },
79
+ {
80
+ id: "id26",
81
+ kind: "bloop",
82
+ label: "hay",
83
+ language: "hay",
84
+ enabled: false,
85
+ },
86
+ ];
87
+ const enableAudioTrack = jest.requireActual("../enable_audio_track");
88
+ expect(enableAudioTrack.default(fakeAudioTracks, 2)).toEqual(true);
89
+ expect(fakeAudioTracks[0].enabled).toBe(false);
90
+ expect(fakeAudioTracks[1].enabled).toBe(false);
91
+ expect(fakeAudioTracks[2].enabled).toBe(true);
92
+ expect(enableAudioTrack.default(fakeAudioTracks, 1)).toEqual(true);
93
+ expect(fakeAudioTracks[0].enabled).toBe(false);
94
+ expect(fakeAudioTracks[1].enabled).toBe(true);
95
+ expect(fakeAudioTracks[2].enabled).toBe(false);
96
+ expect(enableAudioTrack.default(fakeAudioTracks, 0)).toEqual(true);
97
+ expect(fakeAudioTracks[0].enabled).toBe(true);
98
+ expect(fakeAudioTracks[1].enabled).toBe(false);
99
+ expect(fakeAudioTracks[2].enabled).toBe(false);
100
+ });
101
+
102
+ it("should return false if the audio track index does not exist", () => {
103
+ jest.mock("../browser_detection", () => {
104
+ return {
105
+ __esModule: true as const,
106
+ isTizen: false,
107
+ };
108
+ });
109
+ const fakeAudioTracks = [
110
+ {
111
+ id: "id1",
112
+ kind: "descriptions",
113
+ label: "Toto",
114
+ language: "swa",
115
+ enabled: true,
116
+ },
117
+ {
118
+ id: "id2",
119
+ kind: "normal",
120
+ label: "Titi",
121
+ language: "fre",
122
+ enabled: false,
123
+ },
124
+ {
125
+ id: "id26",
126
+ kind: "bloop",
127
+ label: "hay",
128
+ language: "hay",
129
+ enabled: false,
130
+ },
131
+ ];
132
+ const enableAudioTrack = jest.requireActual("../enable_audio_track");
133
+ expect(enableAudioTrack.default(fakeAudioTracks, -1)).toEqual(false);
134
+ expect(fakeAudioTracks[0].enabled).toBe(false);
135
+ expect(fakeAudioTracks[1].enabled).toBe(false);
136
+ expect(fakeAudioTracks[2].enabled).toBe(false);
137
+ expect(enableAudioTrack.default(fakeAudioTracks, 0)).toEqual(true);
138
+ expect(fakeAudioTracks[0].enabled).toBe(true);
139
+ expect(fakeAudioTracks[1].enabled).toBe(false);
140
+ expect(fakeAudioTracks[2].enabled).toBe(false);
141
+ expect(enableAudioTrack.default(fakeAudioTracks, 4)).toEqual(false);
142
+ expect(fakeAudioTracks[0].enabled).toBe(false);
143
+ expect(fakeAudioTracks[1].enabled).toBe(false);
144
+ expect(fakeAudioTracks[2].enabled).toBe(false);
145
+ });
146
+
147
+ it("should return false if the audio track index does not exist on Tizen", () => {
148
+ jest.mock("../browser_detection", () => {
149
+ return {
150
+ __esModule: true as const,
151
+ isTizen: false,
152
+ };
153
+ });
154
+ let track1IsEnabled = true;
155
+ let track2IsEnabled = false;
156
+ let track3IsEnabled = false;
157
+ let track1WasDisabled = 0;
158
+ let track2WasDisabled = 0;
159
+ let track3WasDisabled = 0;
160
+ let track1WasEnabled = 0;
161
+ let track2WasEnabled = 0;
162
+ let track3WasEnabled = 0;
163
+ const fakeAudioTracks = [
164
+ {
165
+ id: "id1",
166
+ kind: "descriptions",
167
+ label: "Toto",
168
+ language: "swa",
169
+ enabled: true,
170
+ },
171
+ {
172
+ id: "id2",
173
+ kind: "normal",
174
+ label: "Titi",
175
+ language: "fre",
176
+ enabled: false,
177
+ },
178
+ {
179
+ id: "id26",
180
+ kind: "bloop",
181
+ label: "hay",
182
+ language: "hay",
183
+ enabled: false,
184
+ },
185
+ ];
186
+ Object.defineProperty(fakeAudioTracks[0], "enabled", {
187
+ enumerable: true,
188
+ get() : boolean {
189
+ return track1IsEnabled;
190
+ },
191
+ set(enabled : boolean) {
192
+ if (!enabled) {
193
+ track1WasDisabled++;
194
+ } else {
195
+ track1WasEnabled++;
196
+ }
197
+ track1IsEnabled = enabled;
198
+ },
199
+ });
200
+ Object.defineProperty(fakeAudioTracks[1], "enabled", {
201
+ enumerable: true,
202
+ get() : boolean {
203
+ return track2IsEnabled;
204
+ },
205
+ set(enabled : boolean) {
206
+ if (!enabled) {
207
+ track2WasDisabled++;
208
+ } else {
209
+ track2WasEnabled++;
210
+ }
211
+ track2IsEnabled = enabled;
212
+ },
213
+ });
214
+ Object.defineProperty(fakeAudioTracks[2], "enabled", {
215
+ enumerable: true,
216
+ get() : boolean {
217
+ return track3IsEnabled;
218
+ },
219
+ set(enabled : boolean) {
220
+ if (!enabled) {
221
+ track3WasDisabled++;
222
+ } else {
223
+ track3WasEnabled++;
224
+ }
225
+ track3IsEnabled = enabled;
226
+ },
227
+ });
228
+ const enableAudioTrack = jest.requireActual("../enable_audio_track");
229
+ expect(enableAudioTrack.default(fakeAudioTracks, 1)).toBe(true);
230
+ expect(fakeAudioTracks[0].enabled).toBe(false);
231
+ expect(fakeAudioTracks[1].enabled).toBe(true);
232
+ expect(fakeAudioTracks[2].enabled).toBe(false);
233
+ expect(track1IsEnabled).toBe(false);
234
+ expect(track2IsEnabled).toBe(true);
235
+ expect(track3IsEnabled).toBe(false);
236
+ expect(track1WasDisabled).toBe(1);
237
+ expect(track2WasDisabled).toBe(1);
238
+ expect(track3WasDisabled).toBe(1);
239
+ expect(track1WasEnabled).toBe(0);
240
+ expect(track2WasEnabled).toBe(1);
241
+ expect(track3WasEnabled).toBe(0);
242
+ });
243
+
244
+ // eslint-disable-next-line max-len
245
+ it("should first disable all audioTracks except the one wanted by default on Tizen", () => {
246
+ jest.mock("../browser_detection", () => {
247
+ return {
248
+ __esModule: true as const,
249
+ isTizen: true,
250
+ };
251
+ });
252
+ let track1IsEnabled = true;
253
+ let track2IsEnabled = false;
254
+ let track3IsEnabled = false;
255
+ let track1WasDisabled = 0;
256
+ let track2WasDisabled = 0;
257
+ let track3WasDisabled = 0;
258
+ let track1WasEnabled = 0;
259
+ let track2WasEnabled = 0;
260
+ let track3WasEnabled = 0;
261
+ const fakeAudioTracks = [
262
+ {
263
+ id: "id1",
264
+ kind: "descriptions",
265
+ label: "Toto",
266
+ language: "swa",
267
+ enabled: true,
268
+ },
269
+ {
270
+ id: "id2",
271
+ kind: "normal",
272
+ label: "Titi",
273
+ language: "fre",
274
+ enabled: false,
275
+ },
276
+ {
277
+ id: "id26",
278
+ kind: "bloop",
279
+ label: "hay",
280
+ language: "hay",
281
+ enabled: false,
282
+ },
283
+ ];
284
+ Object.defineProperty(fakeAudioTracks[0], "enabled", {
285
+ enumerable: true,
286
+ get() : boolean {
287
+ return track1IsEnabled;
288
+ },
289
+ set(enabled : boolean) {
290
+ if (!enabled) {
291
+ track1WasDisabled++;
292
+ } else {
293
+ track1WasEnabled++;
294
+ }
295
+ track1IsEnabled = enabled;
296
+ },
297
+ });
298
+ Object.defineProperty(fakeAudioTracks[1], "enabled", {
299
+ enumerable: true,
300
+ get() : boolean {
301
+ return track2IsEnabled;
302
+ },
303
+ set(enabled : boolean) {
304
+ if (!enabled) {
305
+ track2WasDisabled++;
306
+ } else {
307
+ track2WasEnabled++;
308
+ }
309
+ track2IsEnabled = enabled;
310
+ },
311
+ });
312
+ Object.defineProperty(fakeAudioTracks[2], "enabled", {
313
+ enumerable: true,
314
+ get() : boolean {
315
+ return track3IsEnabled;
316
+ },
317
+ set(enabled : boolean) {
318
+ if (!enabled) {
319
+ track3WasDisabled++;
320
+ } else {
321
+ track3WasEnabled++;
322
+ }
323
+ track3IsEnabled = enabled;
324
+ },
325
+ });
326
+ const enableAudioTrack = jest.requireActual("../enable_audio_track");
327
+ expect(enableAudioTrack.default(fakeAudioTracks, 1)).toBe(true);
328
+ expect(fakeAudioTracks[0].enabled).toBe(false);
329
+ expect(fakeAudioTracks[1].enabled).toBe(true);
330
+ expect(fakeAudioTracks[2].enabled).toBe(false);
331
+ expect(track1IsEnabled).toBe(false);
332
+ expect(track2IsEnabled).toBe(true);
333
+ expect(track3IsEnabled).toBe(false);
334
+ expect(track1WasDisabled).toBe(1);
335
+ expect(track2WasDisabled).toBe(0);
336
+ expect(track3WasDisabled).toBe(1);
337
+ expect(track1WasEnabled).toBe(0);
338
+ expect(track2WasEnabled).toBe(1);
339
+ expect(track3WasEnabled).toBe(0);
340
+ });
341
+ });
@@ -21,7 +21,7 @@
21
21
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
22
22
  /* eslint-disable @typescript-eslint/no-unsafe-return */
23
23
 
24
- describe("compat - shouldRenewMediaKeys", () => {
24
+ describe("compat - shouldRenewMediaKeySystemAccess", () => {
25
25
  beforeEach(() => {
26
26
  jest.resetModules();
27
27
  });
@@ -33,8 +33,9 @@ describe("compat - shouldRenewMediaKeys", () => {
33
33
  isIE11: false,
34
34
  };
35
35
  });
36
- const shouldRenewMediaKeys = jest.requireActual("../should_renew_media_keys");
37
- expect(shouldRenewMediaKeys.default()).toBe(false);
36
+ const shouldRenewMediaKeySystemAccess =
37
+ jest.requireActual("../should_renew_media_key_system_access");
38
+ expect(shouldRenewMediaKeySystemAccess.default()).toBe(false);
38
39
  });
39
40
 
40
41
  it("should return true if we are on IE11", () => {
@@ -44,8 +45,9 @@ describe("compat - shouldRenewMediaKeys", () => {
44
45
  isIE11: true,
45
46
  };
46
47
  });
47
- const shouldRenewMediaKeys = jest.requireActual("../should_renew_media_keys");
48
- expect(shouldRenewMediaKeys.default()).toBe(true);
48
+ const shouldRenewMediaKeySystemAccess =
49
+ jest.requireActual("../should_renew_media_key_system_access");
50
+ expect(shouldRenewMediaKeySystemAccess.default()).toBe(true);
49
51
  });
50
52
  beforeEach(() => {
51
53
  jest.resetModules();
@@ -50,6 +50,13 @@ const isSamsungBrowser : boolean = !isNode &&
50
50
  const isTizen : boolean = !isNode &&
51
51
  /Tizen/.test(navigator.userAgent);
52
52
 
53
+ const isWebOs : boolean = !isNode &&
54
+ /Web0S/.test(navigator.userAgent);
55
+ const isWebOs2021 : boolean = !isNode &&
56
+ /WebOS.TV-2021/.test(navigator.userAgent);
57
+ const isWebOs2022 : boolean = !isNode &&
58
+ /WebOS.TV-2022/.test(navigator.userAgent);
59
+
53
60
  interface ISafariWindowObject extends Window {
54
61
  safari? : { pushNotification? : { toString() : string } };
55
62
  }
@@ -76,4 +83,7 @@ export {
76
83
  isSafariMobile,
77
84
  isSamsungBrowser,
78
85
  isTizen,
86
+ isWebOs,
87
+ isWebOs2021,
88
+ isWebOs2022,
79
89
  };
@@ -0,0 +1,19 @@
1
+ import {
2
+ isWebOs2021,
3
+ isWebOs2022,
4
+ } from "./browser_detection";
5
+
6
+ /**
7
+ * Returns `true` if a `MediaKeys` instance (the `Encrypted Media Extension`
8
+ * concept) can be reused between contents.
9
+ *
10
+ * This should usually be the case but we found rare devices where this would
11
+ * cause problem:
12
+ * - (2022-10-26): WebOS (LG TVs) 2021 and 2022 just rebuffered indefinitely
13
+ * when loading a content already-loaded on the HTMLMediaElement.
14
+ *
15
+ * @returns {boolean}
16
+ */
17
+ export default function canReuseMediaKeys() : boolean {
18
+ return !(isWebOs2021 || isWebOs2022);
19
+ }
@@ -0,0 +1,33 @@
1
+ import { ICompatAudioTrack } from "./browser_compatibility_types";
2
+ import { isTizen } from "./browser_detection";
3
+
4
+ /**
5
+ * Enable the audio track at the given index while disabling all others in the
6
+ * `audioTracks` array.
7
+ *
8
+ * Returns false if the given index is not found in the `audioTracks` array.
9
+ * @param {array.<audioTrack>} audioTracks
10
+ * @param {number} indexToEnable
11
+ * @returns {boolean}
12
+ */
13
+ export default function enableAudioTrack(
14
+ audioTracks : ICompatAudioTrack[],
15
+ indexToEnable : number
16
+ ) : boolean {
17
+ // Seen on Safari MacOS only (2022-02-14), not disabling ALL audio tracks
18
+ // first (even the wanted one), can lead to the media not playing.
19
+ for (let i = 0; i < audioTracks.length; i++) {
20
+ // However, Tizen just plays no audio if it is disabled then enabled
21
+ // synchronously (2022-10-12)
22
+ if (!isTizen || i !== indexToEnable) {
23
+ audioTracks[i].enabled = false;
24
+ }
25
+ }
26
+
27
+ if (indexToEnable < 0 || indexToEnable >= audioTracks.length) {
28
+ return false;
29
+ }
30
+
31
+ audioTracks[indexToEnable].enabled = true;
32
+ return true;
33
+ }