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,13 +1,26 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
2
  import { MediaError, SourceBufferError } from "../../../../../errors";
3
+ import {
4
+ DummyRepresentation,
5
+ DummyAdaptation,
6
+ DummyPeriod,
7
+ createSegment,
8
+ } from "../../../../../manifest/classes/__tests__/mocks";
9
+ import {
10
+ makeReadyOnlyPlaybackObserver,
11
+ DummyObservationPosition,
12
+ } from "../../../../../playback_observer/__tests__/mocks";
3
13
  import SharedReference from "../../../../../utils/reference";
4
14
  import TaskCanceller, { CancellationError } from "../../../../../utils/task_canceller";
15
+ import type {
16
+ IInsertedChunkInfos,
17
+ IPushChunkInfos,
18
+ SegmentSink,
19
+ } from "../../../../segment_sinks";
20
+ import { DummySegmentSink } from "../../../../segment_sinks/__tests__/mocks";
21
+ import type { IRepresentationStreamPlaybackObservation } from "../../types";
5
22
  import appendSegmentToBuffer from "../append_segment_to_buffer";
6
23
 
7
- /* eslint-disable @typescript-eslint/no-explicit-any */
8
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
9
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
10
-
11
24
  vi.mock("../../../../../log", () => ({
12
25
  default: {
13
26
  debug: vi.fn(),
@@ -19,53 +32,79 @@ vi.mock("../../../../../utils/sleep", () => ({
19
32
  }));
20
33
 
21
34
  describe("appendSegmentToBuffer", () => {
22
- let mockPlaybackObserver: any;
23
- let mockSegmentSink: any;
24
- let mockDataInfos: any;
35
+ const mockedPlaybackObserver =
36
+ makeReadyOnlyPlaybackObserver<IRepresentationStreamPlaybackObservation>({
37
+ position: new DummyObservationPosition({
38
+ getWanted: vi.fn(() => 10),
39
+ }),
40
+ paused: {
41
+ last: false,
42
+ pending: undefined,
43
+ },
44
+ speed: 1,
45
+ canStream: true,
46
+ });
47
+ let mockDataInfos: IPushChunkInfos<unknown> & { inventoryInfos: IInsertedChunkInfos };
25
48
  let mockBufferGoal: SharedReference<number>;
26
- let mockTaskCanceller = new TaskCanceller("test canceller");
49
+ let mockTaskCanceller: TaskCanceller;
50
+ const mockPushChunk = vi.fn();
51
+ const mockRemoveBuffer = vi.fn();
52
+ let mockSegmentSink: SegmentSink;
27
53
 
28
54
  beforeEach(() => {
29
- mockPlaybackObserver = {
30
- getReference: vi.fn(
31
- () =>
32
- new SharedReference({
33
- position: {
34
- getWanted: () => 10,
35
- },
36
- }),
37
- ),
38
- };
39
- mockSegmentSink = {
40
- pushChunk: vi.fn(() => Promise.resolve([{ start: 0, end: 10 }])),
41
- removeBuffer: vi.fn(() => Promise.resolve(undefined)),
42
- };
55
+ mockBufferGoal = new SharedReference(30);
56
+ mockTaskCanceller = new TaskCanceller("test canceller");
57
+
58
+ mockPushChunk.mockImplementation(() => Promise.resolve([{ start: 0, end: 10 }]));
59
+ mockRemoveBuffer.mockImplementation(() => Promise.resolve(undefined));
60
+ mockSegmentSink = new DummySegmentSink({
61
+ pushChunk: mockPushChunk,
62
+ removeBuffer: mockRemoveBuffer,
63
+ });
64
+
43
65
  mockDataInfos = {
44
66
  inventoryInfos: {
45
- adaptation: { id: "test-adaptation", type: "video", representations: [] },
67
+ adaptation: new DummyAdaptation({
68
+ id: "test-adaptation",
69
+ type: "video",
70
+ representations: [],
71
+ }),
72
+ representation: new DummyRepresentation(),
73
+ period: new DummyPeriod(),
74
+ segment: createSegment(),
75
+ chunkSize: 1024,
76
+ start: 0,
77
+ end: 2,
78
+ },
79
+ data: {
80
+ initSegmentUniqueId: "...",
81
+ codec: "...",
82
+ chunk: new Uint8Array([1, 2, 3]),
83
+ timestampOffset: 0,
84
+ appendWindow: [undefined, undefined],
46
85
  },
47
86
  };
48
- mockBufferGoal = new SharedReference(30);
49
- mockTaskCanceller.cancel("test end");
50
- mockTaskCanceller = new TaskCanceller("test canceller");
51
87
  });
52
88
 
53
89
  afterEach(() => {
90
+ mockBufferGoal.finish();
91
+ mockTaskCanceller.cancel("test end");
92
+ mockedPlaybackObserver.reset();
54
93
  vi.resetAllMocks();
55
94
  });
56
95
 
57
96
  describe("successful append", () => {
58
97
  it("should push chunk successfully on first try", async () => {
59
98
  const result = await appendSegmentToBuffer(
60
- mockPlaybackObserver,
99
+ mockedPlaybackObserver.observer,
61
100
  mockSegmentSink,
62
101
  mockDataInfos,
63
102
  mockBufferGoal,
64
103
  mockTaskCanceller.signal,
65
104
  );
66
105
 
67
- expect(mockSegmentSink.pushChunk).toHaveBeenCalledTimes(1);
68
- expect(mockSegmentSink.pushChunk).toHaveBeenCalledWith(mockDataInfos);
106
+ expect(mockPushChunk).toHaveBeenCalledTimes(1);
107
+ expect(mockPushChunk).toHaveBeenCalledWith(mockDataInfos);
69
108
  expect(result).toEqual([{ start: 0, end: 10 }]);
70
109
  });
71
110
  });
@@ -78,20 +117,20 @@ describe("appendSegmentToBuffer", () => {
78
117
  true,
79
118
  );
80
119
 
81
- mockSegmentSink.pushChunk
120
+ mockPushChunk
82
121
  .mockRejectedValueOnce(bufferFullError)
83
122
  .mockResolvedValueOnce([{ start: 0, end: 10 }]);
84
123
 
85
124
  const result = await appendSegmentToBuffer(
86
- mockPlaybackObserver,
125
+ mockedPlaybackObserver.observer,
87
126
  mockSegmentSink,
88
127
  mockDataInfos,
89
128
  mockBufferGoal,
90
129
  mockTaskCanceller.signal,
91
130
  );
92
131
 
93
- expect(mockSegmentSink.pushChunk).toHaveBeenCalledTimes(2);
94
- expect(mockSegmentSink.removeBuffer).toHaveBeenCalledTimes(2);
132
+ expect(mockPushChunk).toHaveBeenCalledTimes(2);
133
+ expect(mockRemoveBuffer).toHaveBeenCalledTimes(2);
95
134
  expect(result).toEqual([{ start: 0, end: 10 }]);
96
135
  });
97
136
 
@@ -102,12 +141,12 @@ describe("appendSegmentToBuffer", () => {
102
141
  true,
103
142
  );
104
143
 
105
- mockSegmentSink.pushChunk
144
+ mockPushChunk
106
145
  .mockRejectedValueOnce(bufferFullError)
107
146
  .mockResolvedValueOnce([{ start: 0, end: 10 }]);
108
147
 
109
148
  await appendSegmentToBuffer(
110
- mockPlaybackObserver,
149
+ mockedPlaybackObserver.observer,
111
150
  mockSegmentSink,
112
151
  mockDataInfos,
113
152
  mockBufferGoal,
@@ -115,7 +154,7 @@ describe("appendSegmentToBuffer", () => {
115
154
  );
116
155
 
117
156
  // Should remove from 0 to (currentPos - 5) = 5
118
- expect(mockSegmentSink.removeBuffer).toHaveBeenCalledWith(0, 5);
157
+ expect(mockRemoveBuffer).toHaveBeenCalledWith(0, 5);
119
158
  });
120
159
 
121
160
  it("should remove buffer after buffer goal (end)", async () => {
@@ -125,14 +164,14 @@ describe("appendSegmentToBuffer", () => {
125
164
  true,
126
165
  );
127
166
 
128
- mockSegmentSink.pushChunk
167
+ mockPushChunk
129
168
  .mockRejectedValueOnce(bufferFullError)
130
169
  .mockResolvedValueOnce([{ start: 0, end: 10 }]);
131
170
 
132
171
  mockBufferGoal.setValue(30);
133
172
 
134
173
  await appendSegmentToBuffer(
135
- mockPlaybackObserver,
174
+ mockedPlaybackObserver.observer,
136
175
  mockSegmentSink,
137
176
  mockDataInfos,
138
177
  mockBufferGoal,
@@ -140,7 +179,7 @@ describe("appendSegmentToBuffer", () => {
140
179
  );
141
180
 
142
181
  // Should remove from (currentPos + bufferGoal + 12) = 52 to MAX_VALUE
143
- expect(mockSegmentSink.removeBuffer).toHaveBeenCalledWith(52, Number.MAX_VALUE);
182
+ expect(mockRemoveBuffer).toHaveBeenCalledWith(52, Number.MAX_VALUE);
144
183
  });
145
184
 
146
185
  it("should not remove start buffer when position is < 5", async () => {
@@ -150,28 +189,32 @@ describe("appendSegmentToBuffer", () => {
150
189
  true,
151
190
  );
152
191
 
153
- mockSegmentSink.pushChunk
192
+ mockPushChunk
154
193
  .mockRejectedValueOnce(bufferFullError)
155
194
  .mockResolvedValueOnce([{ start: 0, end: 10 }]);
156
195
 
157
- mockPlaybackObserver.getReference.mockReturnValue(
158
- new SharedReference({
159
- position: {
160
- getWanted: vi.fn(() => 3),
161
- },
196
+ mockedPlaybackObserver.emit({
197
+ position: new DummyObservationPosition({
198
+ getWanted: vi.fn(() => 3),
162
199
  }),
163
- );
200
+ paused: {
201
+ last: false,
202
+ pending: undefined,
203
+ },
204
+ speed: 1,
205
+ canStream: true,
206
+ });
164
207
  await appendSegmentToBuffer(
165
- mockPlaybackObserver,
208
+ mockedPlaybackObserver.observer,
166
209
  mockSegmentSink,
167
210
  mockDataInfos,
168
211
  mockBufferGoal,
169
212
  mockTaskCanceller.signal,
170
213
  );
171
- expect(mockSegmentSink.removeBuffer).toHaveBeenCalledWith(45, Number.MAX_VALUE);
214
+ expect(mockRemoveBuffer).toHaveBeenCalledWith(45, Number.MAX_VALUE);
172
215
 
173
216
  // Should only be called once for the end buffer
174
- expect(mockSegmentSink.removeBuffer).toHaveBeenCalledTimes(1);
217
+ expect(mockRemoveBuffer).toHaveBeenCalledTimes(1);
175
218
  });
176
219
 
177
220
  it("should throw BUFFER_FULL_ERROR if retry fails", async () => {
@@ -183,13 +226,13 @@ describe("appendSegmentToBuffer", () => {
183
226
 
184
227
  const retryError = new Error("Retry failed");
185
228
 
186
- mockSegmentSink.pushChunk
229
+ mockPushChunk
187
230
  .mockRejectedValueOnce(bufferFullError)
188
231
  .mockRejectedValueOnce(retryError);
189
232
 
190
233
  await expect(
191
234
  appendSegmentToBuffer(
192
- mockPlaybackObserver,
235
+ mockedPlaybackObserver.observer,
193
236
  mockSegmentSink,
194
237
  mockDataInfos,
195
238
  mockBufferGoal,
@@ -202,10 +245,10 @@ describe("appendSegmentToBuffer", () => {
202
245
  describe("non-buffer-full errors", () => {
203
246
  it("should throw BUFFER_APPEND_ERROR for non-buffer-full SourceBufferError", async () => {
204
247
  const error = new SourceBufferError("SOME_ERROR", "Some error", false);
205
- mockSegmentSink.pushChunk.mockRejectedValueOnce(error);
248
+ mockPushChunk.mockRejectedValueOnce(error);
206
249
  await expect(
207
250
  appendSegmentToBuffer(
208
- mockPlaybackObserver,
251
+ mockedPlaybackObserver.observer,
209
252
  mockSegmentSink,
210
253
  mockDataInfos,
211
254
  mockBufferGoal,
@@ -228,11 +271,11 @@ describe("appendSegmentToBuffer", () => {
228
271
 
229
272
  it("should throw BUFFER_APPEND_ERROR for generic Error", async () => {
230
273
  const error = new Error("Generic error");
231
- mockSegmentSink.pushChunk.mockRejectedValueOnce(error);
274
+ mockPushChunk.mockRejectedValueOnce(error);
232
275
 
233
276
  await expect(
234
277
  appendSegmentToBuffer(
235
- mockPlaybackObserver,
278
+ mockedPlaybackObserver.observer,
236
279
  mockSegmentSink,
237
280
  mockDataInfos,
238
281
  mockBufferGoal,
@@ -242,11 +285,11 @@ describe("appendSegmentToBuffer", () => {
242
285
  });
243
286
 
244
287
  it("should throw BUFFER_APPEND_ERROR for unknown error type", async () => {
245
- mockSegmentSink.pushChunk.mockRejectedValueOnce("string error");
288
+ mockPushChunk.mockRejectedValueOnce("string error");
246
289
 
247
290
  await expect(
248
291
  appendSegmentToBuffer(
249
- mockPlaybackObserver,
292
+ mockedPlaybackObserver.observer,
250
293
  mockSegmentSink,
251
294
  mockDataInfos,
252
295
  mockBufferGoal,
@@ -260,11 +303,11 @@ describe("appendSegmentToBuffer", () => {
260
303
  it("should throw CancellationError on initial pushChunk if cancelled", async () => {
261
304
  const cancellationError = new CancellationError("Test", "test");
262
305
  mockTaskCanceller.cancel("test cancellation");
263
- mockSegmentSink.pushChunk.mockRejectedValueOnce(cancellationError);
306
+ mockPushChunk.mockRejectedValueOnce(cancellationError);
264
307
 
265
308
  await expect(
266
309
  appendSegmentToBuffer(
267
- mockPlaybackObserver,
310
+ mockedPlaybackObserver.observer,
268
311
  mockSegmentSink,
269
312
  mockDataInfos,
270
313
  mockBufferGoal,
@@ -280,12 +323,12 @@ describe("appendSegmentToBuffer", () => {
280
323
  true,
281
324
  );
282
325
 
283
- mockSegmentSink.pushChunk.mockRejectedValueOnce(bufferFullError);
326
+ mockPushChunk.mockRejectedValueOnce(bufferFullError);
284
327
  mockTaskCanceller.cancel("test 523");
285
328
 
286
329
  await expect(
287
330
  appendSegmentToBuffer(
288
- mockPlaybackObserver,
331
+ mockedPlaybackObserver.observer,
289
332
  mockSegmentSink,
290
333
  mockDataInfos,
291
334
  mockBufferGoal,
@@ -303,13 +346,13 @@ describe("appendSegmentToBuffer", () => {
303
346
 
304
347
  const cancellationError = new CancellationError("Test", "test");
305
348
 
306
- mockSegmentSink.pushChunk
349
+ mockPushChunk
307
350
  .mockRejectedValueOnce(bufferFullError)
308
351
  .mockRejectedValueOnce(cancellationError);
309
352
 
310
353
  await expect(
311
354
  appendSegmentToBuffer(
312
- mockPlaybackObserver,
355
+ mockedPlaybackObserver.observer,
313
356
  mockSegmentSink,
314
357
  mockDataInfos,
315
358
  mockBufferGoal,