rx-player 4.5.0-dev.2026033100 → 4.5.0-dev.2026041501

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 (251) hide show
  1. package/CHANGELOG.md +22 -5
  2. package/VERSION +1 -1
  3. package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  4. package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
  5. package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  6. package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
  7. package/dist/commonjs/compat/can_patch_out_pssh.d.ts +42 -0
  8. package/dist/commonjs/compat/can_patch_out_pssh.d.ts.map +1 -0
  9. package/dist/commonjs/compat/can_patch_out_pssh.js +53 -0
  10. package/dist/commonjs/compat/env_detector.d.ts +2 -0
  11. package/dist/commonjs/compat/env_detector.d.ts.map +1 -1
  12. package/dist/commonjs/compat/env_detector.js +5 -0
  13. package/dist/commonjs/core/adaptive/network_analyzer.d.ts +1 -2
  14. package/dist/commonjs/core/adaptive/network_analyzer.d.ts.map +1 -1
  15. package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
  16. package/dist/commonjs/core/adaptive/utils/representation_score_calculator.js +2 -2
  17. package/dist/commonjs/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
  18. package/dist/commonjs/core/cmcd/cmcd_data_builder.js +9 -3
  19. package/dist/commonjs/core/entry/content_preparer.d.ts.map +1 -1
  20. package/dist/commonjs/core/entry/content_preparer.js +5 -7
  21. package/dist/commonjs/core/entry/core_entry.d.ts.map +1 -1
  22. package/dist/commonjs/core/entry/core_entry.js +6 -2
  23. package/dist/commonjs/core/entry/core_text_displayer_interface.js +3 -3
  24. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts.map +1 -1
  25. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +12 -0
  26. package/dist/commonjs/core/fetchers/thumbnails/thumbnail_fetcher.js +1 -1
  27. package/dist/commonjs/core/fetchers/utils/schedule_request.d.ts.map +1 -1
  28. package/dist/commonjs/core/fetchers/utils/schedule_request.js +4 -3
  29. package/dist/commonjs/core/segment_sinks/garbage_collector.d.ts +0 -2
  30. package/dist/commonjs/core/segment_sinks/garbage_collector.d.ts.map +1 -1
  31. package/dist/commonjs/core/segment_sinks/garbage_collector.js +0 -3
  32. package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.d.ts +1 -1
  33. package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.d.ts.map +1 -1
  34. package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.js +2 -2
  35. package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  36. package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +6 -6
  37. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  38. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +37 -40
  39. package/dist/commonjs/default_config.d.ts +5 -0
  40. package/dist/commonjs/default_config.d.ts.map +1 -1
  41. package/dist/commonjs/default_config.js +5 -0
  42. package/dist/commonjs/main_thread/api/public_api.d.ts.map +1 -1
  43. package/dist/commonjs/main_thread/api/public_api.js +23 -16
  44. package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  45. package/dist/commonjs/main_thread/decrypt/content_decryptor.js +4 -1
  46. package/dist/commonjs/main_thread/decrypt/session_events_listener.js +1 -1
  47. package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts +2 -0
  48. package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
  49. package/dist/commonjs/main_thread/decrypt/set_server_certificate.js +4 -0
  50. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts +0 -8
  51. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  52. package/dist/commonjs/main_thread/init/media_source_content_initializer.js +58 -50
  53. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +35 -5
  54. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
  55. package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +60 -19
  56. package/dist/commonjs/main_thread/render_thumbnail.d.ts.map +1 -1
  57. package/dist/commonjs/main_thread/render_thumbnail.js +4 -0
  58. package/dist/commonjs/main_thread/tracks_store/media_element_tracks_store.d.ts.map +1 -1
  59. package/dist/commonjs/main_thread/tracks_store/media_element_tracks_store.js +1 -0
  60. package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts +1 -1
  61. package/dist/commonjs/main_thread/tracks_store/tracks_store.js +1 -1
  62. package/dist/{es2017/parsers/containers/isobmff/take_pssh_out.d.ts → commonjs/parsers/containers/isobmff/extract_pssh.d.ts} +6 -4
  63. package/dist/commonjs/parsers/containers/isobmff/extract_pssh.d.ts.map +1 -0
  64. package/dist/commonjs/parsers/containers/isobmff/{take_pssh_out.js → extract_pssh.js} +22 -17
  65. package/dist/commonjs/parsers/containers/isobmff/index.d.ts +2 -2
  66. package/dist/commonjs/parsers/containers/isobmff/index.d.ts.map +1 -1
  67. package/dist/commonjs/parsers/containers/isobmff/index.js +4 -4
  68. package/dist/commonjs/playback_observer/core_playback_observer.d.ts +4 -4
  69. package/dist/commonjs/playback_observer/core_playback_observer.d.ts.map +1 -1
  70. package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts +1 -2
  71. package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts.map +1 -1
  72. package/dist/commonjs/transports/dash/segment_parser.js +1 -1
  73. package/dist/commonjs/transports/local/segment_parser.js +1 -1
  74. package/dist/commonjs/utils/test-utils.d.ts +30 -0
  75. package/dist/commonjs/utils/test-utils.d.ts.map +1 -0
  76. package/dist/commonjs/utils/test-utils.js +79 -0
  77. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  78. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
  79. package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  80. package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
  81. package/dist/es2017/compat/can_patch_out_pssh.d.ts +42 -0
  82. package/dist/es2017/compat/can_patch_out_pssh.d.ts.map +1 -0
  83. package/dist/es2017/compat/can_patch_out_pssh.js +50 -0
  84. package/dist/es2017/compat/env_detector.d.ts +2 -0
  85. package/dist/es2017/compat/env_detector.d.ts.map +1 -1
  86. package/dist/es2017/compat/env_detector.js +5 -0
  87. package/dist/es2017/core/adaptive/network_analyzer.d.ts +1 -2
  88. package/dist/es2017/core/adaptive/network_analyzer.d.ts.map +1 -1
  89. package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
  90. package/dist/es2017/core/adaptive/utils/representation_score_calculator.js +2 -2
  91. package/dist/es2017/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
  92. package/dist/es2017/core/cmcd/cmcd_data_builder.js +9 -3
  93. package/dist/es2017/core/entry/content_preparer.d.ts.map +1 -1
  94. package/dist/es2017/core/entry/content_preparer.js +3 -5
  95. package/dist/es2017/core/entry/core_entry.d.ts.map +1 -1
  96. package/dist/es2017/core/entry/core_entry.js +6 -2
  97. package/dist/es2017/core/entry/core_text_displayer_interface.js +3 -3
  98. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts.map +1 -1
  99. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +12 -0
  100. package/dist/es2017/core/fetchers/thumbnails/thumbnail_fetcher.js +1 -1
  101. package/dist/es2017/core/fetchers/utils/schedule_request.d.ts.map +1 -1
  102. package/dist/es2017/core/fetchers/utils/schedule_request.js +2 -3
  103. package/dist/es2017/core/segment_sinks/garbage_collector.d.ts +0 -2
  104. package/dist/es2017/core/segment_sinks/garbage_collector.d.ts.map +1 -1
  105. package/dist/es2017/core/segment_sinks/garbage_collector.js +0 -3
  106. package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.d.ts +1 -1
  107. package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.d.ts.map +1 -1
  108. package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.js +2 -2
  109. package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  110. package/dist/es2017/core/stream/adaptation/adaptation_stream.js +6 -6
  111. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  112. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +40 -39
  113. package/dist/es2017/default_config.d.ts +5 -0
  114. package/dist/es2017/default_config.d.ts.map +1 -1
  115. package/dist/es2017/default_config.js +5 -0
  116. package/dist/es2017/main_thread/api/public_api.d.ts.map +1 -1
  117. package/dist/es2017/main_thread/api/public_api.js +20 -13
  118. package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  119. package/dist/es2017/main_thread/decrypt/content_decryptor.js +4 -1
  120. package/dist/es2017/main_thread/decrypt/session_events_listener.js +1 -1
  121. package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts +2 -0
  122. package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
  123. package/dist/es2017/main_thread/decrypt/set_server_certificate.js +4 -0
  124. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts +0 -8
  125. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  126. package/dist/es2017/main_thread/init/media_source_content_initializer.js +58 -50
  127. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +35 -5
  128. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
  129. package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +60 -19
  130. package/dist/es2017/main_thread/render_thumbnail.d.ts.map +1 -1
  131. package/dist/es2017/main_thread/render_thumbnail.js +4 -0
  132. package/dist/es2017/main_thread/tracks_store/media_element_tracks_store.d.ts.map +1 -1
  133. package/dist/es2017/main_thread/tracks_store/media_element_tracks_store.js +1 -0
  134. package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts +1 -1
  135. package/dist/es2017/main_thread/tracks_store/tracks_store.js +1 -1
  136. package/dist/{commonjs/parsers/containers/isobmff/take_pssh_out.d.ts → es2017/parsers/containers/isobmff/extract_pssh.d.ts} +6 -4
  137. package/dist/es2017/parsers/containers/isobmff/extract_pssh.d.ts.map +1 -0
  138. package/dist/es2017/parsers/containers/isobmff/{take_pssh_out.js → extract_pssh.js} +21 -16
  139. package/dist/es2017/parsers/containers/isobmff/index.d.ts +2 -2
  140. package/dist/es2017/parsers/containers/isobmff/index.d.ts.map +1 -1
  141. package/dist/es2017/parsers/containers/isobmff/index.js +2 -2
  142. package/dist/es2017/playback_observer/core_playback_observer.d.ts +4 -4
  143. package/dist/es2017/playback_observer/core_playback_observer.d.ts.map +1 -1
  144. package/dist/es2017/playback_observer/media_element_playback_observer.d.ts +1 -2
  145. package/dist/es2017/playback_observer/media_element_playback_observer.d.ts.map +1 -1
  146. package/dist/es2017/transports/dash/segment_parser.js +2 -2
  147. package/dist/es2017/transports/local/segment_parser.js +2 -2
  148. package/dist/es2017/utils/test-utils.d.ts +30 -0
  149. package/dist/es2017/utils/test-utils.d.ts.map +1 -0
  150. package/dist/es2017/utils/test-utils.js +36 -0
  151. package/dist/mpd-parser.wasm +0 -0
  152. package/dist/worker.js +6 -6
  153. package/package.json +4 -2
  154. package/src/README.md +7 -7
  155. package/src/__GENERATED_CODE/embedded_dash_wasm.ts +1 -1
  156. package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
  157. package/src/compat/__tests__/can_patch_out_pssh.test.ts +40 -0
  158. package/src/compat/can_patch_out_pssh.ts +53 -0
  159. package/src/compat/env_detector.ts +4 -0
  160. package/src/core/README.md +1 -1
  161. package/src/core/adaptive/README.md +3 -3
  162. package/src/core/adaptive/__tests__/adaptive_representation_selector.test.ts +181 -110
  163. package/src/core/adaptive/__tests__/guess_based_chooser.test.ts +229 -123
  164. package/src/core/adaptive/__tests__/mocks.ts +100 -0
  165. package/src/core/adaptive/__tests__/network_analyzer.test.ts +152 -59
  166. package/src/core/adaptive/network_analyzer.ts +4 -4
  167. package/src/core/adaptive/utils/__tests__/filter_by_bitrate.test.ts +11 -19
  168. package/src/core/adaptive/utils/__tests__/filter_by_resolution.test.ts +12 -12
  169. package/src/core/adaptive/utils/__tests__/last_estimate_storage.test.ts +25 -12
  170. package/src/core/adaptive/utils/__tests__/pending_requests_store.test.ts +13 -9
  171. package/src/core/adaptive/utils/__tests__/representation_score_calculator.test.ts +11 -11
  172. package/src/core/adaptive/utils/__tests__/select_optimal_representation.test.ts +13 -23
  173. package/src/core/adaptive/utils/representation_score_calculator.ts +2 -2
  174. package/src/core/cmcd/__tests__/cmcd_data_builder.test.ts +60 -15
  175. package/src/core/cmcd/cmcd_data_builder.ts +9 -3
  176. package/src/core/entry/README.md +2 -2
  177. package/src/core/entry/__tests__/core_text_displayer_interface.test.ts +20 -0
  178. package/src/core/entry/content_preparer.ts +2 -5
  179. package/src/core/entry/core_entry.ts +6 -2
  180. package/src/core/entry/core_text_displayer_interface.ts +3 -3
  181. package/src/core/fetchers/manifest/__tests__/manifest_fetcher.test.ts +52 -3
  182. package/src/core/fetchers/manifest/manifest_fetcher.ts +12 -0
  183. package/src/core/fetchers/thumbnails/__tests__/thumbnail_fetcher.test.ts +70 -0
  184. package/src/core/fetchers/thumbnails/thumbnail_fetcher.ts +1 -1
  185. package/src/core/fetchers/utils/schedule_request.ts +5 -3
  186. package/src/core/segment_sinks/__tests__/garbage_collector.test.ts +434 -0
  187. package/src/core/segment_sinks/__tests__/mocks.ts +49 -0
  188. package/src/core/segment_sinks/garbage_collector.ts +0 -3
  189. package/src/core/segment_sinks/implementations/text/__tests__/text_segment_sink.test.ts +177 -0
  190. package/src/core/segment_sinks/implementations/text/text_segment_sink.ts +2 -2
  191. package/src/core/segment_sinks/inventory/__tests__/buffered_history.test.ts +215 -0
  192. package/src/core/segment_sinks/inventory/__tests__/segment_inventory.test.ts +448 -0
  193. package/src/core/stream/adaptation/__tests__/adaptation_stream.test.ts +973 -0
  194. package/src/core/stream/adaptation/__tests__/get_representations_switch_strategy.test.ts +283 -374
  195. package/src/core/stream/adaptation/adaptation_stream.ts +6 -8
  196. package/src/core/stream/orchestrator/README.md +4 -4
  197. package/src/core/stream/orchestrator/__tests__/stream_orchestrator.test.ts +707 -0
  198. package/src/core/stream/orchestrator/stream_orchestrator.ts +41 -46
  199. package/src/core/stream/period/utils/__tests__/get_adaptation_switch_strategy.test.ts +290 -220
  200. package/src/core/stream/representation/__tests__/encryption_data_notifier.test.ts +93 -63
  201. package/src/core/stream/representation/utils/__tests__/append_segment_to_buffer.test.ts +106 -63
  202. package/src/core/stream/representation/utils/__tests__/check_for_discontinuity.test.ts +179 -204
  203. package/src/core/stream/representation/utils/__tests__/get_segment_priority.test.ts +7 -7
  204. package/src/core/stream/representation/utils/__tests__/push_init_segment.test.ts +103 -60
  205. package/src/core/stream/representation/utils/__tests__/push_media_segment.test.ts +231 -165
  206. package/src/default_config.ts +6 -0
  207. package/src/experimental/README.md +1 -1
  208. package/src/features/README.md +3 -3
  209. package/src/main_thread/api/README.md +6 -7
  210. package/src/main_thread/api/public_api.ts +16 -10
  211. package/src/main_thread/decrypt/README.md +4 -4
  212. package/src/main_thread/decrypt/__tests__/__global__/content_decryptor.test.ts +135 -0
  213. package/src/main_thread/decrypt/__tests__/__global__/get_license.test.ts +70 -0
  214. package/src/main_thread/decrypt/__tests__/__global__/server_certificate.test.ts +44 -0
  215. package/src/main_thread/decrypt/__tests__/__global__/utils.ts +2 -2
  216. package/src/main_thread/decrypt/content_decryptor.ts +6 -1
  217. package/src/main_thread/decrypt/session_events_listener.ts +1 -1
  218. package/src/main_thread/decrypt/set_server_certificate.ts +5 -0
  219. package/src/main_thread/init/media_source_content_initializer.ts +69 -55
  220. package/src/main_thread/init/utils/__tests__/stream_events_emitter.test.ts +175 -0
  221. package/src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts +90 -26
  222. package/src/main_thread/render_thumbnail.ts +4 -0
  223. package/src/main_thread/tracks_store/README.md +12 -0
  224. package/src/main_thread/tracks_store/__tests__/media_element_tracks_store.test.ts +25 -18
  225. package/src/main_thread/tracks_store/media_element_tracks_store.ts +1 -0
  226. package/src/main_thread/tracks_store/tracks_store.ts +1 -1
  227. package/src/manifest/classes/__tests__/mocks.ts +202 -0
  228. package/src/parsers/containers/isobmff/__tests__/extract_pssh.test.ts +199 -0
  229. package/src/parsers/containers/isobmff/{take_pssh_out.ts → extract_pssh.ts} +21 -17
  230. package/src/parsers/containers/isobmff/index.ts +2 -2
  231. package/src/parsers/manifest/dash/wasm-parser/README.md +9 -9
  232. package/src/playback_observer/__tests__/mocks.ts +152 -0
  233. package/src/playback_observer/core_playback_observer.ts +4 -4
  234. package/src/playback_observer/media_element_playback_observer.ts +1 -1
  235. package/src/tools/README.md +2 -2
  236. package/src/transports/README.md +5 -5
  237. package/src/transports/dash/segment_parser.ts +2 -2
  238. package/src/transports/local/segment_parser.ts +2 -2
  239. package/src/transports/metaplaylist/README.md +4 -4
  240. package/src/utils/README.md +3 -3
  241. package/src/utils/test-utils.ts +50 -0
  242. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts +0 -11
  243. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts.map +0 -1
  244. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.js +0 -20
  245. package/dist/commonjs/parsers/containers/isobmff/take_pssh_out.d.ts.map +0 -1
  246. package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts +0 -11
  247. package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts.map +0 -1
  248. package/dist/es2017/core/entry/synchronize_sinks_on_observation.js +0 -17
  249. package/dist/es2017/parsers/containers/isobmff/take_pssh_out.d.ts.map +0 -1
  250. package/src/core/adaptive/utils/__tests__/bandwith_estimator.test.ts +0 -117
  251. package/src/core/entry/synchronize_sinks_on_observation.ts +0 -22
@@ -1,55 +1,70 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
- import type { IBufferedChunk } from "../../../../segment_sinks";
2
+ import {
3
+ type Adaptation,
4
+ type Period,
5
+ type Representation,
6
+ } from "../../../../../manifest/classes";
7
+ import type Manifest from "../../../../../manifest/classes";
8
+ import {
9
+ DummyPeriod,
10
+ DummyManifest,
11
+ DummyAdaptation,
12
+ createSegment,
13
+ DummyRepresentation,
14
+ } from "../../../../../manifest/classes/__tests__/mocks";
15
+ import { ChunkStatus, type IBufferedChunk } from "../../../../segment_sinks";
3
16
  import checkForDiscontinuity from "../check_for_discontinuity";
4
17
 
5
- /* eslint-disable @typescript-eslint/no-explicit-any */
6
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
7
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
8
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
9
-
10
- // Minimal type setup for tests
11
- interface TestContent {
12
- adaptation: { type: string };
13
- manifest: any;
14
- period: { end?: number };
15
- representation: {
16
- index: {
17
- checkDiscontinuity: (time: number) => number | null;
18
- awaitSegmentBetween: (start: number, end: number) => boolean | undefined;
19
- };
20
- };
21
- }
22
-
23
18
  describe("checkForDiscontinuity", () => {
24
- const createMockContent = (overrides?: Partial<TestContent>): any => ({
25
- adaptation: { type: "video" },
26
- manifest: {},
27
- period: {},
28
- representation: {
29
- index: {
30
- checkDiscontinuity: vi.fn(() => null),
31
- awaitSegmentBetween: vi.fn(() => undefined),
32
- },
33
- },
34
- ...overrides,
19
+ const createMockContent = (): {
20
+ adaptation: Adaptation;
21
+ manifest: Manifest;
22
+ period: Period;
23
+ representation: Representation;
24
+ } => ({
25
+ adaptation: new DummyAdaptation({ type: "video" }),
26
+ manifest: new DummyManifest(),
27
+ period: new DummyPeriod(),
28
+ representation: new DummyRepresentation(),
35
29
  });
36
30
 
37
- const createBufferedChunk = (
38
- start: number,
39
- end: number,
40
- segmentTime: number,
41
- segmentEnd: number,
42
- ): IBufferedChunk =>
43
- ({
44
- bufferedStart: start,
45
- bufferedEnd: end,
31
+ function makeBufferedChunk({
32
+ start,
33
+ end,
34
+ bufferedStart = start,
35
+ bufferedEnd = end,
36
+ segmentTime,
37
+ segmentEnd,
38
+ }: {
39
+ start: number;
40
+ end: number;
41
+ bufferedStart?: number | undefined;
42
+ bufferedEnd?: number | undefined;
43
+ segmentTime: number;
44
+ segmentEnd: number;
45
+ }): IBufferedChunk {
46
+ return {
46
47
  infos: {
47
- segment: {
48
+ period: new DummyPeriod(),
49
+ adaptation: new DummyAdaptation(),
50
+ representation: new DummyRepresentation(),
51
+ segment: createSegment({
48
52
  time: segmentTime,
49
53
  end: segmentEnd,
50
- },
54
+ }),
51
55
  },
52
- }) as IBufferedChunk;
56
+ bufferedStart,
57
+ bufferedEnd,
58
+ start,
59
+ end,
60
+ insertionTs: 0,
61
+ chunkSize: 1024,
62
+ precizeStart: true,
63
+ precizeEnd: true,
64
+ status: ChunkStatus.FullyLoaded,
65
+ splitted: false,
66
+ };
67
+ }
53
68
 
54
69
  describe("when no segments are buffered in range", () => {
55
70
  it("should return null when nextSegmentStart is provided", () => {
@@ -61,14 +76,12 @@ describe("checkForDiscontinuity", () => {
61
76
  false,
62
77
  [],
63
78
  );
64
-
65
79
  expect(result).toBeNull();
66
80
  });
67
81
 
68
82
  it("should return discontinuity to period end when finished loading and at period end", () => {
69
- const content = createMockContent({
70
- period: { end: 100 },
71
- });
83
+ const content = createMockContent();
84
+ content.period.end = 100;
72
85
  const result = checkForDiscontinuity(
73
86
  content,
74
87
  { start: 90, end: 105 },
@@ -76,20 +89,17 @@ describe("checkForDiscontinuity", () => {
76
89
  true, // hasFinishedLoading
77
90
  [],
78
91
  );
79
-
80
92
  expect(result).toEqual({ start: undefined, end: null });
81
93
  });
82
94
 
83
95
  it("should return manifest discontinuity when no next segment", () => {
84
- const content = createMockContent({
85
- representation: {
86
- index: {
87
- checkDiscontinuity: vi.fn(() => 25),
88
- awaitSegmentBetween: vi.fn(() => false),
89
- },
90
- },
91
- });
92
-
96
+ const content = createMockContent();
97
+ const mockCheckDiscontinuity = vi
98
+ .spyOn(content.representation.index, "checkDiscontinuity")
99
+ .mockReturnValue(25);
100
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
101
+ false,
102
+ );
93
103
  const result = checkForDiscontinuity(
94
104
  content,
95
105
  { start: 10, end: 30 },
@@ -97,22 +107,17 @@ describe("checkForDiscontinuity", () => {
97
107
  false,
98
108
  [],
99
109
  );
100
-
101
110
  expect(result).toEqual({ start: undefined, end: 25 });
102
- expect(content.representation.index.checkDiscontinuity).toHaveBeenCalledWith(10);
111
+ expect(mockCheckDiscontinuity).toHaveBeenCalledWith(10);
103
112
  });
104
113
 
105
114
  it("should return discontinuity to Period's end when has finished loading without segment and range after Period's end", () => {
106
- const content = createMockContent({
107
- period: { end: 29 },
108
- representation: {
109
- index: {
110
- checkDiscontinuity: vi.fn(() => null),
111
- awaitSegmentBetween: vi.fn(() => false),
112
- },
113
- },
114
- });
115
-
115
+ const content = createMockContent();
116
+ content.period.end = 29;
117
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
118
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
119
+ false,
120
+ );
116
121
  const result = checkForDiscontinuity(
117
122
  content,
118
123
  { start: 10, end: 30 },
@@ -120,21 +125,16 @@ describe("checkForDiscontinuity", () => {
120
125
  true, // hasFinishedLoading
121
126
  [],
122
127
  );
123
-
124
128
  expect(result).toEqual({ start: undefined, end: null });
125
129
  });
126
130
 
127
131
  it("should return discontinuity to Period's end when has finished loading without segment and range equal to Period's end", () => {
128
- const content = createMockContent({
129
- period: { end: 30 },
130
- representation: {
131
- index: {
132
- checkDiscontinuity: vi.fn(() => null),
133
- awaitSegmentBetween: vi.fn(() => false),
134
- },
135
- },
136
- });
137
-
132
+ const content = createMockContent();
133
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
134
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
135
+ false,
136
+ );
137
+ content.period.end = 30;
138
138
  const result = checkForDiscontinuity(
139
139
  content,
140
140
  { start: 10, end: 30 },
@@ -142,21 +142,16 @@ describe("checkForDiscontinuity", () => {
142
142
  true, // hasFinishedLoading
143
143
  [],
144
144
  );
145
-
146
145
  expect(result).toEqual({ start: undefined, end: null });
147
146
  });
148
147
 
149
148
  it("should not return discontinuity when has finished loading without segment and range before Period's end", () => {
150
- const content = createMockContent({
151
- period: { end: 31 },
152
- representation: {
153
- index: {
154
- checkDiscontinuity: vi.fn(() => null),
155
- awaitSegmentBetween: vi.fn(() => false),
156
- },
157
- },
158
- });
159
-
149
+ const content = createMockContent();
150
+ content.period.end = 31;
151
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
152
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
153
+ false,
154
+ );
160
155
  const result = checkForDiscontinuity(
161
156
  content,
162
157
  { start: 10, end: 30 },
@@ -164,7 +159,6 @@ describe("checkForDiscontinuity", () => {
164
159
  true, // hasFinishedLoading
165
160
  [],
166
161
  );
167
-
168
162
  expect(result).toEqual(null);
169
163
  });
170
164
  });
@@ -172,8 +166,9 @@ describe("checkForDiscontinuity", () => {
172
166
  describe("when there's a hole before the first buffered segment", () => {
173
167
  it("should detect discontinuity when hole won't be filled", () => {
174
168
  const content = createMockContent();
175
- const bufferedSegments = [createBufferedChunk(15, 20, 15, 20)];
176
-
169
+ const bufferedSegments = [
170
+ makeBufferedChunk({ start: 15, end: 20, segmentTime: 15, segmentEnd: 20 }),
171
+ ];
177
172
  const result = checkForDiscontinuity(
178
173
  content,
179
174
  { start: 10, end: 25 },
@@ -181,14 +176,14 @@ describe("checkForDiscontinuity", () => {
181
176
  true,
182
177
  bufferedSegments,
183
178
  );
184
-
185
179
  expect(result).toEqual({ start: undefined, end: 15 });
186
180
  });
187
181
 
188
182
  it("should detect discontinuity when next segment won't fill the hole", () => {
189
183
  const content = createMockContent();
190
- const bufferedSegments = [createBufferedChunk(15, 20, 15, 20)];
191
-
184
+ const bufferedSegments = [
185
+ makeBufferedChunk({ start: 15, end: 20, segmentTime: 15, segmentEnd: 20 }),
186
+ ];
192
187
  const result = checkForDiscontinuity(
193
188
  content,
194
189
  { start: 10, end: 25 },
@@ -196,14 +191,14 @@ describe("checkForDiscontinuity", () => {
196
191
  true,
197
192
  bufferedSegments,
198
193
  );
199
-
200
194
  expect(result).toEqual({ start: undefined, end: 15 });
201
195
  });
202
196
 
203
197
  it("should return null when a segment is expected to fill the hole", () => {
204
198
  const content = createMockContent();
205
- const bufferedSegments = [createBufferedChunk(15, 20, 15, 20)];
206
-
199
+ const bufferedSegments = [
200
+ makeBufferedChunk({ start: 15, end: 20, segmentTime: 15, segmentEnd: 20 }),
201
+ ];
207
202
  const result = checkForDiscontinuity(
208
203
  content,
209
204
  { start: 10, end: 25 },
@@ -211,21 +206,18 @@ describe("checkForDiscontinuity", () => {
211
206
  false,
212
207
  bufferedSegments,
213
208
  );
214
-
215
209
  expect(result).toBeNull();
216
210
  });
217
211
 
218
212
  it("should return null when awaiting segment between start and hole", () => {
219
- const content = createMockContent({
220
- representation: {
221
- index: {
222
- checkDiscontinuity: vi.fn(() => null),
223
- awaitSegmentBetween: vi.fn(() => true),
224
- },
225
- },
226
- });
227
- const bufferedSegments = [createBufferedChunk(15, 20, 15, 20)];
228
-
213
+ const content = createMockContent();
214
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
215
+ const mockAwaitSegmentBetween = vi
216
+ .spyOn(content.representation.index, "awaitSegmentBetween")
217
+ .mockReturnValue(true);
218
+ const bufferedSegments = [
219
+ makeBufferedChunk({ start: 15, end: 20, segmentTime: 15, segmentEnd: 20 }),
220
+ ];
229
221
  const result = checkForDiscontinuity(
230
222
  content,
231
223
  { start: 10, end: 25 },
@@ -233,12 +225,8 @@ describe("checkForDiscontinuity", () => {
233
225
  false, // not finished loading
234
226
  bufferedSegments,
235
227
  );
236
-
237
228
  expect(result).toBeNull();
238
- expect(content.representation.index.awaitSegmentBetween).toHaveBeenCalledWith(
239
- 10,
240
- 15,
241
- );
229
+ expect(mockAwaitSegmentBetween).toHaveBeenCalledWith(10, 15);
242
230
  });
243
231
  });
244
232
 
@@ -246,10 +234,9 @@ describe("checkForDiscontinuity", () => {
246
234
  it("should detect discontinuity between consecutive segments", () => {
247
235
  const content = createMockContent();
248
236
  const bufferedSegments = [
249
- createBufferedChunk(10, 15, 10, 15),
250
- createBufferedChunk(20, 25, 20, 25), // hole from 15 to 20
237
+ makeBufferedChunk({ start: 10, end: 15, segmentTime: 10, segmentEnd: 15 }),
238
+ makeBufferedChunk({ start: 20, end: 25, segmentTime: 20, segmentEnd: 25 }), // hole from 15 to 20
251
239
  ];
252
-
253
240
  const result = checkForDiscontinuity(
254
241
  content,
255
242
  { start: 10, end: 30 },
@@ -257,17 +244,15 @@ describe("checkForDiscontinuity", () => {
257
244
  true,
258
245
  bufferedSegments,
259
246
  );
260
-
261
247
  expect(result).toEqual({ start: 15, end: 20 });
262
248
  });
263
249
 
264
250
  it("should detect discontinuity when next segment comes after the hole", () => {
265
251
  const content = createMockContent();
266
252
  const bufferedSegments = [
267
- createBufferedChunk(10, 15, 10, 15),
268
- createBufferedChunk(20, 25, 20, 25),
253
+ makeBufferedChunk({ start: 10, end: 15, segmentTime: 10, segmentEnd: 15 }),
254
+ makeBufferedChunk({ start: 20, end: 25, segmentTime: 20, segmentEnd: 25 }),
269
255
  ];
270
-
271
256
  const result = checkForDiscontinuity(
272
257
  content,
273
258
  { start: 10, end: 30 },
@@ -275,17 +260,15 @@ describe("checkForDiscontinuity", () => {
275
260
  true,
276
261
  bufferedSegments,
277
262
  );
278
-
279
263
  expect(result).toEqual({ start: 15, end: 20 });
280
264
  });
281
265
 
282
266
  it("should return null when next segment will fill the hole", () => {
283
267
  const content = createMockContent();
284
268
  const bufferedSegments = [
285
- createBufferedChunk(10, 15, 10, 15),
286
- createBufferedChunk(20, 25, 20, 25),
269
+ makeBufferedChunk({ start: 10, end: 15, segmentTime: 10, segmentEnd: 15 }),
270
+ makeBufferedChunk({ start: 20, end: 25, segmentTime: 20, segmentEnd: 25 }),
287
271
  ];
288
-
289
272
  const result = checkForDiscontinuity(
290
273
  content,
291
274
  { start: 10, end: 30 },
@@ -293,24 +276,19 @@ describe("checkForDiscontinuity", () => {
293
276
  false,
294
277
  bufferedSegments,
295
278
  );
296
-
297
279
  expect(result).toBeNull();
298
280
  });
299
281
 
300
282
  it("should return null when awaiting segment between holes", () => {
301
- const content = createMockContent({
302
- representation: {
303
- index: {
304
- checkDiscontinuity: vi.fn(() => null),
305
- awaitSegmentBetween: vi.fn(() => true),
306
- },
307
- },
308
- });
283
+ const content = createMockContent();
284
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
285
+ const mockAwaitSegmentBetween = vi
286
+ .spyOn(content.representation.index, "awaitSegmentBetween")
287
+ .mockReturnValue(true);
309
288
  const bufferedSegments = [
310
- createBufferedChunk(10, 15, 10, 15),
311
- createBufferedChunk(20, 25, 20, 25),
289
+ makeBufferedChunk({ start: 10, end: 15, segmentTime: 10, segmentEnd: 15 }),
290
+ makeBufferedChunk({ start: 20, end: 25, segmentTime: 20, segmentEnd: 25 }),
312
291
  ];
313
-
314
292
  const result = checkForDiscontinuity(
315
293
  content,
316
294
  { start: 10, end: 30 },
@@ -318,24 +296,18 @@ describe("checkForDiscontinuity", () => {
318
296
  false, // not finished loading
319
297
  bufferedSegments,
320
298
  );
321
-
322
299
  expect(result).toBeNull();
323
- expect(content.representation.index.awaitSegmentBetween).toHaveBeenCalledWith(
324
- 15,
325
- 20,
326
- );
300
+ expect(mockAwaitSegmentBetween).toHaveBeenCalledWith(15, 20);
327
301
  });
328
302
  });
329
303
 
330
304
  describe("when checking for discontinuity at period end", () => {
331
305
  it("should detect discontinuity when last segment ends before period end", () => {
332
- const content = createMockContent({
333
- period: { end: 100 },
334
- });
306
+ const content = createMockContent();
307
+ content.period.end = 100;
335
308
  const bufferedSegments = [
336
- createBufferedChunk(80, 90, 80, 90), // ends before period end
309
+ makeBufferedChunk({ start: 80, end: 90, segmentTime: 80, segmentEnd: 90 }), // ends before period end
337
310
  ];
338
-
339
311
  const result = checkForDiscontinuity(
340
312
  content,
341
313
  { start: 80, end: 105 },
@@ -343,16 +315,15 @@ describe("checkForDiscontinuity", () => {
343
315
  true, // hasFinishedLoading
344
316
  bufferedSegments,
345
317
  );
346
-
347
318
  expect(result).toEqual({ start: 90, end: null });
348
319
  });
349
320
 
350
321
  it("should return null when checked range doesn't reach period end", () => {
351
- const content = createMockContent({
352
- period: { end: 100 },
353
- });
354
- const bufferedSegments = [createBufferedChunk(80, 90, 80, 90)];
355
-
322
+ const content = createMockContent();
323
+ content.period.end = 100;
324
+ const bufferedSegments = [
325
+ makeBufferedChunk({ start: 80, end: 90, segmentTime: 80, segmentEnd: 90 }),
326
+ ];
356
327
  const result = checkForDiscontinuity(
357
328
  content,
358
329
  { start: 80, end: 95 }, // doesn't reach period end
@@ -360,16 +331,15 @@ describe("checkForDiscontinuity", () => {
360
331
  true,
361
332
  bufferedSegments,
362
333
  );
363
-
364
334
  expect(result).toBeNull();
365
335
  });
366
336
 
367
337
  it("should return null when last segment reaches period end", () => {
368
- const content = createMockContent({
369
- period: { end: 100 },
370
- });
371
- const bufferedSegments = [createBufferedChunk(80, 100, 80, 100)];
372
-
338
+ const content = createMockContent();
339
+ content.period.end = 100;
340
+ const bufferedSegments = [
341
+ makeBufferedChunk({ start: 80, end: 100, segmentTime: 80, segmentEnd: 100 }),
342
+ ];
373
343
  const result = checkForDiscontinuity(
374
344
  content,
375
345
  { start: 80, end: 105 },
@@ -377,23 +347,22 @@ describe("checkForDiscontinuity", () => {
377
347
  true,
378
348
  bufferedSegments,
379
349
  );
380
-
381
350
  expect(result).toBeNull();
382
351
  });
383
352
  });
384
353
 
385
354
  describe("when checking for manifest discontinuity at range end", () => {
386
355
  it("should detect manifest discontinuity at end of range", () => {
387
- const content = createMockContent({
388
- representation: {
389
- index: {
390
- checkDiscontinuity: vi.fn((time) => (time === 50 ? 60 : null)),
391
- awaitSegmentBetween: vi.fn(() => undefined),
392
- },
393
- },
394
- });
395
- const bufferedSegments = [createBufferedChunk(30, 40, 30, 40)];
396
-
356
+ const content = createMockContent();
357
+ const mockCheckDiscontinuity = vi
358
+ .spyOn(content.representation.index, "checkDiscontinuity")
359
+ .mockImplementation((time) => (time === 50 ? 60 : null));
360
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
361
+ undefined,
362
+ );
363
+ const bufferedSegments = [
364
+ makeBufferedChunk({ start: 30, end: 40, segmentTime: 30, segmentEnd: 40 }),
365
+ ];
397
366
  const result = checkForDiscontinuity(
398
367
  content,
399
368
  { start: 30, end: 50 },
@@ -401,22 +370,19 @@ describe("checkForDiscontinuity", () => {
401
370
  false,
402
371
  bufferedSegments,
403
372
  );
404
-
405
373
  expect(result).toEqual({ start: 40, end: 60 });
406
- expect(content.representation.index.checkDiscontinuity).toHaveBeenCalledWith(50);
374
+ expect(mockCheckDiscontinuity).toHaveBeenCalledWith(50);
407
375
  });
408
376
 
409
377
  it("should return null when no manifest discontinuity at range end", () => {
410
- const content = createMockContent({
411
- representation: {
412
- index: {
413
- checkDiscontinuity: vi.fn(() => null),
414
- awaitSegmentBetween: vi.fn(() => false),
415
- },
416
- },
417
- });
418
- const bufferedSegments = [createBufferedChunk(30, 40, 30, 40)];
419
-
378
+ const content = createMockContent();
379
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
380
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
381
+ false,
382
+ );
383
+ const bufferedSegments = [
384
+ makeBufferedChunk({ start: 30, end: 40, segmentTime: 30, segmentEnd: 40 }),
385
+ ];
420
386
  const result = checkForDiscontinuity(
421
387
  content,
422
388
  { start: 30, end: 50 },
@@ -424,7 +390,6 @@ describe("checkForDiscontinuity", () => {
424
390
  false,
425
391
  bufferedSegments,
426
392
  );
427
-
428
393
  expect(result).toBeNull();
429
394
  });
430
395
  });
@@ -432,14 +397,20 @@ describe("checkForDiscontinuity", () => {
432
397
  describe("edge cases", () => {
433
398
  it("should handle segments with undefined bufferedStart", () => {
434
399
  const content = createMockContent();
400
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
401
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
402
+ undefined,
403
+ );
435
404
  const bufferedSegments = [
436
- {
405
+ makeBufferedChunk({
437
406
  bufferedStart: undefined,
438
407
  bufferedEnd: 15,
439
- infos: { segment: { time: 10, end: 15 } },
440
- } as IBufferedChunk,
408
+ segmentTime: 10,
409
+ segmentEnd: 15,
410
+ start: 10,
411
+ end: 15,
412
+ }),
441
413
  ];
442
-
443
414
  const result = checkForDiscontinuity(
444
415
  content,
445
416
  { start: 10, end: 20 },
@@ -447,20 +418,25 @@ describe("checkForDiscontinuity", () => {
447
418
  false,
448
419
  bufferedSegments,
449
420
  );
450
-
451
421
  expect(result).toBeNull();
452
422
  });
453
423
 
454
424
  it("should handle segments with undefined bufferedEnd", () => {
455
425
  const content = createMockContent();
426
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
427
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
428
+ undefined,
429
+ );
456
430
  const bufferedSegments = [
457
- {
431
+ makeBufferedChunk({
458
432
  bufferedStart: 10,
459
433
  bufferedEnd: undefined,
460
- infos: { segment: { time: 10, end: 15 } },
461
- } as IBufferedChunk,
434
+ segmentTime: 10,
435
+ segmentEnd: 15,
436
+ start: 10,
437
+ end: 15,
438
+ }),
462
439
  ];
463
-
464
440
  const result = checkForDiscontinuity(
465
441
  content,
466
442
  { start: 10, end: 20 },
@@ -468,18 +444,16 @@ describe("checkForDiscontinuity", () => {
468
444
  false,
469
445
  bufferedSegments,
470
446
  );
471
-
472
447
  expect(result).toBeNull();
473
448
  });
474
449
 
475
450
  it("should handle multiple segments where only some overlap with range", () => {
476
451
  const content = createMockContent();
477
452
  const bufferedSegments = [
478
- createBufferedChunk(5, 8, 5, 8), // before range
479
- createBufferedChunk(10, 15, 10, 15), // in range
480
- createBufferedChunk(20, 25, 20, 25), // in range
453
+ makeBufferedChunk({ start: 5, end: 8, segmentTime: 5, segmentEnd: 8 }), // before range
454
+ makeBufferedChunk({ start: 10, end: 15, segmentTime: 10, segmentEnd: 15 }), // in range
455
+ makeBufferedChunk({ start: 20, end: 25, segmentTime: 20, segmentEnd: 25 }), // in range
481
456
  ];
482
-
483
457
  const result = checkForDiscontinuity(
484
458
  content,
485
459
  { start: 10, end: 30 },
@@ -487,18 +461,20 @@ describe("checkForDiscontinuity", () => {
487
461
  true,
488
462
  bufferedSegments,
489
463
  );
490
-
491
464
  expect(result).toEqual({ start: 15, end: 20 });
492
465
  });
493
466
 
494
467
  it("should handle consecutive segments without gaps", () => {
495
468
  const content = createMockContent();
469
+ vi.spyOn(content.representation.index, "checkDiscontinuity").mockReturnValue(null);
470
+ vi.spyOn(content.representation.index, "awaitSegmentBetween").mockReturnValue(
471
+ undefined,
472
+ );
496
473
  const bufferedSegments = [
497
- createBufferedChunk(10, 15, 10, 15),
498
- createBufferedChunk(15, 20, 15, 20),
499
- createBufferedChunk(20, 25, 20, 25),
474
+ makeBufferedChunk({ start: 10, end: 15, segmentTime: 10, segmentEnd: 15 }),
475
+ makeBufferedChunk({ start: 15, end: 20, segmentTime: 15, segmentEnd: 20 }),
476
+ makeBufferedChunk({ start: 20, end: 25, segmentTime: 20, segmentEnd: 25 }),
500
477
  ];
501
-
502
478
  const result = checkForDiscontinuity(
503
479
  content,
504
480
  { start: 10, end: 30 },
@@ -506,7 +482,6 @@ describe("checkForDiscontinuity", () => {
506
482
  false,
507
483
  bufferedSegments,
508
484
  );
509
-
510
485
  expect(result).toBeNull();
511
486
  });
512
487
  });