rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.20220317

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 (340) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/FILES.md +5 -4
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  5. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  6. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  7. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  14. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  15. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  16. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  17. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  18. package/dist/_esm5.processed/config.d.ts +166 -1080
  19. package/dist/_esm5.processed/config.js +17 -1119
  20. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  21. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  22. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  23. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  24. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  25. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  26. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  27. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  28. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  29. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  30. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  31. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  32. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  33. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  34. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  35. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  37. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  38. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  39. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  40. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  41. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  42. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  43. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  45. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  46. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  47. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  48. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  49. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  51. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  52. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  53. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  54. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  56. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  57. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  58. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  59. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  60. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  61. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  62. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  63. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  64. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  65. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  68. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  70. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  71. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  72. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  73. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  74. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  76. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  77. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  78. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  80. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  81. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  83. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  84. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  85. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  86. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  87. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  88. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  91. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  92. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  93. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  94. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
  95. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  96. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  97. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  98. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  99. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  100. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  101. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  102. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  103. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  104. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  105. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  106. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  107. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  108. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  109. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  110. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  111. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  112. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  113. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  114. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  115. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  118. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  119. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  120. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  121. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  122. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  123. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  124. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  125. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  126. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  127. package/dist/_esm5.processed/default_config.js +1145 -0
  128. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  129. package/dist/_esm5.processed/experimental/index.js +2 -0
  130. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  131. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -1
  132. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  133. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  134. package/dist/_esm5.processed/features/features_object.js +1 -1
  135. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  136. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  137. package/dist/_esm5.processed/features/list/eme.js +5 -5
  138. package/dist/_esm5.processed/features/types.d.ts +3 -3
  139. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  140. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  141. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  142. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  143. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  144. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  145. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  146. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  147. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  148. package/dist/_esm5.processed/public_types.d.ts +2 -2
  149. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
  150. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  151. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  152. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  153. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  154. package/dist/_esm5.processed/transports/smooth/pipelines.js +68 -10
  155. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  156. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  157. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  158. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  159. package/dist/_esm5.processed/utils/reference.js +72 -24
  160. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  161. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  162. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  163. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  164. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  165. package/dist/rx-player.js +5002 -3033
  166. package/dist/rx-player.min.js +1 -1
  167. package/dummy +1 -0
  168. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  169. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  170. package/package.json +32 -34
  171. package/scripts/build/templates/experimental/index.d.ts +16 -0
  172. package/scripts/build/templates/experimental/index.js +16 -0
  173. package/sonar-project.properties +1 -1
  174. package/src/README.md +6 -6
  175. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  176. package/src/compat/browser_detection.ts +4 -2
  177. package/src/compat/eme/close_session.ts +90 -56
  178. package/src/compat/eme/custom_media_keys/index.ts +21 -38
  179. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  180. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  181. package/src/compat/eme/generate_key_request.ts +25 -33
  182. package/src/compat/eme/load_session.ts +29 -31
  183. package/src/compat/event_listeners.ts +2 -1
  184. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  185. package/src/config.ts +17 -1210
  186. package/src/core/README.md +1 -1
  187. package/src/core/abr/bandwidth_estimator.ts +4 -4
  188. package/src/core/abr/network_analyzer.ts +5 -6
  189. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  190. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  191. package/src/core/api/get_player_state.ts +1 -1
  192. package/src/core/api/index.ts +3 -0
  193. package/src/core/api/option_utils.ts +37 -20
  194. package/src/core/api/playback_observer.ts +12 -8
  195. package/src/core/api/public_api.ts +151 -111
  196. package/src/core/decrypt/README.md +22 -0
  197. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  198. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  199. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  200. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  201. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  202. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  203. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  204. package/src/core/decrypt/clear_on_stop.ts +48 -0
  205. package/src/core/decrypt/content_decryptor.ts +1158 -0
  206. package/src/core/decrypt/create_or_load_session.ts +130 -0
  207. package/src/core/decrypt/create_session.ts +175 -0
  208. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  209. package/src/core/{eme → decrypt}/find_key_system.ts +112 -122
  210. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  211. package/src/core/decrypt/get_media_keys.ts +145 -0
  212. package/src/core/{eme → decrypt}/index.ts +11 -8
  213. package/src/core/decrypt/init_media_keys.ts +51 -0
  214. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  215. package/src/core/decrypt/set_server_certificate.ts +104 -0
  216. package/src/core/{eme → decrypt}/types.ts +128 -258
  217. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  218. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  219. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  220. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  221. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  222. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  223. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  224. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  225. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  226. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  227. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  228. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  229. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  230. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  231. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  232. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  233. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
  235. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  236. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  237. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  238. package/src/core/init/get_initial_time.ts +2 -1
  239. package/src/core/init/initialize_directfile.ts +17 -20
  240. package/src/core/init/initialize_media_source.ts +42 -105
  241. package/src/core/init/link_drm_and_content.ts +176 -0
  242. package/src/core/init/manifest_update_scheduler.ts +5 -3
  243. package/src/core/init/stall_avoider.ts +6 -5
  244. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  245. package/src/core/init/types.ts +1 -39
  246. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  247. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  248. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  249. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  250. package/src/core/stream/events_generators.ts +9 -4
  251. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  252. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  253. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  254. package/src/core/stream/period/period_stream.ts +5 -2
  255. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  256. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  257. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  258. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  259. package/src/core/stream/representation/push_media_segment.ts +3 -2
  260. package/src/core/stream/representation/representation_stream.ts +30 -7
  261. package/src/core/stream/types.ts +1 -1
  262. package/src/default_config.ts +1241 -0
  263. package/src/experimental/index.ts +5 -0
  264. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  265. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
  266. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  267. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  268. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  269. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  270. package/src/features/__tests__/initialize_features.test.ts +2 -2
  271. package/src/features/features_object.ts +1 -1
  272. package/src/features/initialize_features.ts +1 -1
  273. package/src/features/list/__tests__/eme.test.ts +5 -5
  274. package/src/features/list/eme.ts +5 -5
  275. package/src/features/types.ts +3 -10
  276. package/src/manifest/manifest.ts +6 -76
  277. package/src/manifest/representation.ts +36 -3
  278. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  279. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  280. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  281. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  282. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  283. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  284. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  285. package/src/public_types.ts +5 -1
  286. package/src/transports/dash/image_pipelines.ts +3 -0
  287. package/src/transports/dash/segment_parser.ts +5 -0
  288. package/src/transports/dash/text_parser.ts +8 -0
  289. package/src/transports/local/segment_parser.ts +4 -0
  290. package/src/transports/local/text_parser.ts +8 -0
  291. package/src/transports/smooth/pipelines.ts +22 -9
  292. package/src/transports/types.ts +22 -0
  293. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  294. package/src/utils/deep_merge.ts +46 -0
  295. package/src/utils/reference.ts +116 -23
  296. package/src/utils/request/fetch.ts +1 -2
  297. package/src/utils/request/xhr.ts +2 -1
  298. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  299. package/src/utils/task_canceller.ts +6 -4
  300. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  301. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  302. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  303. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  304. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  305. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  306. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  307. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  308. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  309. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  310. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  311. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  312. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  313. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  314. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  315. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  316. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  317. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  318. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  319. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  320. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  321. package/src/core/eme/README.md +0 -26
  322. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  323. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  324. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  325. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  326. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  327. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  328. package/src/core/eme/clear_eme_session.ts +0 -62
  329. package/src/core/eme/create_session.ts +0 -187
  330. package/src/core/eme/dispose_eme.ts +0 -25
  331. package/src/core/eme/dispose_media_keys.ts +0 -46
  332. package/src/core/eme/eme_manager.ts +0 -387
  333. package/src/core/eme/get_media_keys.ts +0 -141
  334. package/src/core/eme/get_session.ts +0 -135
  335. package/src/core/eme/init_media_keys.ts +0 -106
  336. package/src/core/eme/set_server_certificate.ts +0 -115
  337. package/src/core/eme/utils/close_session.ts +0 -113
  338. package/src/core/eme/utils/init_data_store.ts +0 -234
  339. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  340. package/src/core/init/create_eme_manager.ts +0 -95
@@ -1,126 +0,0 @@
1
- /**
2
- * Copyright 2015 CANAL+ Group
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { catchError, defer as observableDefer, map, mergeMap, of as observableOf, } from "rxjs";
17
- import { loadSession, } from "../../compat";
18
- import log from "../../log";
19
- import isSessionUsable from "./utils/is_session_usable";
20
- /**
21
- * Create a new Session on the given MediaKeys, corresponding to the given
22
- * initializationData.
23
- * If session creating fails, remove the oldest MediaKeySession loaded and
24
- * retry.
25
- *
26
- * /!\ This only creates new sessions.
27
- * It will fail if loadedSessionsStore already has a MediaKeySession with
28
- * the given initializationData.
29
- * @param {Uint8Array} initData
30
- * @param {string|undefined} initDataType
31
- * @param {Object} mediaKeysInfos
32
- * @returns {Observable}
33
- */
34
- export default function createSession(stores, initializationData, wantedSessionType) {
35
- return observableDefer(function () {
36
- var loadedSessionsStore = stores.loadedSessionsStore, persistentSessionsStore = stores.persistentSessionsStore;
37
- if (wantedSessionType === "temporary") {
38
- return createTemporarySession(loadedSessionsStore, initializationData);
39
- }
40
- else if (persistentSessionsStore === null) {
41
- log.warn("EME: Cannot create persistent MediaKeySession, " +
42
- "PersistentSessionsStore not created.");
43
- return createTemporarySession(loadedSessionsStore, initializationData);
44
- }
45
- return createAndTryToRetrievePersistentSession(loadedSessionsStore, persistentSessionsStore, initializationData);
46
- });
47
- }
48
- /**
49
- * Create a new temporary MediaKeySession linked to the given initData and
50
- * initDataType.
51
- * @param {Object} loadedSessionsStore
52
- * @param {Object} initData
53
- * @returns {Observable}
54
- */
55
- function createTemporarySession(loadedSessionsStore, initData) {
56
- return observableDefer(function () {
57
- log.info("EME: Creating a new temporary session");
58
- var session = loadedSessionsStore.createSession(initData, "temporary");
59
- return observableOf({ type: "created-session",
60
- value: { mediaKeySession: session,
61
- sessionType: "temporary" } });
62
- });
63
- }
64
- /**
65
- * Create a persistent MediaKeySession and try to load on it a previous
66
- * MediaKeySession linked to the same initData and initDataType.
67
- * @param {Object} loadedSessionsStore
68
- * @param {Object} persistentSessionsStore
69
- * @param {Object} initData
70
- * @returns {Observable}
71
- */
72
- function createAndTryToRetrievePersistentSession(loadedSessionsStore, persistentSessionsStore, initData) {
73
- return observableDefer(function () {
74
- log.info("EME: Creating persistent MediaKeySession");
75
- var session = loadedSessionsStore
76
- .createSession(initData, "persistent-license");
77
- var storedEntry = persistentSessionsStore.getAndReuse(initData);
78
- if (storedEntry === null) {
79
- return observableOf({ type: "created-session",
80
- value: { mediaKeySession: session,
81
- sessionType: "persistent-license" } });
82
- }
83
- /**
84
- * Helper function to close and restart the current persistent session
85
- * considered, and re-create it from scratch.
86
- * @returns {Observable}
87
- */
88
- var recreatePersistentSession = function () {
89
- log.info("EME: Removing previous persistent session.");
90
- if (persistentSessionsStore.get(initData) !== null) {
91
- persistentSessionsStore.delete(initData);
92
- }
93
- return loadedSessionsStore.closeSession(initData)
94
- .pipe(map(function () {
95
- var newSession = loadedSessionsStore.createSession(initData, "persistent-license");
96
- return { type: "created-session",
97
- value: { mediaKeySession: newSession,
98
- sessionType: "persistent-license" } };
99
- }));
100
- };
101
- return loadSession(session, storedEntry.sessionId).pipe(mergeMap(function (hasLoadedSession) {
102
- if (!hasLoadedSession) {
103
- log.warn("EME: No data stored for the loaded session");
104
- persistentSessionsStore.delete(initData);
105
- return observableOf({ type: "created-session",
106
- value: { mediaKeySession: session,
107
- sessionType: "persistent-license" } });
108
- }
109
- if (hasLoadedSession && isSessionUsable(session)) {
110
- persistentSessionsStore.add(initData, session);
111
- log.info("EME: Succeeded to load persistent session.");
112
- return observableOf({ type: "loaded-persistent-session",
113
- value: { mediaKeySession: session,
114
- sessionType: "persistent-license" } });
115
- }
116
- // Unusable persistent session: recreate a new session from scratch.
117
- log.warn("EME: Previous persistent session not usable anymore.");
118
- return recreatePersistentSession();
119
- }), catchError(function (err) {
120
- log.warn("EME: Unable to load persistent session: " +
121
- (err instanceof Error ? err.toString() :
122
- "Unknown Error"));
123
- return recreatePersistentSession();
124
- }));
125
- });
126
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Copyright 2015 CANAL+ Group
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import noop from "../../utils/noop";
17
- import disposeMediaKeys from "./dispose_media_keys";
18
- /**
19
- * Free up all ressources taken by the EME management.
20
- */
21
- export default function disposeEME(mediaElement) {
22
- disposeMediaKeys(mediaElement).subscribe(noop);
23
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * Copyright 2015 CANAL+ Group
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { defer as observableDefer, mergeMap, of as observableOf, } from "rxjs";
17
- import { setMediaKeys } from "../../compat";
18
- import log from "../../log";
19
- import MediaKeysInfosStore from "./media_keys_infos_store";
20
- /**
21
- * @param {Object} mediaKeysInfos
22
- * @returns {Observable}
23
- */
24
- export default function disposeMediaKeys(mediaElement) {
25
- return observableDefer(function () {
26
- var currentState = MediaKeysInfosStore.getState(mediaElement);
27
- if (currentState === null) {
28
- return observableOf(null);
29
- }
30
- log.info("EME: Disposing of the current MediaKeys");
31
- var loadedSessionsStore = currentState.loadedSessionsStore;
32
- MediaKeysInfosStore.clearState(mediaElement);
33
- return loadedSessionsStore.closeAllSessions()
34
- .pipe(mergeMap(function () { return setMediaKeys(mediaElement, null); }));
35
- });
36
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * Copyright 2015 CANAL+ Group
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Observable } from "rxjs";
17
- import { IContentProtection, IEMEManagerEvent, IKeySystemOption } from "./types";
18
- /**
19
- * EME abstraction used to communicate with the Content Decryption Module (or
20
- * CDM) to be able to decrypt contents.
21
- *
22
- * The `EMEManager` can be given one or multiple key systems. It will choose the
23
- * appropriate one depending on user settings and browser support.
24
- * @param {HTMLMediaElement} mediaElement - The MediaElement which will be
25
- * associated to a MediaKeys object
26
- * @param {Array.<Object>} keySystemsConfigs - key system configuration
27
- * @param {Observable} contentProtections$ - Observable emitting external
28
- * initialization data.
29
- * @returns {Observable}
30
- */
31
- export default function EMEManager(mediaElement: HTMLMediaElement, keySystemsConfigs: IKeySystemOption[], contentProtections$: Observable<IContentProtection>): Observable<IEMEManagerEvent>;
@@ -1,278 +0,0 @@
1
- /**
2
- * Copyright 2015 CANAL+ Group
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { catchError, concat as observableConcat, EMPTY, filter, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, ReplaySubject, shareReplay, take, tap, throwError, } from "rxjs";
17
- import { events, generateKeyRequest, getInitData, } from "../../compat/";
18
- import config from "../../config";
19
- import { EncryptedMediaError } from "../../errors";
20
- import log from "../../log";
21
- import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
22
- import arrayIncludes from "../../utils/array_includes";
23
- import assertUnreachable from "../../utils/assert_unreachable";
24
- import { concat } from "../../utils/byte_parsing";
25
- import filterMap from "../../utils/filter_map";
26
- import isNullOrUndefined from "../../utils/is_null_or_undefined";
27
- import cleanOldStoredPersistentInfo from "./clean_old_stored_persistent_info";
28
- import getSession from "./get_session";
29
- import initMediaKeys from "./init_media_keys";
30
- import SessionEventsListener, { BlacklistedSessionError, } from "./session_events_listener";
31
- import setServerCertificate from "./set_server_certificate";
32
- import InitDataStore from "./utils/init_data_store";
33
- var EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS = config.EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION = config.EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION;
34
- var onEncrypted$ = events.onEncrypted$;
35
- /**
36
- * EME abstraction used to communicate with the Content Decryption Module (or
37
- * CDM) to be able to decrypt contents.
38
- *
39
- * The `EMEManager` can be given one or multiple key systems. It will choose the
40
- * appropriate one depending on user settings and browser support.
41
- * @param {HTMLMediaElement} mediaElement - The MediaElement which will be
42
- * associated to a MediaKeys object
43
- * @param {Array.<Object>} keySystemsConfigs - key system configuration
44
- * @param {Observable} contentProtections$ - Observable emitting external
45
- * initialization data.
46
- * @returns {Observable}
47
- */
48
- export default function EMEManager(mediaElement, keySystemsConfigs, contentProtections$) {
49
- log.debug("EME: Starting EMEManager logic.");
50
- /**
51
- * Keep track of all decryption keys handled by this instance of the
52
- * `EMEManager`.
53
- * This allows to avoid creating multiple MediaKeySessions handling the same
54
- * decryption keys.
55
- */
56
- var contentSessions = new InitDataStore();
57
- /**
58
- * Keep track of which initialization data have been blacklisted in the
59
- * current instance of the `EMEManager`.
60
- * If the same initialization data is encountered again, we can directly emit
61
- * the same `BlacklistedSessionError`.
62
- */
63
- var blacklistedInitData = new InitDataStore();
64
- /** Emit the MediaKeys instance and its related information when ready. */
65
- var mediaKeysInit$ = initMediaKeys(mediaElement, keySystemsConfigs)
66
- .pipe(mergeMap(function (mediaKeysEvt) {
67
- if (mediaKeysEvt.type !== "attached-media-keys") {
68
- return observableOf(mediaKeysEvt);
69
- }
70
- var _a = mediaKeysEvt.value, mediaKeys = _a.mediaKeys, options = _a.options;
71
- var serverCertificate = options.serverCertificate;
72
- if (isNullOrUndefined(serverCertificate)) {
73
- return observableOf(mediaKeysEvt);
74
- }
75
- return observableConcat(setServerCertificate(mediaKeys, serverCertificate), observableOf(mediaKeysEvt));
76
- }), shareReplay()); // Share side-effects and cache success
77
- /** Emit when the MediaKeys instance has been attached the HTMLMediaElement. */
78
- var attachedMediaKeys$ = mediaKeysInit$.pipe(filter(function (evt) {
79
- return evt.type === "attached-media-keys";
80
- }), take(1));
81
- /** Parsed `encrypted` events coming from the HTMLMediaElement. */
82
- var mediaEncryptedEvents$ = onEncrypted$(mediaElement).pipe(tap(function () {
83
- log.debug("EME: Encrypted event received from media element.");
84
- }), filterMap(function (evt) { return getInitData(evt); }, null), shareReplay({ refCount: true })); // multiple Observables listen to that one
85
- // as soon as the EMEManager is subscribed
86
- /** Encryption events coming from the `contentProtections$` argument. */
87
- var externalEvents$ = contentProtections$.pipe(tap(function () { log.debug("EME: Encrypted event received from Player"); }));
88
- /** Emit events signaling that an encryption initialization data is encountered. */
89
- var initializationData$ = observableMerge(externalEvents$, mediaEncryptedEvents$);
90
- /** Create MediaKeySessions and handle the corresponding events. */
91
- var bindSession$ = initializationData$.pipe(
92
- // Add attached MediaKeys info once available
93
- mergeMap(function (initializationData) { return attachedMediaKeys$.pipe(map(function (mediaKeysEvt) {
94
- return [initializationData, mediaKeysEvt];
95
- })); }),
96
- /* Attach server certificate and create/reuse MediaKeySession */
97
- mergeMap(function (_a) {
98
- var initializationData = _a[0], mediaKeysEvent = _a[1];
99
- var _b = mediaKeysEvent.value, mediaKeySystemAccess = _b.mediaKeySystemAccess, stores = _b.stores, options = _b.options;
100
- var blacklistError = blacklistedInitData.get(initializationData);
101
- if (blacklistError !== undefined) {
102
- if (initializationData.type === undefined) {
103
- log.error("EME: The current session has already been blacklisted " +
104
- "but the current content is not known. Throwing.");
105
- var sessionError_1 = blacklistError.sessionError;
106
- sessionError_1.fatal = true;
107
- return throwError(function () { return sessionError_1; });
108
- }
109
- log.warn("EME: The current session has already been blacklisted. " +
110
- "Blacklisting content.");
111
- return observableOf({ type: "blacklist-protection-data",
112
- value: initializationData });
113
- }
114
- var lastKeyUpdate$ = new ReplaySubject(1);
115
- // First, check that this initialization data is not already handled
116
- if (options.singleLicensePer === "content" && !contentSessions.isEmpty()) {
117
- var keyIds_1 = initializationData.keyIds;
118
- if (keyIds_1 === undefined) {
119
- log.warn("EME: Initialization data linked to unknown key id, we'll " +
120
- "not able to fallback from it.");
121
- return observableOf({ type: "init-data-ignored",
122
- value: { initializationData: initializationData } });
123
- }
124
- var firstSession_1 = contentSessions.getAll()[0];
125
- return firstSession_1.lastKeyUpdate$.pipe(mergeMap(function (evt) {
126
- var hasAllNeededKeyIds = keyIds_1.every(function (keyId) {
127
- for (var i = 0; i < evt.whitelistedKeyIds.length; i++) {
128
- if (areArraysOfNumbersEqual(evt.whitelistedKeyIds[i], keyId)) {
129
- return true;
130
- }
131
- }
132
- });
133
- if (!hasAllNeededKeyIds) {
134
- // Not all keys are available in the current session, blacklist those
135
- return observableOf({ type: "keys-update",
136
- value: { blacklistedKeyIDs: keyIds_1,
137
- whitelistedKeyIds: [] } });
138
- }
139
- // Already handled by the current session.
140
- // Move corresponding session on top of the cache if it exists
141
- var loadedSessionsStore = mediaKeysEvent.value.stores.loadedSessionsStore;
142
- loadedSessionsStore.reuse(firstSession_1.initializationData);
143
- return observableOf({ type: "init-data-ignored",
144
- value: { initializationData: initializationData } });
145
- }));
146
- }
147
- else if (!contentSessions.storeIfNone(initializationData, { initializationData: initializationData, lastKeyUpdate$: lastKeyUpdate$ })) {
148
- log.debug("EME: Init data already received. Skipping it.");
149
- return observableOf({ type: "init-data-ignored",
150
- value: { initializationData: initializationData } });
151
- }
152
- var wantedSessionType;
153
- if (options.persistentLicense !== true) {
154
- wantedSessionType = "temporary";
155
- }
156
- else if (!canCreatePersistentSession(mediaKeySystemAccess)) {
157
- log.warn("EME: Cannot create \"persistent-license\" session: not supported");
158
- wantedSessionType = "temporary";
159
- }
160
- else {
161
- wantedSessionType = "persistent-license";
162
- }
163
- var maxSessionCacheSize = typeof options.maxSessionCacheSize === "number" ?
164
- options.maxSessionCacheSize :
165
- EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS;
166
- return getSession(initializationData, stores, wantedSessionType, maxSessionCacheSize)
167
- .pipe(mergeMap(function (sessionEvt) {
168
- switch (sessionEvt.type) {
169
- case "cleaning-old-session":
170
- contentSessions.remove(sessionEvt.value.initializationData);
171
- return EMPTY;
172
- case "cleaned-old-session":
173
- return EMPTY;
174
- case "created-session":
175
- case "loaded-open-session":
176
- case "loaded-persistent-session":
177
- // Do nothing, just to check every possibility is taken
178
- break;
179
- default: // Use TypeScript to check if all possibilities have been checked
180
- assertUnreachable(sessionEvt);
181
- }
182
- var _a = sessionEvt.value, mediaKeySession = _a.mediaKeySession, sessionType = _a.sessionType;
183
- /**
184
- * We only store persistent sessions once its keys are known.
185
- * This boolean allows to know if this session has already been
186
- * persisted or not.
187
- */
188
- var isSessionPersisted = false;
189
- // `generateKeyRequest` awaits a single Uint8Array containing all
190
- // initialization data.
191
- var concatInitData = concat.apply(void 0, initializationData.values.map(function (i) { return i.data; }));
192
- var generateRequest$ = sessionEvt.type !== "created-session" ?
193
- EMPTY :
194
- generateKeyRequest(mediaKeySession, initializationData.type, concatInitData).pipe(catchError(function (error) {
195
- throw new EncryptedMediaError("KEY_GENERATE_REQUEST_ERROR", error instanceof Error ? error.toString() :
196
- "Unknown error");
197
- }), ignoreElements());
198
- return observableMerge(SessionEventsListener(mediaKeySession, options, mediaKeySystemAccess.keySystem, initializationData), generateRequest$)
199
- .pipe(map(function (evt) {
200
- var _a;
201
- if (evt.type !== "keys-update") {
202
- return evt;
203
- }
204
- // We want to add the current key ids in the blacklist if it is
205
- // not already there.
206
- //
207
- // We only do that when `singleLicensePer` is set to something
208
- // else than the default `"init-data"` because this logic:
209
- // 1. might result in a quality fallback, which is a v3.x.x
210
- // breaking change if some APIs (like `singleLicensePer`)
211
- // aren't used.
212
- // 2. Rely on the EME spec regarding key statuses being well
213
- // implemented on all supported devices, which we're not
214
- // sure yet. Because in any other `singleLicensePer`, we
215
- // need a good implementation anyway, it doesn't matter
216
- // there.
217
- var expectedKeyIds = initializationData.keyIds;
218
- if (expectedKeyIds !== undefined &&
219
- options.singleLicensePer !== "init-data") {
220
- var missingKeyIds = expectedKeyIds.filter(function (expected) {
221
- return (!evt.value.whitelistedKeyIds.some(function (whitelisted) {
222
- return areArraysOfNumbersEqual(whitelisted, expected);
223
- }) &&
224
- !evt.value.blacklistedKeyIDs.some(function (blacklisted) {
225
- return areArraysOfNumbersEqual(blacklisted, expected);
226
- }));
227
- });
228
- if (missingKeyIds.length > 0) {
229
- (_a = evt.value.blacklistedKeyIDs).push.apply(_a, missingKeyIds);
230
- }
231
- }
232
- lastKeyUpdate$.next(evt.value);
233
- if ((evt.value.whitelistedKeyIds.length === 0 &&
234
- evt.value.blacklistedKeyIDs.length === 0) ||
235
- sessionType === "temporary" ||
236
- stores.persistentSessionsStore === null ||
237
- isSessionPersisted) {
238
- return evt;
239
- }
240
- var persistentSessionsStore = stores.persistentSessionsStore;
241
- cleanOldStoredPersistentInfo(persistentSessionsStore, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION - 1);
242
- persistentSessionsStore.add(initializationData, mediaKeySession);
243
- isSessionPersisted = true;
244
- return evt;
245
- }), catchError(function (err) {
246
- if (!(err instanceof BlacklistedSessionError)) {
247
- throw err;
248
- }
249
- blacklistedInitData.store(initializationData, err);
250
- var sessionError = err.sessionError;
251
- if (initializationData.type === undefined) {
252
- log.error("EME: Current session blacklisted and content not known. " +
253
- "Throwing.");
254
- sessionError.fatal = true;
255
- throw sessionError;
256
- }
257
- log.warn("EME: Current session blacklisted. Blacklisting content.");
258
- return observableOf({ type: "warning",
259
- value: sessionError }, { type: "blacklist-protection-data",
260
- value: initializationData });
261
- }));
262
- }));
263
- }));
264
- return observableMerge(mediaKeysInit$, mediaEncryptedEvents$
265
- .pipe(map(function (evt) { return ({ type: "encrypted-event-received",
266
- value: evt }); })), bindSession$);
267
- }
268
- /**
269
- * Returns `true` if the given MediaKeySystemAccess can create
270
- * "persistent-license" MediaKeySessions.
271
- * @param {MediaKeySystemAccess} mediaKeySystemAccess
272
- * @returns {Boolean}
273
- */
274
- function canCreatePersistentSession(mediaKeySystemAccess) {
275
- var sessionTypes = mediaKeySystemAccess.getConfiguration().sessionTypes;
276
- return sessionTypes !== undefined &&
277
- arrayIncludes(sessionTypes, "persistent-license");
278
- }