rx-player 3.29.0 → 3.30.0-dev.2023011800

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 (439) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/VERSION +1 -1
  3. package/dist/_esm5.processed/compat/can_reuse_media_keys.d.ts +3 -2
  4. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +5 -4
  5. package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +16 -7
  6. package/dist/_esm5.processed/compat/event_listeners.d.ts +33 -56
  7. package/dist/_esm5.processed/compat/event_listeners.js +66 -116
  8. package/dist/_esm5.processed/compat/index.d.ts +1 -4
  9. package/dist/_esm5.processed/compat/index.js +1 -4
  10. package/dist/_esm5.processed/compat/on_height_width_change.d.ts +1 -1
  11. package/dist/_esm5.processed/compat/on_height_width_change.js +2 -2
  12. package/dist/_esm5.processed/config.d.ts +1 -0
  13. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +3 -1
  14. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +27 -6
  15. package/dist/_esm5.processed/core/api/playback_observer.d.ts +8 -9
  16. package/dist/_esm5.processed/core/api/playback_observer.js +6 -7
  17. package/dist/_esm5.processed/core/api/public_api.d.ts +39 -41
  18. package/dist/_esm5.processed/core/api/public_api.js +569 -578
  19. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +9 -14
  20. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +73 -43
  21. package/dist/_esm5.processed/core/api/utils.d.ts +15 -10
  22. package/dist/_esm5.processed/core/api/utils.js +84 -19
  23. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +22 -5
  24. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +97 -25
  25. package/dist/_esm5.processed/core/decrypt/attach_media_keys.d.ts +3 -2
  26. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +3 -2
  27. package/dist/_esm5.processed/core/decrypt/clear_on_stop.d.ts +1 -1
  28. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +1 -1
  29. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +12 -20
  30. package/dist/_esm5.processed/core/decrypt/create_session.js +1 -1
  31. package/dist/_esm5.processed/core/decrypt/find_key_system.js +35 -13
  32. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +1 -1
  33. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +32 -31
  34. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +291 -160
  35. package/dist/_esm5.processed/core/decrypt/set_server_certificate.d.ts +1 -1
  36. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +1 -1
  37. package/dist/_esm5.processed/core/decrypt/types.d.ts +0 -6
  38. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.d.ts +1 -1
  39. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +1 -1
  40. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +1 -1
  41. package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
  42. package/dist/_esm5.processed/core/fetchers/manifest/index.d.ts +2 -2
  43. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +153 -89
  44. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +419 -144
  45. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +0 -24
  46. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +0 -24
  47. package/dist/_esm5.processed/core/init/{initialize_directfile.d.ts → directfile_content_initializer.d.ts} +13 -16
  48. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +196 -0
  49. package/dist/_esm5.processed/core/init/index.d.ts +2 -2
  50. package/dist/_esm5.processed/core/init/index.js +2 -2
  51. package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +181 -0
  52. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +576 -0
  53. package/dist/_esm5.processed/core/init/types.d.ts +203 -64
  54. package/dist/_esm5.processed/core/init/types.js +36 -1
  55. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +164 -0
  56. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +484 -0
  57. package/dist/_esm5.processed/core/init/{create_media_source.d.ts → utils/create_media_source.d.ts} +8 -4
  58. package/dist/_esm5.processed/core/init/utils/create_media_source.js +118 -0
  59. package/dist/_esm5.processed/core/init/{create_stream_playback_observer.d.ts → utils/create_stream_playback_observer.d.ts} +4 -4
  60. package/dist/_esm5.processed/core/init/{create_stream_playback_observer.js → utils/create_stream_playback_observer.js} +2 -5
  61. package/dist/_esm5.processed/core/init/{end_of_stream.d.ts → utils/end_of_stream.d.ts} +5 -5
  62. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +85 -0
  63. package/dist/_esm5.processed/core/init/{get_initial_time.d.ts → utils/get_initial_time.d.ts} +1 -1
  64. package/dist/_esm5.processed/core/init/{get_initial_time.js → utils/get_initial_time.js} +3 -3
  65. package/dist/_esm5.processed/core/init/{emit_loaded_event.d.ts → utils/get_loaded_reference.d.ts} +9 -9
  66. package/dist/_esm5.processed/core/init/{emit_loaded_event.js → utils/get_loaded_reference.js} +23 -17
  67. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.d.ts +63 -0
  68. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +124 -0
  69. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.d.ts +80 -0
  70. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +111 -0
  71. package/dist/_esm5.processed/core/init/{media_duration_updater.d.ts → utils/media_duration_updater.d.ts} +3 -3
  72. package/dist/_esm5.processed/core/init/{media_duration_updater.js → utils/media_duration_updater.js} +115 -41
  73. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +113 -0
  74. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +483 -0
  75. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.d.ts +0 -0
  76. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.js +0 -0
  77. package/dist/_esm5.processed/core/{stream/types.js → init/utils/stream_events_emitter/index.d.ts} +3 -1
  78. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.js +0 -0
  79. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.d.ts +1 -1
  80. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.js +0 -0
  81. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.d.ts +30 -0
  82. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +155 -0
  83. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.d.ts +1 -13
  84. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.js +0 -0
  85. package/dist/_esm5.processed/core/init/{throw_on_media_error.d.ts → utils/throw_on_media_error.d.ts} +5 -5
  86. package/dist/_esm5.processed/core/init/{throw_on_media_error.js → utils/throw_on_media_error.js} +19 -15
  87. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +0 -1
  88. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +0 -1
  89. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +0 -5
  90. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +0 -5
  91. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +3 -3
  92. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +3 -3
  93. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +1 -1
  94. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  95. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +25 -130
  96. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +188 -117
  97. package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
  98. package/dist/_esm5.processed/core/stream/adaptation/index.js +1 -0
  99. package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +172 -0
  100. package/dist/_esm5.processed/core/stream/adaptation/types.js +1 -0
  101. package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.d.ts → utils/create_representation_estimator.d.ts} +6 -6
  102. package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.js → utils/create_representation_estimator.js} +3 -4
  103. package/dist/_esm5.processed/core/stream/index.d.ts +4 -3
  104. package/dist/_esm5.processed/core/stream/index.js +0 -1
  105. package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
  106. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +142 -17
  107. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +303 -229
  108. package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -3
  109. package/dist/_esm5.processed/core/stream/period/index.js +1 -0
  110. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +27 -62
  111. package/dist/_esm5.processed/core/stream/period/period_stream.js +278 -105
  112. package/dist/_esm5.processed/core/stream/period/types.d.ts +110 -0
  113. package/dist/_esm5.processed/core/stream/period/types.js +1 -0
  114. package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.d.ts → utils/get_adaptation_switch_strategy.d.ts} +3 -3
  115. package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.js → utils/get_adaptation_switch_strategy.js} +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/index.js +1 -0
  118. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +32 -121
  119. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +210 -136
  120. package/dist/_esm5.processed/core/stream/representation/types.d.ts +267 -0
  121. package/dist/_esm5.processed/core/stream/representation/types.js +1 -0
  122. package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.d.ts → utils/append_segment_to_buffer.d.ts} +5 -5
  123. package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.js → utils/append_segment_to_buffer.js} +8 -3
  124. package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.d.ts → utils/check_for_discontinuity.d.ts} +2 -2
  125. package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.js → utils/check_for_discontinuity.js} +1 -1
  126. package/dist/_esm5.processed/core/stream/representation/{downloading_queue.d.ts → utils/downloading_queue.d.ts} +85 -80
  127. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +378 -0
  128. package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.d.ts → utils/force_garbage_collection.d.ts} +2 -2
  129. package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.js → utils/force_garbage_collection.js} +3 -3
  130. package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.d.ts → utils/get_buffer_status.d.ts} +3 -3
  131. package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.js → utils/get_buffer_status.js} +3 -3
  132. package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.d.ts → utils/get_needed_segments.d.ts} +3 -3
  133. package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.js → utils/get_needed_segments.js} +4 -5
  134. package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.d.ts → utils/get_segment_priority.d.ts} +0 -0
  135. package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.js → utils/get_segment_priority.js} +1 -1
  136. package/dist/_esm5.processed/core/stream/representation/{push_init_segment.d.ts → utils/push_init_segment.d.ts} +9 -12
  137. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +85 -0
  138. package/dist/_esm5.processed/core/stream/representation/{push_media_segment.d.ts → utils/push_media_segment.d.ts} +9 -12
  139. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +109 -0
  140. package/dist/_esm5.processed/default_config.d.ts +10 -0
  141. package/dist/_esm5.processed/default_config.js +12 -1
  142. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
  143. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.d.ts +1 -1
  144. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +1 -1
  145. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.d.ts +2 -3
  146. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +107 -59
  147. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +6 -7
  148. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  149. package/dist/_esm5.processed/features/list/directfile.js +1 -1
  150. package/dist/_esm5.processed/features/types.d.ts +2 -3
  151. package/dist/_esm5.processed/manifest/adaptation.d.ts +7 -0
  152. package/dist/_esm5.processed/manifest/adaptation.js +3 -0
  153. package/dist/_esm5.processed/manifest/manifest.d.ts +2 -1
  154. package/dist/_esm5.processed/manifest/manifest.js +4 -3
  155. package/dist/_esm5.processed/manifest/update_period_in_place.d.ts +26 -1
  156. package/dist/_esm5.processed/manifest/update_period_in_place.js +58 -7
  157. package/dist/_esm5.processed/manifest/update_periods.d.ts +19 -2
  158. package/dist/_esm5.processed/manifest/update_periods.js +62 -18
  159. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +3 -0
  160. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +1 -0
  161. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
  162. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -1
  163. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +16 -0
  164. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +63 -25
  165. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +3 -0
  166. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +60 -6
  167. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +39 -13
  168. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +7 -3
  169. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.js +5 -0
  170. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +3 -0
  171. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.d.ts +0 -1
  172. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +0 -1
  173. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.js +5 -0
  174. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.js +6 -0
  175. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  176. package/dist/_esm5.processed/parsers/manifest/types.d.ts +13 -2
  177. package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +7 -0
  178. package/dist/_esm5.processed/public_types.d.ts +2 -0
  179. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -2
  180. package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
  181. package/dist/_esm5.processed/transports/dash/text_parser.js +3 -3
  182. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  183. package/dist/_esm5.processed/utils/event_emitter.d.ts +3 -13
  184. package/dist/_esm5.processed/utils/event_emitter.js +0 -19
  185. package/dist/_esm5.processed/utils/reference.d.ts +46 -67
  186. package/dist/_esm5.processed/utils/reference.js +63 -93
  187. package/dist/_esm5.processed/utils/request/xhr.d.ts +3 -68
  188. package/dist/_esm5.processed/utils/{rx-retry_with_backoff.d.ts → retry_promise_with_backoff.d.ts} +19 -34
  189. package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +119 -0
  190. package/dist/_esm5.processed/utils/sleep.d.ts +10 -0
  191. package/dist/_esm5.processed/utils/sleep.js +14 -0
  192. package/dist/_esm5.processed/utils/sorted_list.d.ts +1 -0
  193. package/dist/_esm5.processed/utils/sorted_list.js +3 -0
  194. package/dist/mpd-parser.wasm +0 -0
  195. package/dist/rx-player.js +8116 -11600
  196. package/dist/rx-player.min.js +1 -1
  197. package/dist/rx-player.min.js.LICENSE.txt +0 -15
  198. package/manifest.mpd +149 -0
  199. package/package.json +26 -26
  200. package/scripts/build/generate_build.js +1 -8
  201. package/sonar-project.properties +1 -1
  202. package/src/README.md +2 -2
  203. package/src/compat/__tests__/can_reuse_media_keys.test.ts +4 -27
  204. package/src/compat/can_reuse_media_keys.ts +5 -7
  205. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +14 -15
  206. package/src/compat/event_listeners.ts +84 -148
  207. package/src/compat/index.ts +0 -6
  208. package/src/compat/on_height_width_change.ts +2 -2
  209. package/src/core/README.md +1 -1
  210. package/src/core/adaptive/adaptive_representation_selector.ts +36 -7
  211. package/src/core/api/README.md +0 -33
  212. package/src/core/api/playback_observer.ts +20 -11
  213. package/src/core/api/public_api.ts +826 -815
  214. package/src/core/api/tracks_management/track_choice_manager.ts +97 -57
  215. package/src/core/api/utils.ts +112 -42
  216. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +42 -38
  217. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +15 -20
  218. package/src/core/decrypt/__tests__/__global__/media_key_system_access.test.ts +35 -47
  219. package/src/core/decrypt/__tests__/__global__/utils.ts +116 -17
  220. package/src/core/decrypt/attach_media_keys.ts +3 -2
  221. package/src/core/decrypt/clear_on_stop.ts +1 -1
  222. package/src/core/decrypt/content_decryptor.ts +19 -27
  223. package/src/core/decrypt/create_session.ts +1 -1
  224. package/src/core/decrypt/find_key_system.ts +31 -11
  225. package/src/core/decrypt/get_media_keys.ts +1 -1
  226. package/src/core/decrypt/session_events_listener.ts +259 -277
  227. package/src/core/decrypt/set_server_certificate.ts +1 -1
  228. package/src/core/decrypt/types.ts +0 -5
  229. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +1 -1
  230. package/src/core/decrypt/utils/loaded_sessions_store.ts +1 -1
  231. package/src/core/fetchers/README.md +3 -0
  232. package/src/core/fetchers/index.ts +6 -6
  233. package/src/core/fetchers/manifest/index.ts +7 -7
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +646 -295
  235. package/src/core/fetchers/segment/segment_fetcher_creator.ts +0 -24
  236. package/src/core/init/README.md +31 -45
  237. package/src/core/init/directfile_content_initializer.ts +229 -0
  238. package/src/core/init/index.ts +3 -3
  239. package/src/core/init/media_source_content_initializer.ts +819 -0
  240. package/src/core/init/types.ts +220 -132
  241. package/src/core/init/{__tests__ → utils/__tests__}/are_same_stream_events.test.ts +0 -0
  242. package/src/core/init/{__tests__ → utils/__tests__}/refresh_scheduled_events_list.test.ts +0 -0
  243. package/src/core/init/utils/content_time_boundaries_observer.ts +609 -0
  244. package/src/core/init/{create_media_source.ts → utils/create_media_source.ts} +60 -55
  245. package/src/core/init/{create_stream_playback_observer.ts → utils/create_stream_playback_observer.ts} +7 -11
  246. package/src/core/init/utils/end_of_stream.ts +104 -0
  247. package/src/core/init/{get_initial_time.ts → utils/get_initial_time.ts} +4 -4
  248. package/src/core/init/utils/get_loaded_reference.ts +76 -0
  249. package/src/core/init/utils/initial_seek_and_play.ts +179 -0
  250. package/src/core/init/utils/initialize_content_decryption.ts +178 -0
  251. package/src/core/init/{media_duration_updater.ts → utils/media_duration_updater.ts} +166 -84
  252. package/src/core/init/{rebuffering_controller.ts → utils/rebuffering_controller.ts} +247 -226
  253. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.ts +0 -0
  254. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.ts +1 -13
  255. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.ts +1 -1
  256. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +210 -0
  257. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.ts +1 -19
  258. package/src/core/init/utils/throw_on_media_error.ts +74 -0
  259. package/src/core/segment_buffers/README.md +5 -4
  260. package/src/core/segment_buffers/garbage_collector.ts +0 -1
  261. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -8
  262. package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +3 -3
  263. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
  264. package/src/core/stream/README.md +1 -1
  265. package/src/core/stream/adaptation/adaptation_stream.ts +265 -330
  266. package/src/core/stream/adaptation/index.ts +2 -12
  267. package/src/core/stream/adaptation/types.ts +193 -0
  268. package/src/core/stream/adaptation/{create_representation_estimator.ts → utils/create_representation_estimator.ts} +10 -9
  269. package/src/core/stream/index.ts +9 -1
  270. package/src/core/stream/orchestrator/README.md +1 -4
  271. package/src/core/stream/orchestrator/index.ts +2 -0
  272. package/src/core/stream/orchestrator/stream_orchestrator.ts +423 -326
  273. package/src/core/stream/period/index.ts +2 -12
  274. package/src/core/stream/period/period_stream.ts +301 -238
  275. package/src/core/stream/period/types.ts +132 -0
  276. package/src/core/stream/period/{get_adaptation_switch_strategy.ts → utils/get_adaptation_switch_strategy.ts} +6 -6
  277. package/src/core/stream/representation/README.md +2 -23
  278. package/src/core/stream/representation/index.ts +2 -12
  279. package/src/core/stream/representation/representation_stream.ts +315 -415
  280. package/src/core/stream/representation/types.ts +292 -0
  281. package/src/core/stream/representation/{append_segment_to_buffer.ts → utils/append_segment_to_buffer.ts} +11 -7
  282. package/src/core/stream/representation/{check_for_discontinuity.ts → utils/check_for_discontinuity.ts} +3 -3
  283. package/src/core/stream/representation/utils/downloading_queue.ts +592 -0
  284. package/src/core/stream/representation/{force_garbage_collection.ts → utils/force_garbage_collection.ts} +5 -6
  285. package/src/core/stream/representation/{get_buffer_status.ts → utils/get_buffer_status.ts} +5 -5
  286. package/src/core/stream/representation/{get_needed_segments.ts → utils/get_needed_segments.ts} +6 -7
  287. package/src/core/stream/representation/{get_segment_priority.ts → utils/get_segment_priority.ts} +1 -2
  288. package/src/core/stream/representation/utils/push_init_segment.ts +80 -0
  289. package/src/core/stream/representation/utils/push_media_segment.ts +113 -0
  290. package/src/default_config.ts +13 -1
  291. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +1 -1
  292. package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +1 -1
  293. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +58 -66
  294. package/src/experimental/tools/createMetaplaylist/index.ts +29 -38
  295. package/src/features/__tests__/initialize_features.test.ts +1 -1
  296. package/src/features/initialize_features.ts +2 -1
  297. package/src/features/list/__tests__/directfile.test.ts +3 -2
  298. package/src/features/list/directfile.ts +1 -1
  299. package/src/features/types.ts +2 -7
  300. package/src/manifest/__tests__/manifest.test.ts +14 -365
  301. package/src/manifest/__tests__/update_period_in_place.test.ts +522 -57
  302. package/src/manifest/__tests__/update_periods.test.ts +254 -40
  303. package/src/manifest/adaptation.ts +11 -0
  304. package/src/manifest/manifest.ts +6 -4
  305. package/src/manifest/update_period_in_place.ts +84 -14
  306. package/src/manifest/update_periods.ts +93 -33
  307. package/src/parsers/manifest/dash/common/indexes/base.ts +4 -0
  308. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +8 -1
  309. package/src/parsers/manifest/dash/common/indexes/template.ts +76 -25
  310. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +61 -3
  311. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +46 -15
  312. package/src/parsers/manifest/dash/common/parse_representations.ts +7 -3
  313. package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.ts +6 -0
  314. package/src/parsers/manifest/dash/node_parser_types.ts +3 -0
  315. package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +3 -0
  316. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +4 -0
  317. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  318. package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.ts +6 -0
  319. package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.ts +7 -0
  320. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +3 -0
  321. package/src/parsers/manifest/types.ts +13 -2
  322. package/src/parsers/texttracks/ttml/html/create_element.ts +8 -0
  323. package/src/public_types.ts +2 -0
  324. package/src/transports/README.md +15 -54
  325. package/src/transports/dash/manifest_parser.ts +2 -2
  326. package/src/transports/dash/segment_loader.ts +1 -1
  327. package/src/transports/dash/text_parser.ts +3 -3
  328. package/src/transports/local/segment_loader.ts +1 -1
  329. package/src/utils/__tests__/event_emitter.test.ts +1 -76
  330. package/src/utils/event_emitter.ts +6 -30
  331. package/src/utils/reference.ts +112 -169
  332. package/src/utils/request/xhr.ts +3 -68
  333. package/src/utils/retry_promise_with_backoff.ts +95 -0
  334. package/src/utils/sleep.ts +14 -0
  335. package/src/utils/sorted_list.ts +4 -0
  336. package/dist/_esm5.processed/compat/play.d.ts +0 -23
  337. package/dist/_esm5.processed/compat/play.js +0 -32
  338. package/dist/_esm5.processed/compat/set_element_src.d.ts +0 -26
  339. package/dist/_esm5.processed/compat/set_element_src.js +0 -37
  340. package/dist/_esm5.processed/compat/when_loaded_metadata.d.ts +0 -23
  341. package/dist/_esm5.processed/compat/when_loaded_metadata.js +0 -33
  342. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.d.ts +0 -45
  343. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +0 -295
  344. package/dist/_esm5.processed/core/init/create_media_source.js +0 -107
  345. package/dist/_esm5.processed/core/init/end_of_stream.js +0 -74
  346. package/dist/_esm5.processed/core/init/events_generators.d.ts +0 -88
  347. package/dist/_esm5.processed/core/init/events_generators.js +0 -87
  348. package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +0 -81
  349. package/dist/_esm5.processed/core/init/initial_seek_and_play.js +0 -114
  350. package/dist/_esm5.processed/core/init/initialize_directfile.js +0 -120
  351. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +0 -122
  352. package/dist/_esm5.processed/core/init/initialize_media_source.js +0 -201
  353. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +0 -62
  354. package/dist/_esm5.processed/core/init/link_drm_and_content.js +0 -94
  355. package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +0 -46
  356. package/dist/_esm5.processed/core/init/load_on_media_source.js +0 -122
  357. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +0 -65
  358. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +0 -233
  359. package/dist/_esm5.processed/core/init/rebuffering_controller.d.ts +0 -81
  360. package/dist/_esm5.processed/core/init/rebuffering_controller.js +0 -439
  361. package/dist/_esm5.processed/core/init/stream_events_emitter/index.d.ts +0 -19
  362. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +0 -27
  363. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +0 -126
  364. package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +0 -0
  365. package/dist/_esm5.processed/core/init/update_playback_rate.js +0 -1
  366. package/dist/_esm5.processed/core/stream/events_generators.d.ts +0 -67
  367. package/dist/_esm5.processed/core/stream/events_generators.js +0 -112
  368. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.d.ts +0 -53
  369. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +0 -124
  370. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.d.ts +0 -35
  371. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +0 -53
  372. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +0 -36
  373. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +0 -46
  374. package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +0 -47
  375. package/dist/_esm5.processed/core/stream/reload_after_switch.js +0 -56
  376. package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +0 -371
  377. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +0 -49
  378. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +0 -76
  379. package/dist/_esm5.processed/core/stream/types.d.ts +0 -437
  380. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +0 -24
  381. package/dist/_esm5.processed/utils/cast_to_observable.js +0 -35
  382. package/dist/_esm5.processed/utils/concat_map_latest.d.ts +0 -23
  383. package/dist/_esm5.processed/utils/concat_map_latest.js +0 -48
  384. package/dist/_esm5.processed/utils/defer_subscriptions.d.ts +0 -79
  385. package/dist/_esm5.processed/utils/defer_subscriptions.js +0 -89
  386. package/dist/_esm5.processed/utils/filter_map.d.ts +0 -28
  387. package/dist/_esm5.processed/utils/filter_map.js +0 -32
  388. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +0 -39
  389. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +0 -63
  390. package/dist/_esm5.processed/utils/rx-next-tick.d.ts +0 -27
  391. package/dist/_esm5.processed/utils/rx-next-tick.js +0 -41
  392. package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +0 -70
  393. package/dist/_esm5.processed/utils/rx-throttle.d.ts +0 -40
  394. package/dist/_esm5.processed/utils/rx-throttle.js +0 -47
  395. package/dist/_esm5.processed/utils/rx-try_catch.d.ts +0 -23
  396. package/dist/_esm5.processed/utils/rx-try_catch.js +0 -30
  397. package/src/compat/__tests__/play.test.ts +0 -73
  398. package/src/compat/__tests__/set_element_src.test.ts +0 -71
  399. package/src/compat/__tests__/when_loaded_metadata.test.ts +0 -109
  400. package/src/compat/play.ts +0 -37
  401. package/src/compat/set_element_src.ts +0 -47
  402. package/src/compat/when_loaded_metadata.ts +0 -40
  403. package/src/core/init/content_time_boundaries_observer.ts +0 -382
  404. package/src/core/init/emit_loaded_event.ts +0 -71
  405. package/src/core/init/end_of_stream.ts +0 -104
  406. package/src/core/init/events_generators.ts +0 -140
  407. package/src/core/init/initial_seek_and_play.ts +0 -208
  408. package/src/core/init/initialize_directfile.ts +0 -191
  409. package/src/core/init/initialize_media_source.ts +0 -389
  410. package/src/core/init/link_drm_and_content.ts +0 -176
  411. package/src/core/init/load_on_media_source.ts +0 -237
  412. package/src/core/init/manifest_update_scheduler.ts +0 -362
  413. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +0 -182
  414. package/src/core/init/throw_on_media_error.ts +0 -68
  415. package/src/core/init/update_playback_rate.ts +0 -0
  416. package/src/core/stream/events_generators.ts +0 -217
  417. package/src/core/stream/orchestrator/active_period_emitter.ts +0 -146
  418. package/src/core/stream/orchestrator/are_streams_complete.ts +0 -70
  419. package/src/core/stream/period/create_empty_adaptation_stream.ts +0 -70
  420. package/src/core/stream/reload_after_switch.ts +0 -76
  421. package/src/core/stream/representation/downloading_queue.ts +0 -632
  422. package/src/core/stream/representation/push_init_segment.ts +0 -87
  423. package/src/core/stream/representation/push_media_segment.ts +0 -125
  424. package/src/core/stream/types.ts +0 -558
  425. package/src/utils/__tests__/cast_to_observable.test.ts +0 -93
  426. package/src/utils/__tests__/concat_map_latest.test.ts +0 -221
  427. package/src/utils/__tests__/defer_subscriptions.test.ts +0 -50
  428. package/src/utils/__tests__/filter_map.test.ts +0 -87
  429. package/src/utils/__tests__/rx-throttle.test.ts +0 -252
  430. package/src/utils/__tests__/rx-try_catch.test.ts +0 -100
  431. package/src/utils/cast_to_observable.ts +0 -48
  432. package/src/utils/concat_map_latest.ts +0 -61
  433. package/src/utils/defer_subscriptions.ts +0 -96
  434. package/src/utils/filter_map.ts +0 -43
  435. package/src/utils/rx-from_cancellable_promise.ts +0 -71
  436. package/src/utils/rx-next-tick.ts +0 -43
  437. package/src/utils/rx-retry_with_backoff.ts +0 -101
  438. package/src/utils/rx-throttle.ts +0 -84
  439. package/src/utils/rx-try_catch.ts +0 -37
@@ -14,25 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- catchError,
19
- concat as observableConcat,
20
- concatMap,
21
- defer as observableDefer,
22
- EMPTY,
23
- identity,
24
- ignoreElements,
25
- map,
26
- merge as observableMerge,
27
- mergeMap,
28
- Observable,
29
- of as observableOf,
30
- Subject,
31
- tap,
32
- takeUntil,
33
- timeout,
34
- TimeoutError,
35
- } from "rxjs";
36
17
  import {
37
18
  events,
38
19
  ICustomMediaKeySession,
@@ -43,182 +24,256 @@ import {
43
24
  IKeySystemOption,
44
25
  IPlayerError,
45
26
  } from "../../public_types";
46
- import castToObservable from "../../utils/cast_to_observable";
47
27
  import isNonEmptyString from "../../utils/is_non_empty_string";
48
28
  import isNullOrUndefined from "../../utils/is_null_or_undefined";
49
- import retryObsWithBackoff, {
29
+ import retryPromiseWithBackoff, {
50
30
  IBackoffOptions,
51
- } from "../../utils/rx-retry_with_backoff";
52
- import tryCatch from "../../utils/rx-try_catch";
53
- import {
54
- IEMEWarningEvent,
55
- ILicense,
56
- } from "./types";
57
- import checkKeyStatuses, {
58
- IKeyStatusesCheckingOptions,
59
- } from "./utils/check_key_statuses";
31
+ } from "../../utils/retry_promise_with_backoff";
32
+ import TaskCanceller, {
33
+ CancellationSignal,
34
+ } from "../../utils/task_canceller";
35
+ import checkKeyStatuses from "./utils/check_key_statuses";
60
36
 
61
- const { onKeyError$,
62
- onKeyMessage$,
63
- onKeyStatusesChange$ } = events;
64
-
65
- /**
66
- * Error thrown when the MediaKeySession is blacklisted.
67
- * Such MediaKeySession should not be re-used but other MediaKeySession for the
68
- * same content can still be used.
69
- * @class BlacklistedSessionError
70
- * @extends Error
71
- */
72
- export class BlacklistedSessionError extends Error {
73
- public sessionError : IPlayerError;
74
- constructor(sessionError : IPlayerError) {
75
- super();
76
- // @see https://stackoverflow.com/questions/41102060/typescript-extending-error-class
77
- Object.setPrototypeOf(this, BlacklistedSessionError.prototype);
78
- this.sessionError = sessionError;
79
- }
80
- }
37
+ const { onKeyError,
38
+ onKeyMessage,
39
+ onKeyStatusesChange } = events;
81
40
 
82
41
  /**
83
- * listen to various events from a MediaKeySession and react accordingly
42
+ * Listen to various events from a MediaKeySession and react accordingly
84
43
  * depending on the configuration given.
85
44
  * @param {MediaKeySession} session - The MediaKeySession concerned.
86
45
  * @param {Object} keySystemOptions - The key system options.
87
46
  * @param {String} keySystem - The configuration keySystem used for deciphering
88
- * @returns {Observable}
47
+ * @param {Object} callbacks
48
+ * @param {Object} cancelSignal
89
49
  */
90
50
  export default function SessionEventsListener(
91
- session: MediaKeySession | ICustomMediaKeySession,
92
- keySystemOptions: IKeySystemOption,
93
- keySystem: string
94
- ) : Observable<IEMEWarningEvent | IKeysUpdateEvent> {
51
+ session : MediaKeySession | ICustomMediaKeySession,
52
+ keySystemOptions : IKeySystemOption,
53
+ keySystem : string,
54
+ callbacks : ISessionEventListenerCallbacks,
55
+ cancelSignal : CancellationSignal
56
+ ) : void {
95
57
  log.info("DRM: Binding session events", session.sessionId);
96
- const sessionWarningSubject$ = new Subject<IEMEWarningEvent>();
97
58
  const { getLicenseConfig = {} } = keySystemOptions;
98
59
 
99
- const keyErrors = onKeyError$(session).pipe(map((error) : never => {
100
- throw new EncryptedMediaError("KEY_ERROR", error.type);
101
- }));
60
+ /** Allows to manually cancel everything the `SessionEventsListener` is doing. */
61
+ const manualCanceller = new TaskCanceller({ cancelOn: cancelSignal });
102
62
 
103
- const keyStatusesChange$ = onKeyStatusesChange$(session)
104
- .pipe(mergeMap((keyStatusesEvent: Event) =>
105
- handleKeyStatusesChangeEvent(session,
106
- keySystemOptions,
107
- keySystem,
108
- keyStatusesEvent)));
63
+ if (!isNullOrUndefined(session.closed)) {
64
+ session.closed
65
+ .then(() => manualCanceller.cancel())
66
+ .catch((err) => { // Should never happen
67
+ if (cancelSignal.isCancelled) {
68
+ return;
69
+ }
70
+ manualCanceller.cancel();
71
+ callbacks.onError(err);
72
+ });
73
+ }
109
74
 
110
- const keyMessages$ : Observable<IEMEWarningEvent |
111
- IKeyMessageHandledEvent > =
112
- onKeyMessage$(session).pipe(mergeMap((messageEvent: MediaKeyMessageEvent) => {
113
- const message = new Uint8Array(messageEvent.message);
114
- const messageType = isNonEmptyString(messageEvent.messageType) ?
115
- messageEvent.messageType :
116
- "license-request";
75
+ onKeyError(session, (evt) => {
76
+ manualCanceller.cancel();
77
+ callbacks.onError(new EncryptedMediaError("KEY_ERROR", (evt as Event).type));
78
+ }, manualCanceller.signal);
117
79
 
118
- log.info(`DRM: Received message event, type ${messageType}`,
119
- session.sessionId);
120
- const getLicense$ = observableDefer(() => {
121
- const getLicense = keySystemOptions.getLicense(message, messageType);
122
- const getLicenseTimeout = isNullOrUndefined(getLicenseConfig.timeout) ?
123
- 10 * 1000 :
124
- getLicenseConfig.timeout;
125
- return castToObservable(getLicense)
126
- .pipe(getLicenseTimeout >= 0 ? timeout(getLicenseTimeout) :
127
- identity /* noop */);
128
- });
80
+ onKeyStatusesChange(session, (keyStatusesEvent) => {
81
+ handleKeyStatusesChangeEvent(keyStatusesEvent as Event).catch(error => {
82
+ if (cancelSignal.isCancelled ||
83
+ (manualCanceller.isUsed && error instanceof CancellationSignal))
84
+ {
85
+ return;
86
+ }
87
+ manualCanceller.cancel();
88
+ callbacks.onError(error);
89
+ });
90
+ }, manualCanceller.signal);
91
+
92
+ onKeyMessage(session, (evt) => {
93
+ const messageEvent = evt as MediaKeyMessageEvent;
94
+ const message = new Uint8Array(messageEvent.message);
95
+ const messageType = isNonEmptyString(messageEvent.messageType) ?
96
+ messageEvent.messageType :
97
+ "license-request";
129
98
 
130
- const backoffOptions = getLicenseBackoffOptions(sessionWarningSubject$,
131
- getLicenseConfig.retry);
132
- return retryObsWithBackoff(getLicense$, backoffOptions).pipe(
133
- map(licenseObject => ({
134
- type: "key-message-handled" as const,
135
- value : { session, license: licenseObject },
136
- })),
99
+ log.info(`DRM: Received message event, type ${messageType}`,
100
+ session.sessionId);
137
101
 
138
- catchError((err : unknown) => {
139
- const formattedError = formatGetLicenseError(err);
102
+ const backoffOptions = getLicenseBackoffOptions(getLicenseConfig.retry);
103
+ retryPromiseWithBackoff(() => runGetLicense(message, messageType),
104
+ backoffOptions,
105
+ manualCanceller.signal)
106
+ .then((licenseObject) => {
107
+ if (manualCanceller.isUsed) {
108
+ return Promise.resolve();
109
+ }
110
+ if (isNullOrUndefined(licenseObject)) {
111
+ log.info("DRM: No license given, skipping session.update");
112
+ } else {
113
+ return updateSessionWithMessage(session, licenseObject);
114
+ }
115
+ })
116
+ .catch((err : unknown) => {
117
+ if (manualCanceller.isUsed) {
118
+ return;
119
+ }
120
+ manualCanceller.cancel();
121
+ const formattedError = formatGetLicenseError(err);
140
122
 
141
- if (!isNullOrUndefined(err)) {
142
- const { fallbackOnLastTry } = (err as { fallbackOnLastTry? : boolean });
143
- if (fallbackOnLastTry === true) {
144
- log.warn("DRM: Last `getLicense` attempt failed. " +
145
- "Blacklisting the current session.");
146
- throw new BlacklistedSessionError(formattedError);
147
- }
123
+ if (!isNullOrUndefined(err)) {
124
+ const { fallbackOnLastTry } = (err as { fallbackOnLastTry? : boolean });
125
+ if (fallbackOnLastTry === true) {
126
+ log.warn("DRM: Last `getLicense` attempt failed. " +
127
+ "Blacklisting the current session.");
128
+ callbacks.onError(new BlacklistedSessionError(formattedError));
129
+ return;
148
130
  }
149
- throw formattedError;
150
- }));
151
- }));
131
+ }
132
+ callbacks.onError(formattedError);
133
+ });
134
+ }, manualCanceller.signal);
135
+
136
+ /**
137
+ * @param {Event} keyStatusesEvent
138
+ * @returns {Promise}
139
+ */
140
+ async function handleKeyStatusesChangeEvent(
141
+ keyStatusesEvent : Event
142
+ ) : Promise<void> {
143
+ log.info("DRM: keystatuseschange event received", session.sessionId);
144
+
145
+ await Promise.all([
146
+ runOnKeyStatusesChangeCallback(),
147
+ Promise.resolve(handleKeyStatusEvent()),
148
+ ]);
152
149
 
153
- const sessionUpdates = observableMerge(keyMessages$, keyStatusesChange$)
154
- .pipe(concatMap((
155
- evt : IEMEWarningEvent |
156
- IKeyMessageHandledEvent |
157
- IKeysUpdateEvent |
158
- IKeyStatusChangeHandledEvent
159
- ) : Observable< IEMEWarningEvent |
160
- IKeysUpdateEvent > => {
161
- switch (evt.type) {
162
- case "key-message-handled":
163
- case "key-status-change-handled":
164
- if (isNullOrUndefined(evt.value.license)) {
165
- log.info("DRM: No message given, skipping session.update");
166
- return EMPTY;
150
+ async function runOnKeyStatusesChangeCallback() {
151
+ if (manualCanceller.isUsed) {
152
+ return;
153
+ }
154
+ if (typeof keySystemOptions.onKeyStatusesChange === "function") {
155
+ let ret;
156
+ try {
157
+ ret = await keySystemOptions.onKeyStatusesChange(keyStatusesEvent, session);
158
+ if (manualCanceller.isUsed) {
159
+ return;
160
+ }
161
+ } catch (error) {
162
+ if (cancelSignal.isCancelled) {
163
+ return;
164
+ }
165
+ const err = new EncryptedMediaError("KEY_STATUS_CHANGE_ERROR",
166
+ "Unknown `onKeyStatusesChange` error");
167
+ if (!isNullOrUndefined(error) &&
168
+ isNonEmptyString((error as { message? : unknown }).message))
169
+ {
170
+ err.message = (error as { message : string }).message;
167
171
  }
172
+ throw err;
173
+ }
174
+ if (isNullOrUndefined(ret)) {
175
+ log.info("DRM: No license given, skipping session.update");
176
+ } else {
177
+ await updateSessionWithMessage(session, ret);
178
+ }
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Check current MediaKeyStatus for each key in the given MediaKeySession and:
184
+ * - throw if at least one status is a non-recoverable error
185
+ * - call warning callback for recoverable errors
186
+ * - call onKeyUpdate callback when the MediaKeyStatus of any key is updated
187
+ */
188
+ function handleKeyStatusEvent() : void {
189
+ if (manualCanceller.isUsed || session.keyStatuses.size === 0) {
190
+ return ;
191
+ }
192
+ const { warning, blacklistedKeyIds, whitelistedKeyIds } =
193
+ checkKeyStatuses(session, keySystemOptions, keySystem);
194
+ if (warning !== undefined) {
195
+ callbacks.onWarning(warning);
196
+ if (manualCanceller.isUsed) {
197
+ return;
198
+ }
199
+ }
200
+ callbacks.onKeyUpdate({ whitelistedKeyIds, blacklistedKeyIds });
201
+ }
202
+ }
168
203
 
169
- return updateSessionWithMessage(session, evt.value.license);
170
- default:
171
- return observableOf(evt);
204
+ function runGetLicense(
205
+ message : Uint8Array,
206
+ messageType : MediaKeyMessageType
207
+ ) : Promise<BufferSource | null> {
208
+ return new Promise((res, rej) => {
209
+ log.debug("DRM: Calling `getLicense`", messageType);
210
+ const getLicense = keySystemOptions.getLicense(message, messageType);
211
+ const getLicenseTimeout = isNullOrUndefined(getLicenseConfig.timeout) ?
212
+ 10 * 1000 :
213
+ getLicenseConfig.timeout;
214
+
215
+ let timeoutId : number | undefined;
216
+ if (getLicenseTimeout >= 0) {
217
+ timeoutId = setTimeout(() => {
218
+ rej(new GetLicenseTimeoutError(
219
+ `"getLicense" timeout exceeded (${getLicenseTimeout} ms)`
220
+ ));
221
+ }, getLicenseTimeout) as unknown as number;
172
222
  }
173
- }));
174
223
 
175
- const sessionEvents = observableMerge(
176
- getKeyStatusesEvents(session, keySystemOptions, keySystem),
177
- sessionUpdates,
178
- keyErrors,
179
- sessionWarningSubject$);
224
+ try {
225
+ Promise.resolve(getLicense).then(
226
+ (val) => {
227
+ clearTimeoutIfOne();
228
+ res(val);
229
+ },
230
+ (err) => {
231
+ clearTimeoutIfOne();
232
+ rej(err);
233
+ });
234
+ } catch (err) {
235
+ clearTimeoutIfOne();
236
+ rej(err);
237
+ }
238
+ function clearTimeoutIfOne() {
239
+ if (timeoutId !== undefined) {
240
+ clearTimeout(timeoutId);
241
+ }
242
+ }
243
+ });
244
+ }
180
245
 
181
- return !isNullOrUndefined(session.closed) ?
182
- sessionEvents
183
- // TODO There is a subtle TypeScript issue there that made casting
184
- // to a type-compatible type mandatory. If a more elegant solution
185
- // can be found, it should be preffered.
186
- .pipe(takeUntil(castToObservable(session.closed as Promise<unknown>))) :
187
- sessionEvents;
246
+ /**
247
+ * Construct backoff options for the getLicense call.
248
+ * @param {number|undefined} numberOfRetry - Maximum of amount retried.
249
+ * Equal to `2` if not defined.
250
+ * @returns {Object}
251
+ */
252
+ function getLicenseBackoffOptions(
253
+ numberOfRetry : number | undefined
254
+ ) : IBackoffOptions {
255
+ return {
256
+ totalRetry: numberOfRetry ?? 2,
257
+ baseDelay: 200,
258
+ maxDelay: 3000,
259
+ shouldRetry: (error : unknown) =>
260
+ error instanceof GetLicenseTimeoutError ||
261
+ isNullOrUndefined(error) ||
262
+ (error as { noRetry? : boolean }).noRetry !== true,
263
+ onRetry: (error : unknown) =>
264
+ callbacks.onWarning(formatGetLicenseError(error)),
265
+ };
266
+ }
188
267
  }
189
268
 
190
- /**
191
- * Check current MediaKeyStatus for each key in the given MediaKeySession and
192
- * return an Observable which either:
193
- * - throw if at least one status is a non-recoverable error
194
- * - emit warning events for recoverable errors
195
- * - emit blacklist-keys events for key IDs that are not decipherable
196
- * @param {MediaKeySession} session - The MediaKeySession concerned.
197
- * @param {Object} options - Options related to key statuses checks.
198
- * @param {String} keySystem - The name of the key system used for deciphering
199
- * @returns {Observable}
200
- */
201
- function getKeyStatusesEvents(
202
- session : MediaKeySession | ICustomMediaKeySession,
203
- options : IKeyStatusesCheckingOptions,
204
- keySystem : string
205
- ) : Observable<IEMEWarningEvent | IKeysUpdateEvent> {
206
- return observableDefer(() => {
207
- if (session.keyStatuses.size === 0) {
208
- return EMPTY;
209
- }
210
- const { warning,
211
- blacklistedKeyIds,
212
- whitelistedKeyIds } = checkKeyStatuses(session, options, keySystem);
213
- const keysUpdate$ = observableOf({ type : "keys-update" as const,
214
- value : { whitelistedKeyIds,
215
- blacklistedKeyIds } });
216
- if (warning !== undefined) {
217
- return observableConcat(observableOf({ type: "warning" as const, value: warning }),
218
- keysUpdate$);
219
- }
220
- return keysUpdate$;
221
- });
269
+ export interface ISessionEventListenerCallbacks {
270
+ /**
271
+ * Some key ids related to the current MediaKeySession have updated their
272
+ * statuses.
273
+ */
274
+ onKeyUpdate : (val : IKeyUpdateValue) => void;
275
+ onWarning : (val : IPlayerError) => void;
276
+ onError : (val : unknown | BlacklistedSessionError) => void;
222
277
  }
223
278
 
224
279
  /**
@@ -228,7 +283,7 @@ function getKeyStatusesEvents(
228
283
  * @returns {Error}
229
284
  */
230
285
  function formatGetLicenseError(error: unknown) : IPlayerError {
231
- if (error instanceof TimeoutError) {
286
+ if (error instanceof GetLicenseTimeoutError) {
232
287
  return new EncryptedMediaError("KEY_LOAD_TIMEOUT",
233
288
  "The license server took too much time to " +
234
289
  "respond.");
@@ -246,111 +301,23 @@ function formatGetLicenseError(error: unknown) : IPlayerError {
246
301
 
247
302
  /**
248
303
  * Call MediaKeySession.update with the given `message`, if defined.
249
- * Returns the right event depending on the action taken.
250
304
  * @param {MediaKeySession} session
251
305
  * @param {ArrayBuffer|TypedArray|null} message
252
- * @returns {Observable}
306
+ * @returns {Promise}
253
307
  */
254
- function updateSessionWithMessage(
308
+ async function updateSessionWithMessage(
255
309
  session : MediaKeySession | ICustomMediaKeySession,
256
310
  message : BufferSource
257
- ) : Observable<never> {
311
+ ) : Promise<void> {
258
312
  log.info("DRM: Updating MediaKeySession with message");
259
- return castToObservable(session.update(message)).pipe(
260
- catchError((error: unknown) => {
261
- const reason = error instanceof Error ? error.toString() :
262
- "`session.update` failed";
263
- throw new EncryptedMediaError("KEY_UPDATE_ERROR", reason);
264
- }),
265
- tap(() => { log.info("DRM: MediaKeySession update succeeded."); }),
266
- // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
267
- // first type parameter as `any` instead of the perfectly fine `unknown`,
268
- // leading to linter issues, as it forbids the usage of `any`.
269
- // This is why we're disabling the eslint rule.
270
- /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
271
- ignoreElements());
272
- }
273
-
274
- /**
275
- * @param {MediaKeySession} session
276
- * @param {Object} keySystemOptions
277
- * @param {string} keySystem
278
- * @param {Event} keyStatusesEvent
279
- * @returns {Observable}
280
- */
281
- function handleKeyStatusesChangeEvent(
282
- session : MediaKeySession | ICustomMediaKeySession,
283
- keySystemOptions : IKeySystemOption,
284
- keySystem : string,
285
- keyStatusesEvent : Event
286
- ) : Observable<IKeyStatusChangeHandledEvent | IKeysUpdateEvent | IEMEWarningEvent> {
287
- log.info("DRM: keystatuseschange event received", session.sessionId);
288
- const callback$ = observableDefer(() => {
289
- return tryCatch(() => {
290
- if (typeof keySystemOptions.onKeyStatusesChange !== "function") {
291
- return EMPTY;
292
- }
293
- return castToObservable(keySystemOptions.onKeyStatusesChange(keyStatusesEvent,
294
- session));
295
- }, undefined);
296
- }).pipe(
297
- map(licenseObject => ({ type: "key-status-change-handled" as const,
298
- value : { session, license: licenseObject } })),
299
- catchError((error: unknown) => {
300
- const err = new EncryptedMediaError("KEY_STATUS_CHANGE_ERROR",
301
- "Unknown `onKeyStatusesChange` error");
302
- if (!isNullOrUndefined(error) &&
303
- isNonEmptyString((error as { message? : unknown }).message))
304
- {
305
- err.message = (error as { message : string }).message;
306
- }
307
- throw err;
308
- })
309
- );
310
- return observableMerge(getKeyStatusesEvents(session, keySystemOptions, keySystem),
311
- callback$);
312
- }
313
-
314
- /**
315
- * Construct backoff options for the getLicense call.
316
- * @param {Subject} sessionWarningSubject$ - Subject through which retry
317
- * warnings will be sent.
318
- * @param {number|undefined} numberOfRetry - Maximum of amount retried.
319
- * Equal to `2` if not defined.
320
- * @returns {Object}
321
- */
322
- function getLicenseBackoffOptions(
323
- sessionWarningSubject$ : Subject<IEMEWarningEvent>,
324
- numberOfRetry : number | undefined
325
- ) : IBackoffOptions {
326
- return {
327
- totalRetry: numberOfRetry ?? 2,
328
- baseDelay: 200,
329
- maxDelay: 3000,
330
- shouldRetry: (error : unknown) => error instanceof TimeoutError ||
331
- isNullOrUndefined(error) ||
332
- (error as { noRetry? : boolean }).noRetry !== true,
333
- onRetry: (error : unknown) =>
334
- sessionWarningSubject$.next({ type: "warning",
335
- value: formatGetLicenseError(error) }),
336
- };
337
- }
338
-
339
- /**
340
- * Some key ids related to the current MediaKeySession have updated their
341
- * statuses.
342
- *
343
- * Note that each `IKeysUpdateEvent` is independent of any other.
344
- *
345
- * A new `IKeysUpdateEvent` does not completely replace a previously emitted
346
- * one, as it can for example be linked to a whole other decryption session.
347
- *
348
- * However, if a key id is encountered in both an older and a newer
349
- * `IKeysUpdateEvent`, only the newer, updated, status should be considered.
350
- */
351
- export interface IKeysUpdateEvent {
352
- type: "keys-update";
353
- value: IKeyUpdateValue;
313
+ try {
314
+ await session.update(message);
315
+ } catch (error) {
316
+ const reason = error instanceof Error ? error.toString() :
317
+ "`session.update` failed";
318
+ throw new EncryptedMediaError("KEY_UPDATE_ERROR", reason);
319
+ }
320
+ log.info("DRM: MediaKeySession update succeeded.");
354
321
  }
355
322
 
356
323
  /** Information on key ids linked to a MediaKeySession. */
@@ -382,18 +349,33 @@ export interface IKeyUpdateValue {
382
349
  whitelistedKeyIds : Uint8Array[];
383
350
  }
384
351
 
385
- /** Emitted after the `onKeyStatusesChange` callback has been called. */
386
- interface IKeyStatusChangeHandledEvent {
387
- type: "key-status-change-handled";
388
- value: { session: MediaKeySession |
389
- ICustomMediaKeySession;
390
- license: ILicense|null; };
352
+ /**
353
+ * Error thrown when the MediaKeySession is blacklisted.
354
+ * Such MediaKeySession should not be re-used but other MediaKeySession for the
355
+ * same content can still be used.
356
+ * @class BlacklistedSessionError
357
+ * @extends Error
358
+ */
359
+ export class BlacklistedSessionError extends Error {
360
+ public sessionError : IPlayerError;
361
+ constructor(sessionError : IPlayerError) {
362
+ super();
363
+ // @see https://stackoverflow.com/questions/41102060/typescript-extending-error-class
364
+ Object.setPrototypeOf(this, BlacklistedSessionError.prototype);
365
+ this.sessionError = sessionError;
366
+ }
391
367
  }
392
368
 
393
- /** Emitted after the `getLicense` callback has been called */
394
- interface IKeyMessageHandledEvent {
395
- type: "key-message-handled";
396
- value: { session: MediaKeySession |
397
- ICustomMediaKeySession;
398
- license: ILicense|null; };
369
+ /**
370
+ * Error thrown when a `getLicense` call timeouts.
371
+ * @class GetLicenseTimeoutError
372
+ * @extends Error
373
+ */
374
+ export class GetLicenseTimeoutError extends Error {
375
+ constructor(message : string) {
376
+ super();
377
+ // @see https://stackoverflow.com/questions/41102060/typescript-extending-error-class
378
+ Object.setPrototypeOf(this, BlacklistedSessionError.prototype);
379
+ this.message = message;
380
+ }
399
381
  }
@@ -61,7 +61,7 @@ async function setServerCertificate(
61
61
  * and complete.
62
62
  * @param {MediaKeys} mediaKeys
63
63
  * @param {ArrayBuffer} serverCertificate
64
- * @returns {Observable}
64
+ * @returns {Promise.<Object>}
65
65
  */
66
66
  export default async function trySettingServerCertificate(
67
67
  mediaKeys : ICustomMediaKeys|MediaKeys,
@@ -19,7 +19,6 @@ import Manifest, {
19
19
  Period,
20
20
  Representation,
21
21
  } from "../../manifest";
22
- import { IPlayerError } from "../../public_types";
23
22
  import InitDataValuesContainer from "./utils/init_data_values_container";
24
23
  import LoadedSessionsStore from "./utils/loaded_sessions_store";
25
24
  import PersistentSessionsStore from "./utils/persistent_sessions_store";
@@ -74,10 +73,6 @@ export interface IInitDataValue {
74
73
  data: Uint8Array;
75
74
  }
76
75
 
77
- /** Event emitted when a minor - recoverable - error happened. */
78
- export interface IEMEWarningEvent { type : "warning";
79
- value : IPlayerError; }
80
-
81
76
  export type ILicense = BufferSource |
82
77
  ArrayBuffer;
83
78
 
@@ -23,7 +23,7 @@ import LoadedSessionsStore from "./loaded_sessions_store";
23
23
  * Emit event when a MediaKeySession begin to be closed and another when the
24
24
  * MediaKeySession is closed.
25
25
  * @param {Object} loadedSessionsStore
26
- * @returns {Observable}
26
+ * @returns {Promise}
27
27
  */
28
28
  export default async function cleanOldLoadedSessions(
29
29
  loadedSessionsStore : LoadedSessionsStore,
@@ -479,7 +479,7 @@ export interface IStoredSessionEntry {
479
479
  * Close a MediaKeySession and just log an error if it fails (while resolving).
480
480
  * Emits then complete when done.
481
481
  * @param {MediaKeySession} mediaKeySession
482
- * @returns {Observable}
482
+ * @returns {Promise}
483
483
  */
484
484
  async function safelyCloseMediaKeySession(
485
485
  mediaKeySession : MediaKeySession | ICustomMediaKeySession
@@ -21,6 +21,9 @@ protocol-agnostic.
21
21
  This is the part of the code that interacts with `transports` to perform the
22
22
  request and parsing of the Manifest file.
23
23
 
24
+ It also regularly refreshes the Manifest, based on its attributes and other
25
+ criteria, like performances when doing that.
26
+
24
27
 
25
28
 
26
29
  ## The SegmentFetcherCreator ###################################################