rx-player 3.28.0-dev.2022071100 → 3.29.0-dev.2022090500

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 (222) hide show
  1. package/.github/workflows/checks.yml +20 -18
  2. package/CHANGELOG.md +24 -2
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/eme/load_session.d.ts +5 -6
  5. package/dist/_esm5.processed/compat/eme/load_session.js +5 -6
  6. package/dist/_esm5.processed/compat/event_listeners.d.ts +18 -2
  7. package/dist/_esm5.processed/compat/event_listeners.js +64 -2
  8. package/dist/_esm5.processed/compat/on_height_width_change.d.ts +5 -4
  9. package/dist/_esm5.processed/compat/on_height_width_change.js +43 -34
  10. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +1 -1
  11. package/dist/_esm5.processed/core/api/playback_observer.d.ts +12 -2
  12. package/dist/_esm5.processed/core/api/playback_observer.js +27 -12
  13. package/dist/_esm5.processed/core/api/public_api.js +14 -14
  14. package/dist/_esm5.processed/core/decrypt/create_session.js +33 -4
  15. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +14 -0
  16. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +25 -0
  17. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +7 -0
  18. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +10 -2
  19. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +9 -2
  20. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +11 -5
  21. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +7 -0
  22. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +110 -38
  23. package/dist/_esm5.processed/core/init/initialize_directfile.js +1 -1
  24. package/dist/_esm5.processed/core/init/load_on_media_source.js +1 -1
  25. package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -2
  26. package/dist/_esm5.processed/core/init/stall_avoider.js +32 -26
  27. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +12 -6
  28. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +142 -78
  29. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -16
  30. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +53 -41
  31. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +6 -5
  32. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +37 -39
  33. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +23 -22
  34. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +84 -72
  35. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +6 -12
  36. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +33 -43
  37. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +12 -9
  38. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +7 -6
  39. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +17 -10
  40. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +20 -9
  41. package/dist/_esm5.processed/core/stream/period/period_stream.js +25 -14
  42. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -7
  43. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +80 -23
  44. package/dist/_esm5.processed/core/stream/representation/check_for_discontinuity.js +21 -9
  45. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +5 -4
  46. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +78 -26
  47. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +28 -32
  48. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +7 -1
  49. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +7 -1
  50. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -8
  51. package/dist/_esm5.processed/default_config.js +1 -1
  52. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -2
  53. package/dist/_esm5.processed/errors/custom_loader_error.js +3 -2
  54. package/dist/_esm5.processed/errors/encrypted_media_error.d.ts +1 -2
  55. package/dist/_esm5.processed/errors/encrypted_media_error.js +0 -1
  56. package/dist/_esm5.processed/errors/error_codes.d.ts +6 -1
  57. package/dist/_esm5.processed/errors/media_error.d.ts +1 -2
  58. package/dist/_esm5.processed/errors/media_error.js +0 -1
  59. package/dist/_esm5.processed/errors/network_error.d.ts +1 -2
  60. package/dist/_esm5.processed/errors/network_error.js +0 -1
  61. package/dist/_esm5.processed/errors/other_error.d.ts +1 -2
  62. package/dist/_esm5.processed/errors/other_error.js +0 -1
  63. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +5 -2
  64. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.js +5 -2
  65. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +9 -2
  66. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +3 -1
  67. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +4 -3
  68. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -1
  69. package/dist/_esm5.processed/manifest/manifest.js +1 -1
  70. package/dist/_esm5.processed/manifest/representation_index/static.d.ts +21 -6
  71. package/dist/_esm5.processed/manifest/representation_index/static.js +26 -8
  72. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +55 -44
  73. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +21 -8
  74. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +25 -10
  75. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +26 -12
  76. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +26 -13
  77. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +23 -7
  78. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +65 -22
  79. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +20 -3
  80. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +57 -7
  81. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/{is_period_fulfilled.d.ts → utils.d.ts} +3 -6
  82. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/{is_period_fulfilled.js → utils.js} +4 -8
  83. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +1 -1
  84. package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +5 -8
  85. package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +21 -8
  86. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +49 -14
  87. package/dist/_esm5.processed/parsers/manifest/local/types.d.ts +16 -0
  88. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +20 -6
  89. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +28 -10
  90. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +4 -4
  91. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +21 -12
  92. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +39 -14
  93. package/dist/_esm5.processed/parsers/manifest/utils/get_first_time_from_adaptation.js +1 -1
  94. package/dist/_esm5.processed/parsers/manifest/utils/get_last_time_from_adaptation.js +1 -1
  95. package/dist/_esm5.processed/public_types.d.ts +22 -3
  96. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -2
  97. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
  98. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -1
  99. package/dist/_esm5.processed/transports/dash/init_segment_loader.d.ts +3 -2
  100. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +12 -6
  101. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.d.ts +3 -2
  102. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +3 -2
  103. package/dist/_esm5.processed/transports/dash/manifest_parser.js +6 -2
  104. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +3 -2
  105. package/dist/_esm5.processed/transports/dash/segment_loader.js +12 -9
  106. package/dist/_esm5.processed/transports/dash/text_loader.js +6 -3
  107. package/dist/_esm5.processed/transports/local/pipelines.d.ts +2 -2
  108. package/dist/_esm5.processed/transports/local/pipelines.js +6 -6
  109. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
  110. package/dist/_esm5.processed/transports/local/segment_loader.js +4 -3
  111. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +2 -2
  112. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +5 -2
  113. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +15 -12
  114. package/dist/_esm5.processed/transports/smooth/pipelines.d.ts +1 -1
  115. package/dist/_esm5.processed/transports/smooth/pipelines.js +18 -14
  116. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +2 -2
  117. package/dist/_esm5.processed/transports/smooth/segment_loader.js +9 -7
  118. package/dist/_esm5.processed/transports/types.d.ts +26 -3
  119. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.d.ts +2 -2
  120. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  121. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +2 -2
  122. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +9 -6
  123. package/dist/_esm5.processed/utils/deep_merge.d.ts +1 -1
  124. package/dist/_esm5.processed/utils/deep_merge.js +6 -5
  125. package/dist/_esm5.processed/utils/request/fetch.js +7 -8
  126. package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
  127. package/dist/_esm5.processed/utils/request/xhr.js +28 -14
  128. package/dist/_esm5.processed/utils/task_canceller.d.ts +1 -5
  129. package/dist/_esm5.processed/utils/task_canceller.js +1 -5
  130. package/dist/mpd-parser.wasm +0 -0
  131. package/dist/rx-player.js +2497 -1752
  132. package/dist/rx-player.min.js +1 -1
  133. package/jest.config.js +5 -0
  134. package/package.json +31 -30
  135. package/sonar-project.properties +1 -1
  136. package/src/compat/eme/load_session.ts +5 -6
  137. package/src/compat/event_listeners.ts +86 -1
  138. package/src/compat/on_height_width_change.ts +48 -49
  139. package/src/core/api/media_element_track_choice_manager.ts +1 -1
  140. package/src/core/api/playback_observer.ts +34 -14
  141. package/src/core/api/public_api.ts +23 -18
  142. package/src/core/decrypt/create_session.ts +28 -2
  143. package/src/core/decrypt/utils/loaded_sessions_store.ts +29 -0
  144. package/src/core/fetchers/manifest/manifest_fetcher.ts +20 -2
  145. package/src/core/fetchers/segment/segment_fetcher.ts +24 -4
  146. package/src/core/fetchers/segment/segment_fetcher_creator.ts +7 -0
  147. package/src/core/init/content_time_boundaries_observer.ts +116 -42
  148. package/src/core/init/initialize_directfile.ts +1 -1
  149. package/src/core/init/load_on_media_source.ts +1 -0
  150. package/src/core/init/stall_avoider.ts +40 -26
  151. package/src/core/segment_buffers/garbage_collector.ts +55 -47
  152. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +92 -70
  153. package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +37 -42
  154. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +103 -105
  155. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +35 -46
  156. package/src/core/segment_buffers/implementations/types.ts +22 -9
  157. package/src/core/segment_buffers/segment_buffers_store.ts +23 -14
  158. package/src/core/stream/orchestrator/stream_orchestrator.ts +31 -12
  159. package/src/core/stream/period/period_stream.ts +31 -18
  160. package/src/core/stream/representation/append_segment_to_buffer.ts +27 -42
  161. package/src/core/stream/representation/check_for_discontinuity.ts +28 -10
  162. package/src/core/stream/representation/force_garbage_collection.ts +28 -32
  163. package/src/core/stream/representation/get_buffer_status.ts +34 -37
  164. package/src/core/stream/representation/push_init_segment.ts +12 -6
  165. package/src/core/stream/representation/push_media_segment.ts +12 -6
  166. package/src/core/stream/representation/representation_stream.ts +11 -5
  167. package/src/default_config.ts +17 -17
  168. package/src/errors/custom_loader_error.ts +3 -2
  169. package/src/errors/encrypted_media_error.ts +1 -2
  170. package/src/errors/error_codes.ts +2 -2
  171. package/src/errors/media_error.ts +1 -2
  172. package/src/errors/network_error.ts +1 -2
  173. package/src/errors/other_error.ts +1 -2
  174. package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +7 -2
  175. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +6 -2
  176. package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +10 -2
  177. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +3 -1
  178. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +4 -3
  179. package/src/manifest/__tests__/adaptation.test.ts +4 -3
  180. package/src/manifest/__tests__/representation.test.ts +4 -3
  181. package/src/manifest/manifest.ts +1 -1
  182. package/src/manifest/representation_index/__tests__/static.test.ts +5 -4
  183. package/src/manifest/representation_index/static.ts +28 -9
  184. package/src/manifest/representation_index/types.ts +62 -46
  185. package/src/parsers/manifest/dash/common/indexes/base.ts +27 -11
  186. package/src/parsers/manifest/dash/common/indexes/list.ts +32 -15
  187. package/src/parsers/manifest/dash/common/indexes/template.ts +73 -27
  188. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +60 -8
  189. package/src/parsers/manifest/dash/common/indexes/{is_period_fulfilled.ts → utils.ts} +4 -13
  190. package/src/parsers/manifest/dash/common/parse_periods.ts +1 -1
  191. package/src/parsers/manifest/local/parse_local_manifest.ts +8 -20
  192. package/src/parsers/manifest/local/representation_index.ts +51 -16
  193. package/src/parsers/manifest/local/types.ts +13 -0
  194. package/src/parsers/manifest/metaplaylist/representation_index.ts +31 -11
  195. package/src/parsers/manifest/smooth/create_parser.ts +4 -4
  196. package/src/parsers/manifest/smooth/representation_index.ts +40 -15
  197. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +4 -3
  198. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +4 -3
  199. package/src/parsers/manifest/utils/get_first_time_from_adaptation.ts +1 -1
  200. package/src/parsers/manifest/utils/get_last_time_from_adaptation.ts +1 -1
  201. package/src/public_types.ts +28 -4
  202. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  203. package/src/transports/dash/image_pipelines.ts +4 -0
  204. package/src/transports/dash/init_segment_loader.ts +8 -0
  205. package/src/transports/dash/low_latency_segment_loader.ts +4 -0
  206. package/src/transports/dash/manifest_parser.ts +4 -0
  207. package/src/transports/dash/segment_loader.ts +21 -5
  208. package/src/transports/dash/text_loader.ts +7 -2
  209. package/src/transports/local/pipelines.ts +7 -5
  210. package/src/transports/local/segment_loader.ts +4 -2
  211. package/src/transports/metaplaylist/manifest_loader.ts +9 -2
  212. package/src/transports/metaplaylist/pipelines.ts +16 -8
  213. package/src/transports/smooth/pipelines.ts +17 -9
  214. package/src/transports/smooth/segment_loader.ts +9 -1
  215. package/src/transports/types.ts +28 -1
  216. package/src/transports/utils/call_custom_manifest_loader.ts +8 -2
  217. package/src/transports/utils/generate_manifest_loader.ts +18 -5
  218. package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -0
  219. package/src/utils/deep_merge.ts +7 -4
  220. package/src/utils/request/fetch.ts +7 -8
  221. package/src/utils/request/xhr.ts +31 -15
  222. package/src/utils/task_canceller.ts +1 -5
@@ -54,27 +54,29 @@ jobs:
54
54
  - run: node tests/integration/run.js --bchromehl
55
55
  - run: npm run test:memory
56
56
 
57
- integration_windows:
57
+ # Windows seems to be a lot less stable for some reason.
58
+ # TODO debug?
59
+ # integration_windows:
58
60
 
59
- runs-on: windows-latest
61
+ # runs-on: windows-latest
60
62
 
61
- strategy:
62
- matrix:
63
- node-version: [16.x]
64
- # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
63
+ # strategy:
64
+ # matrix:
65
+ # node-version: [16.x]
66
+ # # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
65
67
 
66
- steps:
67
- - uses: actions/checkout@v2
68
- - name: Use Node.js ${{ matrix.node-version }}
69
- uses: actions/setup-node@v2
70
- with:
71
- node-version: ${{ matrix.node-version }}
72
- cache: 'npm'
73
- - run: npm install
74
- # Firefox seems to have issue with integration tests on GitHub actions only
75
- # TODO to check
76
- - run: node tests/integration/run.js --bchromehl
77
- - run: npm run test:memory
68
+ # steps:
69
+ # - uses: actions/checkout@v2
70
+ # - name: Use Node.js ${{ matrix.node-version }}
71
+ # uses: actions/setup-node@v2
72
+ # with:
73
+ # node-version: ${{ matrix.node-version }}
74
+ # cache: 'npm'
75
+ # - run: npm install
76
+ # # Firefox seems to have issue with integration tests on GitHub actions only
77
+ # # TODO to check
78
+ # - run: node tests/integration/run.js --bchromehl
79
+ # - run: npm run test:memory
78
80
 
79
81
  # MacOS seems to be a lot less stable for some reason.
80
82
  # TODO debug?
package/CHANGELOG.md CHANGED
@@ -1,6 +1,26 @@
1
1
  # Changelog
2
2
 
3
- ## v3.28.0-dev.2022071100 (2022-07-11)
3
+ ## v3.29.0-dev.2022090500 (2022-09-05)
4
+
5
+ ### Features
6
+
7
+ - add `networkConfig.segmentRequestTimeout` and `networkConfig.manifestRequestTimeout` options to loadVideo to configure the timeout of respectively segment and manifest requests [#1156]
8
+ - add `timeout` property to the first argument communicated to a `segmentLoader` (from `loadVideo`'s `transportOptions`) [#1156]
9
+ - add `timeout` property to a new third argument communicated to a `manifestLoader` (from `loadVideo`'s `transportOptions`) [#1156]
10
+
11
+ ### Bug fixes
12
+
13
+ - Compat/Directfile: Fix an issue with LG TV when playing multiple directfile contents with the `stopAtEnd` player option set to `true` [#1154]
14
+ - Compat: To work around an issue on LG TVs, also specify a request timeout manually through a `setTimeout` call when XMLHttpRequests are created for Manifest and segment requests [#1152]
15
+ - Compat: Fix issue with Samsung TVs where starting playback on a discontinuity could lead to infinite rebuffering [#1140]
16
+ - Better handle valid reverse playback use cases by not skipping gaps when the playback rate has been set to `0` or a negative value [#1138]
17
+ - DRM: When using persistent licenses, create new MediaKeySession when `load` resolves with `false`, instead of relying the same, to fix issues with such persistent sessions [#1139]
18
+
19
+ ### Other improvements
20
+
21
+ - In the experimental "local" transport, add `incomingRanges` property to signal the time ranges of remaining data, allowing better discontinuity handling and duration estimates for sill-loading dowloaded contents [#1151]
22
+
23
+ ## v3.28.0 (2022-07-12)
4
24
 
5
25
  ### Features
6
26
 
@@ -10,13 +30,14 @@
10
30
  ### Bug fixes
11
31
 
12
32
  - Use the first **compatible** codec of the current AdaptationSet when creating a SourceBuffer [#1094]
13
- - DASH/DRM: Fix potential infinite rebuffering when a KID is not anounced in the MPD [#1113]
33
+ - DASH/DRM: Fix potential infinite rebuffering when a KID is not announced in the MPD [#1113]
14
34
  - DRM: Fix quality fallback when loading a content whose license has been cached under an extended `singleLicensePer` setting and when starting (and staying) with a quality whose key id is not in it [#1133]
15
35
  - DASH: Avoid infinite loop due to rounding errors while parsing multi-Periods MPDs [#1111, #1110]
16
36
  - After a `RELOADING` state, stay in `PAUSED` if the media element was paused synchronously before the side-effect which triggered the reloading (usually coming from the API) was perform [#1132]
17
37
  - Fix issue with `maxVideoBufferSize` setting which could lead to too much data being buffered [#1125]
18
38
  - Prevent possibility of requests loops and infinite rebuffering when a pushed segment is always completely and immediately garbage collected by the browser [#1123]
19
39
  - DASH: Fix potential rare memory leak when stopping the content after it has reloaded at least once [#1135]
40
+ - Directfile: Properly announce the audio track's `audioDescription` accessibility attribute in directfile mode on Safari [#1136]
20
41
  - DASH: Fix issues that could arise if a segment is calculated to start at a negative position [#1122]
21
42
  - DASH: Fix possibility of wrong segments being requested when a SegmentTimeline in a given Period (whose Period@end is set) had an S@r set to `-1` at its end [#1098]
22
43
  - DASH: If the first `<S>` has its S@t attribute not set, make as if it is set to `0` [#1118]
@@ -24,6 +45,7 @@
24
45
  ### Other improvements
25
46
 
26
47
  - TTML: Add support for percent based thickness for textOutline in TTML Subtitles [#1108]
48
+ - Improve TypeScript's language servers auto import feature with the RxPlayer by better redirecting to the exported type [#1126]
27
49
  - If seeking after the last potential position, load last segments before ending [#1097]
28
50
  - The duration set on the media element is now only relative to the current chosen tracks (it was previously relative to all potential track). This allows to seek later when switching e.g. to a longer video track [#1102]
29
51
  - Errors coming from an HTMLMediaElement now have the browser's error message if it exists [#1112]
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.28.0-dev.2022071100
1
+ 3.29.0-dev.2022090500
@@ -18,14 +18,13 @@ import { ICustomMediaKeySession } from "./custom_media_keys";
18
18
  * Load a persistent session, based on its `sessionId`, on the given
19
19
  * MediaKeySession.
20
20
  *
21
- * Returns an Observable which emits:
22
- * - true if the persistent MediaKeySession was found and loaded
23
- * - false if no persistent MediaKeySession was found with that `sessionId`.
24
- * Then completes.
21
+ * Returns a Promise which resolves with:
22
+ * - `true` if the persistent MediaKeySession was found and loaded
23
+ * - `false` if no persistent MediaKeySession was found with that `sessionId`.
25
24
  *
26
- * The Observable throws if anything goes wrong in the process.
25
+ * The Promise rejects if anything goes wrong in the process.
27
26
  * @param {MediaKeySession} session
28
27
  * @param {string} sessionId
29
- * @returns {Observable}
28
+ * @returns {Promise.<boolean>}
30
29
  */
31
30
  export default function loadSession(session: MediaKeySession | ICustomMediaKeySession, sessionId: string): Promise<boolean>;
@@ -55,15 +55,14 @@ var EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
55
55
  * Load a persistent session, based on its `sessionId`, on the given
56
56
  * MediaKeySession.
57
57
  *
58
- * Returns an Observable which emits:
59
- * - true if the persistent MediaKeySession was found and loaded
60
- * - false if no persistent MediaKeySession was found with that `sessionId`.
61
- * Then completes.
58
+ * Returns a Promise which resolves with:
59
+ * - `true` if the persistent MediaKeySession was found and loaded
60
+ * - `false` if no persistent MediaKeySession was found with that `sessionId`.
62
61
  *
63
- * The Observable throws if anything goes wrong in the process.
62
+ * The Promise rejects if anything goes wrong in the process.
64
63
  * @param {MediaKeySession} session
65
64
  * @param {string} sessionId
66
- * @returns {Observable}
65
+ * @returns {Promise.<boolean>}
67
66
  */
68
67
  export default function loadSession(session, sessionId) {
69
68
  return __awaiter(this, void 0, void 0, function () {
@@ -42,7 +42,8 @@ export interface IPictureInPictureEvent {
42
42
  }
43
43
  /**
44
44
  * Emit when video enters and leaves Picture-In-Picture mode.
45
- * @param {HTMLMediaElement} mediaElement
45
+ * @param {HTMLMediaElement} elt
46
+ * @param {Object} stopListening
46
47
  * @returns {Observable}
47
48
  */
48
49
  declare function getPictureOnPictureStateRef(elt: HTMLMediaElement, stopListening: CancellationSignal): IReadOnlySharedReference<IPictureInPictureEvent>;
@@ -151,6 +152,21 @@ declare const onKeyError$: (element: IEventTargetLike) => Observable<Event>;
151
152
  * @returns {Observable}
152
153
  */
153
154
  declare const onKeyStatusesChange$: (element: IEventTargetLike) => Observable<Event>;
155
+ /**
156
+ * @param {HTMLMediaElement} mediaElement
157
+ * @returns {Observable}
158
+ */
159
+ declare const onSeeking: (element: IEventTargetLike, listener: (event?: unknown) => void, cancelSignal: CancellationSignal) => void;
160
+ /**
161
+ * @param {HTMLMediaElement} mediaElement
162
+ * @returns {Observable}
163
+ */
164
+ declare const onSeeked: (element: IEventTargetLike, listener: (event?: unknown) => void, cancelSignal: CancellationSignal) => void;
165
+ /**
166
+ * @param {HTMLMediaElement} mediaElement
167
+ * @returns {Observable}
168
+ */
169
+ declare const onEnded: (element: IEventTargetLike, listener: (event?: unknown) => void, cancelSignal: CancellationSignal) => void;
154
170
  /**
155
171
  * Utilitary function allowing to add an event listener and remove it
156
172
  * automatically once the given `CancellationSignal` emits.
@@ -162,4 +178,4 @@ declare const onKeyStatusesChange$: (element: IEventTargetLike) => Observable<Ev
162
178
  * emits
163
179
  */
164
180
  declare function addEventListener(elt: IEventEmitterLike, evt: string, listener: (x?: unknown) => void, stopListening: CancellationSignal): void;
165
- export { addEventListener, getPageActivityRef, getPictureOnPictureStateRef, getVideoVisibilityRef, getVideoWidthRef, onEncrypted$, onEnded$, onFullscreenChange$, onKeyAdded$, onKeyError$, onKeyMessage$, onKeyStatusesChange$, onLoadedMetadata$, onRemoveSourceBuffers$, onSeeked$, onSeeking$, onSourceClose$, onSourceEnded$, onSourceOpen$, onTextTrackChanges$, onTimeUpdate$, onUpdate$, };
181
+ export { addEventListener, getPageActivityRef, getPictureOnPictureStateRef, getVideoVisibilityRef, getVideoWidthRef, onEncrypted$, onEnded, onEnded$, onFullscreenChange$, onKeyAdded$, onKeyError$, onKeyMessage$, onKeyStatusesChange$, onLoadedMetadata$, onRemoveSourceBuffers$, onSeeked, onSeeked$, onSeeking, onSeeking$, onSourceClose$, onSourceEnded$, onSourceOpen$, onTextTrackChanges$, onTimeUpdate$, onUpdate$, };
@@ -70,6 +70,52 @@ function eventPrefixed(eventNames, prefixes) {
70
70
  .map(function (p) { return p + name; }));
71
71
  }, []);
72
72
  }
73
+ /**
74
+ * Returns a function allowing to add event listeners for particular event(s)
75
+ * optionally automatically adding browser prefixes if needed.
76
+ * @param {Array.<string>} eventNames - The event(s) to listen to. If multiple
77
+ * events are set, the event listener will be triggered when any of them emits.
78
+ * @returns {Function} - Returns function allowing to easily add a callback to
79
+ * be triggered when that event is emitted on a given event target.
80
+ */
81
+ function createCompatibleEventListener(eventNames) {
82
+ var mem;
83
+ var prefixedEvents = eventPrefixed(eventNames);
84
+ return function (element, listener, cancelSignal) {
85
+ if (cancelSignal.isCancelled) {
86
+ return;
87
+ }
88
+ // if the element is a HTMLElement we can detect
89
+ // the supported event, and memoize it in `mem`
90
+ if (element instanceof HTMLElement) {
91
+ if (typeof mem === "undefined") {
92
+ mem = findSupportedEvent(element, prefixedEvents);
93
+ }
94
+ if (isNonEmptyString(mem)) {
95
+ element.addEventListener(mem, listener);
96
+ cancelSignal.register(function () {
97
+ if (mem !== undefined) {
98
+ element.removeEventListener(mem, listener);
99
+ }
100
+ });
101
+ }
102
+ else {
103
+ if (0 /* __ENVIRONMENT__.CURRENT_ENV */ === 1 /* __ENVIRONMENT__.DEV */) {
104
+ log.warn("compat: element ".concat(element.tagName) +
105
+ " does not support any of these events: " +
106
+ prefixedEvents.join(", "));
107
+ }
108
+ return;
109
+ }
110
+ }
111
+ prefixedEvents.forEach(function (eventName) {
112
+ element.addEventListener(eventName, listener);
113
+ cancelSignal.register(function () {
114
+ element.removeEventListener(eventName, listener);
115
+ });
116
+ });
117
+ };
118
+ }
73
119
  /**
74
120
  * @param {Array.<string>} eventNames
75
121
  * @param {Array.<string>|undefined} prefixes
@@ -186,7 +232,8 @@ function getVideoWidthFromPIPWindow(mediaElement, pipWindow) {
186
232
  }
187
233
  /**
188
234
  * Emit when video enters and leaves Picture-In-Picture mode.
189
- * @param {HTMLMediaElement} mediaElement
235
+ * @param {HTMLMediaElement} elt
236
+ * @param {Object} stopListening
190
237
  * @returns {Observable}
191
238
  */
192
239
  function getPictureOnPictureStateRef(elt, stopListening) {
@@ -397,6 +444,21 @@ var onKeyError$ = compatibleListener(["keyerror", "error"]);
397
444
  * @returns {Observable}
398
445
  */
399
446
  var onKeyStatusesChange$ = compatibleListener(["keystatuseschange"]);
447
+ /**
448
+ * @param {HTMLMediaElement} mediaElement
449
+ * @returns {Observable}
450
+ */
451
+ var onSeeking = createCompatibleEventListener(["seeking"]);
452
+ /**
453
+ * @param {HTMLMediaElement} mediaElement
454
+ * @returns {Observable}
455
+ */
456
+ var onSeeked = createCompatibleEventListener(["seeked"]);
457
+ /**
458
+ * @param {HTMLMediaElement} mediaElement
459
+ * @returns {Observable}
460
+ */
461
+ var onEnded = createCompatibleEventListener(["ended"]);
400
462
  /**
401
463
  * Utilitary function allowing to add an event listener and remove it
402
464
  * automatically once the given `CancellationSignal` emits.
@@ -413,4 +475,4 @@ function addEventListener(elt, evt, listener, stopListening) {
413
475
  elt.removeEventListener(evt, listener);
414
476
  });
415
477
  }
416
- export { addEventListener, getPageActivityRef, getPictureOnPictureStateRef, getVideoVisibilityRef, getVideoWidthRef, onEncrypted$, onEnded$, onFullscreenChange$, onKeyAdded$, onKeyError$, onKeyMessage$, onKeyStatusesChange$, onLoadedMetadata$, onRemoveSourceBuffers$, onSeeked$, onSeeking$, onSourceClose$, onSourceEnded$, onSourceOpen$, onTextTrackChanges$, onTimeUpdate$, onUpdate$, };
478
+ export { addEventListener, getPageActivityRef, getPictureOnPictureStateRef, getVideoVisibilityRef, getVideoWidthRef, onEncrypted$, onEnded, onEnded$, onFullscreenChange$, onKeyAdded$, onKeyError$, onKeyMessage$, onKeyStatusesChange$, onLoadedMetadata$, onRemoveSourceBuffers$, onSeeked, onSeeked$, onSeeking, onSeeking$, onSourceClose$, onSourceEnded$, onSourceOpen$, onTextTrackChanges$, onTimeUpdate$, onUpdate$, };
@@ -13,14 +13,15 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Observable } from "rxjs";
16
+ import { IReadOnlySharedReference } from "../utils/reference";
17
+ import { CancellationSignal } from "../utils/task_canceller";
17
18
  export interface IResolution {
18
19
  width: number;
19
20
  height: number;
20
21
  }
21
22
  /**
22
- * Emit the current height and width of the given `element` on subscribtion
23
- * and each time it changes.
23
+ * Emit the current height and width of the given `element` each time it
24
+ * changes.
24
25
  *
25
26
  * On some browsers, we might not be able to rely on a native API to know when
26
27
  * it changes, the `interval` argument allow us to provide us an inverval in
@@ -29,4 +30,4 @@ export interface IResolution {
29
30
  * @param {number} interval
30
31
  * @returns {Observable}
31
32
  */
32
- export default function onHeightWidthChange(element: HTMLElement, interval: number): Observable<IResolution>;
33
+ export default function onHeightWidthChange(element: HTMLElement, interval: number, cancellationSignal: CancellationSignal): IReadOnlySharedReference<IResolution>;
@@ -13,8 +13,8 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { defer as observableDefer, distinctUntilChanged, interval as observableInterval, map, Observable, startWith, } from "rxjs";
17
16
  import log from "../log";
17
+ import createSharedReference from "../utils/reference";
18
18
  import isNode from "./is_node";
19
19
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
20
20
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
@@ -23,8 +23,8 @@ var _ResizeObserver = isNode ? undefined :
23
23
  /* eslint-enable @typescript-eslint/no-unsafe-member-access */
24
24
  /* eslint-enable @typescript-eslint/no-unsafe-assignment */
25
25
  /**
26
- * Emit the current height and width of the given `element` on subscribtion
27
- * and each time it changes.
26
+ * Emit the current height and width of the given `element` each time it
27
+ * changes.
28
28
  *
29
29
  * On some browsers, we might not be able to rely on a native API to know when
30
30
  * it changes, the `interval` argument allow us to provide us an inverval in
@@ -33,36 +33,45 @@ var _ResizeObserver = isNode ? undefined :
33
33
  * @param {number} interval
34
34
  * @returns {Observable}
35
35
  */
36
- export default function onHeightWidthChange(element, interval) {
37
- return observableDefer(function () {
38
- if (_ResizeObserver !== undefined) {
39
- var lastHeight_1 = -1;
40
- var lastWidth_1 = -1;
41
- return new Observable(function (obs) {
42
- var resizeObserver = new _ResizeObserver(function (entries) {
43
- if (entries.length === 0) {
44
- log.error("Compat: Resized but no observed element.");
45
- return;
46
- }
47
- var entry = entries[0];
48
- var _a = entry.contentRect, height = _a.height, width = _a.width;
49
- if (height !== lastHeight_1 || width !== lastWidth_1) {
50
- lastHeight_1 = height;
51
- lastWidth_1 = width;
52
- obs.next({ height: height, width: width });
53
- }
54
- });
55
- resizeObserver.observe(element);
56
- return function () {
57
- resizeObserver.disconnect();
58
- };
59
- });
60
- }
61
- return observableInterval(interval).pipe(startWith(null), map(function () {
62
- var _a = element.getBoundingClientRect(), height = _a.height, width = _a.width;
63
- return { height: height, width: width };
64
- }), distinctUntilChanged(function (o, n) {
65
- return o.height === n.height && o.width === n.width;
66
- }));
36
+ export default function onHeightWidthChange(element, interval, cancellationSignal) {
37
+ var _a = element.getBoundingClientRect(), initHeight = _a.height, initWidth = _a.width;
38
+ var ref = createSharedReference({
39
+ height: initHeight,
40
+ width: initWidth,
67
41
  });
42
+ var lastHeight = initHeight;
43
+ var lastWidth = initWidth;
44
+ if (_ResizeObserver !== undefined) {
45
+ var resizeObserver_1 = new _ResizeObserver(function (entries) {
46
+ if (entries.length === 0) {
47
+ log.error("Compat: Resized but no observed element.");
48
+ return;
49
+ }
50
+ var entry = entries[0];
51
+ var _a = entry.contentRect, height = _a.height, width = _a.width;
52
+ if (height !== lastHeight || width !== lastWidth) {
53
+ lastHeight = height;
54
+ lastWidth = width;
55
+ ref.setValue({ height: height, width: width });
56
+ }
57
+ });
58
+ resizeObserver_1.observe(element);
59
+ cancellationSignal.register(function () {
60
+ resizeObserver_1.disconnect();
61
+ });
62
+ }
63
+ else {
64
+ var intervalId_1 = setInterval(function () {
65
+ var _a = element.getBoundingClientRect(), height = _a.height, width = _a.width;
66
+ if (height !== lastHeight || width !== lastWidth) {
67
+ lastHeight = height;
68
+ lastWidth = width;
69
+ ref.setValue({ height: height, width: width });
70
+ }
71
+ }, interval);
72
+ cancellationSignal.register(function () {
73
+ clearInterval(intervalId_1);
74
+ });
75
+ }
76
+ return ref;
68
77
  }
@@ -69,7 +69,7 @@ function createAudioTracks(audioTracks) {
69
69
  occurences.toString();
70
70
  languagesOccurences[language] = occurences + 1;
71
71
  var track = { language: audioTrack.language, id: id, normalized: normalizeLanguage(audioTrack.language),
72
- audioDescription: false,
72
+ audioDescription: audioTrack.kind === "descriptions",
73
73
  representations: [] };
74
74
  newAudioTracks.push({ track: track, nativeTrack: audioTrack });
75
75
  }
@@ -54,7 +54,7 @@ export default class PlaybackObserver {
54
54
  * This allows us to correctly characterize seeking events: if the counter is
55
55
  * superior to `0`, it is probably due to an internal "seek".
56
56
  */
57
- private _internalSeekingEventsIncomingCounter;
57
+ private _internalSeeksIncoming;
58
58
  /**
59
59
  * Stores the last playback observation produced by the `PlaybackObserver`.:
60
60
  */
@@ -92,6 +92,11 @@ export default class PlaybackObserver {
92
92
  * @returns {number}
93
93
  */
94
94
  getCurrentTime(): number;
95
+ /**
96
+ * Returns the current playback rate advertised by the `HTMLMediaElement`.
97
+ * @returns {number}
98
+ */
99
+ getPlaybackRate(): number;
95
100
  /**
96
101
  * Returns the current `paused` status advertised by the `HTMLMediaElement`.
97
102
  *
@@ -272,7 +277,7 @@ export interface IPlaybackObservation extends IMediaInfos {
272
277
  * If `true`, an "internal seek" (a seeking operation triggered by the
273
278
  * RxPlayer code) is currently pending.
274
279
  */
275
- internalSeeking: boolean;
280
+ pendingInternalSeek: number | null;
276
281
  }
277
282
  /**
278
283
  * Interface providing a generic and read-only version of a `PlaybackObserver`.
@@ -289,6 +294,11 @@ export interface IPlaybackObservation extends IMediaInfos {
289
294
  export interface IReadOnlyPlaybackObserver<TObservationType> {
290
295
  /** Get the current playing position, in seconds. */
291
296
  getCurrentTime(): number;
297
+ /**
298
+ * Returns the current playback rate advertised by the `HTMLMediaElement`.
299
+ * @returns {number}
300
+ */
301
+ getPlaybackRate(): number;
292
302
  /** Get the HTMLMediaElement's current `readyState`. */
293
303
  getReadyState(): number;
294
304
  /**
@@ -58,7 +58,7 @@ var PlaybackObserver = /** @class */ (function () {
58
58
  * @param {Object} options
59
59
  */
60
60
  function PlaybackObserver(mediaElement, options) {
61
- this._internalSeekingEventsIncomingCounter = 0;
61
+ this._internalSeeksIncoming = [];
62
62
  this._mediaElement = mediaElement;
63
63
  this._withMediaSource = options.withMediaSource;
64
64
  this._lowLatencyMode = options.lowLatencyMode;
@@ -86,6 +86,13 @@ var PlaybackObserver = /** @class */ (function () {
86
86
  PlaybackObserver.prototype.getCurrentTime = function () {
87
87
  return this._mediaElement.currentTime;
88
88
  };
89
+ /**
90
+ * Returns the current playback rate advertised by the `HTMLMediaElement`.
91
+ * @returns {number}
92
+ */
93
+ PlaybackObserver.prototype.getPlaybackRate = function () {
94
+ return this._mediaElement.playbackRate;
95
+ };
89
96
  /**
90
97
  * Returns the current `paused` status advertised by the `HTMLMediaElement`.
91
98
  *
@@ -107,7 +114,7 @@ var PlaybackObserver = /** @class */ (function () {
107
114
  * @param {number} time
108
115
  */
109
116
  PlaybackObserver.prototype.setCurrentTime = function (time) {
110
- this._internalSeekingEventsIncomingCounter += 1;
117
+ this._internalSeeksIncoming.push(time);
111
118
  this._mediaElement.currentTime = time;
112
119
  };
113
120
  /**
@@ -180,24 +187,29 @@ var PlaybackObserver = /** @class */ (function () {
180
187
  var _a = config.getCurrent(), SAMPLING_INTERVAL_MEDIASOURCE = _a.SAMPLING_INTERVAL_MEDIASOURCE, SAMPLING_INTERVAL_LOW_LATENCY = _a.SAMPLING_INTERVAL_LOW_LATENCY, SAMPLING_INTERVAL_NO_MEDIASOURCE = _a.SAMPLING_INTERVAL_NO_MEDIASOURCE;
181
188
  var getCurrentObservation = function (event) {
182
189
  var tmpEvt = event;
183
- if (tmpEvt === "seeking" && _this._internalSeekingEventsIncomingCounter > 0) {
190
+ var startedInternalSeekTime;
191
+ if (tmpEvt === "seeking" && _this._internalSeeksIncoming.length > 0) {
184
192
  tmpEvt = "internal-seeking";
185
- _this._internalSeekingEventsIncomingCounter -= 1;
193
+ startedInternalSeekTime = _this._internalSeeksIncoming.shift();
186
194
  }
187
195
  var _lastObservation = lastObservation !== null && lastObservation !== void 0 ? lastObservation : _this._generateInitialObservation();
188
196
  var mediaTimings = getMediaInfos(_this._mediaElement, tmpEvt);
189
- var internalSeeking = mediaTimings.seeking &&
190
- // We've just received the event for internally seeking
191
- (tmpEvt === "internal-seeking" ||
192
- // or We're still waiting on the previous internal-seek
193
- (_lastObservation.internalSeeking && tmpEvt !== "seeking"));
197
+ var pendingInternalSeek = null;
198
+ if (mediaTimings.seeking) {
199
+ if (typeof startedInternalSeekTime === "number") {
200
+ pendingInternalSeek = startedInternalSeekTime;
201
+ }
202
+ else if (_lastObservation.pendingInternalSeek !== null && event !== "seeking") {
203
+ pendingInternalSeek = _lastObservation.pendingInternalSeek;
204
+ }
205
+ }
194
206
  var rebufferingStatus = getRebufferingStatus(_lastObservation, mediaTimings, { lowLatencyMode: _this._lowLatencyMode,
195
207
  withMediaSource: _this._withMediaSource });
196
208
  var freezingStatus = getFreezingStatus(_lastObservation, mediaTimings);
197
209
  var timings = objectAssign({}, { rebuffering: rebufferingStatus,
198
- freezing: freezingStatus, internalSeeking: internalSeeking }, mediaTimings);
210
+ freezing: freezingStatus, pendingInternalSeek: pendingInternalSeek }, mediaTimings);
199
211
  if (log.hasLevel("DEBUG")) {
200
- log.debug("API: current media element state tick", "event", timings.event, "position", timings.position, "seeking", timings.seeking, "internalSeeking", timings.internalSeeking, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
212
+ log.debug("API: current media element state tick", "event", timings.event, "position", timings.position, "seeking", timings.seeking, "internalSeek", timings.pendingInternalSeek, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
201
213
  }
202
214
  return timings;
203
215
  };
@@ -242,7 +254,7 @@ var PlaybackObserver = /** @class */ (function () {
242
254
  PlaybackObserver.prototype._generateInitialObservation = function () {
243
255
  return objectAssign(getMediaInfos(this._mediaElement, "init"), { rebuffering: null,
244
256
  freezing: null,
245
- internalSeeking: false });
257
+ pendingInternalSeek: null });
246
258
  };
247
259
  return PlaybackObserver;
248
260
  }());
@@ -504,6 +516,9 @@ function generateReadOnlyObserver(src, transform, cancellationSignal) {
504
516
  getReadyState: function () {
505
517
  return src.getReadyState();
506
518
  },
519
+ getPlaybackRate: function () {
520
+ return src.getPlaybackRate();
521
+ },
507
522
  getIsPaused: function () {
508
523
  return src.getIsPaused();
509
524
  },
@@ -88,7 +88,7 @@ var Player = /** @class */ (function (_super) {
88
88
  // Workaround to support Firefox autoplay on FF 42.
89
89
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
90
90
  videoElement.preload = "auto";
91
- _this.version = /* PLAYER_VERSION */ "3.28.0-dev.2022071100";
91
+ _this.version = /* PLAYER_VERSION */ "3.29.0-dev.2022090500";
92
92
  _this.log = log;
93
93
  _this.state = "STOPPED";
94
94
  _this.videoElement = videoElement;
@@ -373,13 +373,15 @@ var Player = /** @class */ (function (_super) {
373
373
  throw new Error("transport \"".concat(transport, "\" not supported"));
374
374
  }
375
375
  var transportPipelines = transportFn(transportOptions);
376
- var offlineRetry = networkConfig.offlineRetry, segmentRetry = networkConfig.segmentRetry, manifestRetry = networkConfig.manifestRetry;
376
+ var offlineRetry = networkConfig.offlineRetry, segmentRetry = networkConfig.segmentRetry, manifestRetry = networkConfig.manifestRetry, manifestRequestTimeout = networkConfig.manifestRequestTimeout, segmentRequestTimeout = networkConfig.segmentRequestTimeout;
377
377
  /** Interface used to load and refresh the Manifest. */
378
378
  var manifestFetcher = new ManifestFetcher(url, transportPipelines, { lowLatencyMode: lowLatencyMode, maxRetryRegular: manifestRetry,
379
- maxRetryOffline: offlineRetry });
379
+ maxRetryOffline: offlineRetry,
380
+ requestTimeout: manifestRequestTimeout });
380
381
  /** Interface used to download segments. */
381
382
  var segmentFetcherCreator = new SegmentFetcherCreator(transportPipelines, { lowLatencyMode: lowLatencyMode, maxRetryOffline: offlineRetry,
382
- maxRetryRegular: segmentRetry });
383
+ maxRetryRegular: segmentRetry,
384
+ requestTimeout: segmentRequestTimeout });
383
385
  /** Observable emitting the initial Manifest */
384
386
  var manifest$ = void 0;
385
387
  if (initialManifest instanceof Manifest) {
@@ -587,15 +589,13 @@ var Player = /** @class */ (function (_super) {
587
589
  // Handle state updates
588
590
  playerState$
589
591
  .pipe(takeUntil(stoppedContent$))
590
- .subscribe(function (x) { return _this._priv_setPlayerState(x); });
591
- var endedEvent$ = observation$.pipe(filter(function (o) {
592
- return o.event === "ended";
593
- }));
594
- (this._priv_stopAtEnd ? endedEvent$ :
595
- EMPTY)
596
- .pipe(takeUntil(stoppedContent$))
597
- .subscribe(function () {
598
- currentContentCanceller.cancel();
592
+ .subscribe(function (newState) {
593
+ _this._priv_setPlayerState(newState);
594
+ // Previous call could have performed all kind of side-effects, thus,
595
+ // we re-check the current state associated to the RxPlayer
596
+ if (_this.state === "ENDED" && _this._priv_stopAtEnd) {
597
+ currentContentCanceller.cancel();
598
+ }
599
599
  });
600
600
  // Link playback events to the corresponding callbacks
601
601
  playback$.subscribe({
@@ -2295,5 +2295,5 @@ var Player = /** @class */ (function (_super) {
2295
2295
  };
2296
2296
  return Player;
2297
2297
  }(EventEmitter));
2298
- Player.version = /* PLAYER_VERSION */ "3.28.0-dev.2022071100";
2298
+ Player.version = /* PLAYER_VERSION */ "3.29.0-dev.2022090500";
2299
2299
  export default Player;