rx-player 3.30.0-dev.2023020100 → 3.30.0-dev.2023030200

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 (183) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +5 -1
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +23 -12
  5. package/dist/_esm5.processed/compat/browser_detection.js +80 -38
  6. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  8. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  9. package/dist/_esm5.processed/config.d.ts +2 -0
  10. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +4 -2
  11. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  12. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  13. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  14. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  15. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  16. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  17. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  18. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  19. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  20. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +199 -0
  21. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  22. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  23. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  24. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  25. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  26. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  27. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  28. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  29. package/dist/_esm5.processed/core/api/playback_observer.js +3 -2
  30. package/dist/_esm5.processed/core/api/public_api.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/public_api.js +25 -14
  32. package/dist/_esm5.processed/core/api/utils.js +3 -3
  33. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +32 -13
  34. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  35. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  37. package/dist/_esm5.processed/core/decrypt/find_key_system.js +33 -24
  38. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +54 -50
  39. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  40. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  41. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  42. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  43. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  44. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  45. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  46. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  47. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  48. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +27 -31
  49. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +2 -2
  50. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  51. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  52. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  53. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  54. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  55. package/dist/_esm5.processed/core/init/utils/media_duration_updater.js +23 -19
  56. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +1 -1
  57. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  58. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  59. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +7 -10
  60. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +4 -2
  61. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  62. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +25 -16
  63. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +26 -12
  64. package/dist/_esm5.processed/core/stream/period/period_stream.js +11 -10
  65. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -15
  66. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +1 -1
  67. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  68. package/dist/_esm5.processed/default_config.d.ts +16 -0
  69. package/dist/_esm5.processed/default_config.js +19 -0
  70. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  71. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  72. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  73. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  74. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  75. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +8 -4
  76. package/dist/_esm5.processed/features/features_object.js +1 -0
  77. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  78. package/dist/_esm5.processed/features/types.d.ts +3 -0
  79. package/dist/_esm5.processed/manifest/adaptation.js +4 -0
  80. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  81. package/dist/_esm5.processed/manifest/representation.js +11 -4
  82. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  83. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  84. package/dist/_esm5.processed/public_types.d.ts +1 -0
  85. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  86. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  87. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  88. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  89. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  90. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  91. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  92. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  93. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  94. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  95. package/dist/_esm5.processed/utils/reference.js +6 -0
  96. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  97. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  98. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  99. package/dist/rx-player.js +880 -677
  100. package/dist/rx-player.min.js +1 -1
  101. package/jest.config.js +1 -0
  102. package/package.json +19 -18
  103. package/scripts/build/constants.d.ts +1 -0
  104. package/scripts/report_build_sizes +4 -0
  105. package/sonar-project.properties +1 -1
  106. package/src/compat/browser_detection.ts +99 -52
  107. package/src/compat/can_reuse_media_keys.ts +5 -2
  108. package/src/compat/eme/close_session.ts +2 -2
  109. package/src/compat/event_listeners.ts +1 -1
  110. package/src/core/adaptive/adaptive_representation_selector.ts +4 -2
  111. package/src/core/api/debug/buffer_graph.ts +247 -0
  112. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  113. package/src/core/api/debug/constants.ts +2 -0
  114. package/src/core/api/debug/index.ts +3 -0
  115. package/src/core/api/debug/modules/general_info.ts +204 -0
  116. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  117. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  118. package/src/core/api/debug/render.ts +40 -0
  119. package/src/core/api/debug/utils.ts +103 -0
  120. package/src/core/api/playback_observer.ts +4 -2
  121. package/src/core/api/public_api.ts +28 -14
  122. package/src/core/api/utils.ts +3 -3
  123. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  124. package/src/core/decrypt/attach_media_keys.ts +1 -1
  125. package/src/core/decrypt/content_decryptor.ts +1 -1
  126. package/src/core/decrypt/find_key_system.ts +36 -35
  127. package/src/core/decrypt/session_events_listener.ts +57 -56
  128. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  129. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  130. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  131. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  132. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  133. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  134. package/src/core/init/directfile_content_initializer.ts +1 -1
  135. package/src/core/init/media_source_content_initializer.ts +37 -41
  136. package/src/core/init/utils/content_time_boundaries_observer.ts +2 -2
  137. package/src/core/init/utils/create_media_source.ts +4 -16
  138. package/src/core/init/utils/end_of_stream.ts +6 -3
  139. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  140. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  141. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  142. package/src/core/init/utils/media_duration_updater.ts +25 -20
  143. package/src/core/init/utils/rebuffering_controller.ts +1 -1
  144. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  145. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  146. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +7 -11
  147. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +4 -2
  148. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  149. package/src/core/stream/adaptation/adaptation_stream.ts +28 -19
  150. package/src/core/stream/orchestrator/stream_orchestrator.ts +26 -12
  151. package/src/core/stream/period/period_stream.ts +11 -10
  152. package/src/core/stream/representation/representation_stream.ts +15 -15
  153. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
  154. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  155. package/src/default_config.ts +30 -9
  156. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  157. package/src/experimental/features/debug_element.ts +13 -0
  158. package/src/experimental/features/index.ts +1 -0
  159. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  160. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +8 -4
  161. package/src/features/__tests__/initialize_features.test.ts +11 -0
  162. package/src/features/features_object.ts +1 -0
  163. package/src/features/initialize_features.ts +15 -10
  164. package/src/features/types.ts +9 -0
  165. package/src/manifest/adaptation.ts +7 -0
  166. package/src/manifest/manifest.ts +4 -0
  167. package/src/manifest/representation.ts +10 -4
  168. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  169. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  170. package/src/public_types.ts +1 -0
  171. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  172. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  173. package/src/transports/dash/manifest_parser.ts +1 -1
  174. package/src/transports/dash/segment_loader.ts +4 -4
  175. package/src/transports/local/segment_loader.ts +14 -30
  176. package/src/transports/smooth/segment_loader.ts +4 -4
  177. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  178. package/src/typings/globals.d.ts +2 -0
  179. package/src/utils/cancellable_sleep.ts +5 -14
  180. package/src/utils/create_cancellable_promise.ts +69 -0
  181. package/src/utils/reference.ts +6 -0
  182. package/src/utils/request/xhr.ts +1 -1
  183. package/src/utils/task_canceller.ts +63 -34
@@ -0,0 +1,199 @@
1
+ import { DEFAULT_REFRESH_INTERVAL } from "../constants";
2
+ import { createCompositeElement, createElement, createMetricTitle, isExtendedMode, } from "../utils";
3
+ export default function constructDebugGeneralInfo(instance, parentElt, cancelSignal) {
4
+ var generalInfoElt = createElement("div");
5
+ var adaptationsElt = createElement("div");
6
+ var representationsElt = createElement("div");
7
+ updateGeneralInfo();
8
+ var generalInfoItv = setInterval(function () {
9
+ updateGeneralInfo();
10
+ }, DEFAULT_REFRESH_INTERVAL);
11
+ cancelSignal.register(function () {
12
+ clearInterval(generalInfoItv);
13
+ });
14
+ return createCompositeElement("div", [
15
+ generalInfoElt,
16
+ adaptationsElt,
17
+ representationsElt,
18
+ ]);
19
+ function updateGeneralInfo() {
20
+ var videoElement = instance.getVideoElement();
21
+ if (videoElement === null) {
22
+ // disposed player. Clean-up everything
23
+ generalInfoElt.innerHTML = "";
24
+ adaptationsElt.innerHTML = "";
25
+ representationsElt.innerHTML = "";
26
+ clearInterval(generalInfoItv);
27
+ return;
28
+ }
29
+ else {
30
+ var currentTime = instance.getPosition();
31
+ var bufferGap = instance.getVideoBufferGap();
32
+ var bufferGapStr = bufferGap === Infinity ? "0" : bufferGap.toFixed(2);
33
+ var valuesLine1 = [
34
+ ["ct", currentTime.toFixed(2)],
35
+ ["bg", bufferGapStr],
36
+ ["rs", String(videoElement.readyState)],
37
+ ["pr", String(videoElement.playbackRate)],
38
+ ["sp", String(instance.getPlaybackRate())],
39
+ ["pa", String(videoElement.paused ? 1 : 0)],
40
+ ["en", String(videoElement.ended ? 1 : 0)],
41
+ ["li", String(instance.isLive() ? 1 : 0)],
42
+ ["wba", String(instance.getWantedBufferAhead())],
43
+ ["st", "\"".concat(instance.getPlayerState(), "\"")],
44
+ ];
45
+ var valuesLine2 = [];
46
+ var ks = instance.getKeySystemConfiguration();
47
+ if (ks !== null) {
48
+ valuesLine2.push(["ks", ks.keySystem]);
49
+ }
50
+ var mbb = instance.getMaxBufferBehind();
51
+ if (mbb !== Infinity) {
52
+ valuesLine2.push(["mbb", String(mbb)]);
53
+ }
54
+ var mba = instance.getMaxBufferAhead();
55
+ if (mba !== Infinity) {
56
+ valuesLine2.push(["mba", String(mba)]);
57
+ }
58
+ var mia = instance.getMinAudioBitrate();
59
+ if (mia !== 0) {
60
+ valuesLine2.push(["mia", String(mia)]);
61
+ }
62
+ var miv = instance.getMinVideoBitrate();
63
+ if (miv !== 0) {
64
+ valuesLine2.push(["miv", String(miv)]);
65
+ }
66
+ var maa = instance.getMaxAudioBitrate();
67
+ if (maa !== Infinity) {
68
+ valuesLine2.push(["maa", String(maa)]);
69
+ }
70
+ var mav = instance.getMaxVideoBitrate();
71
+ if (mav !== Infinity) {
72
+ valuesLine2.push(["mav", String(mav)]);
73
+ }
74
+ var fab = instance.getManualAudioBitrate();
75
+ if (fab >= 0) {
76
+ valuesLine2.push(["fab", String(fab)]);
77
+ }
78
+ var fvb = instance.getManualVideoBitrate();
79
+ if (fvb >= 0) {
80
+ valuesLine2.push(["fvb", String(fvb)]);
81
+ }
82
+ var mbs = instance.getMaxVideoBufferSize();
83
+ if (mbs !== Infinity) {
84
+ valuesLine2.push(["mbs", String(mbs)]);
85
+ }
86
+ var minPos = instance.getMinimumPosition();
87
+ if (minPos !== null) {
88
+ valuesLine1.push(["mip", minPos.toFixed(2)]);
89
+ valuesLine2.push(["dmi", (currentTime - minPos).toFixed(2)]);
90
+ }
91
+ var maxPos = instance.getMaximumPosition();
92
+ if (maxPos !== null) {
93
+ valuesLine1.push(["map", maxPos.toFixed(2)]);
94
+ valuesLine2.push(["dma", (maxPos - currentTime).toFixed(2)]);
95
+ }
96
+ var valuesLine3 = [];
97
+ var error = instance.getError();
98
+ if (error !== null) {
99
+ valuesLine3.push(["er", "\"".concat(String(error), "\"")]);
100
+ }
101
+ generalInfoElt.innerHTML = "";
102
+ for (var _i = 0, _a = [valuesLine1, valuesLine2, valuesLine3]; _i < _a.length; _i++) {
103
+ var valueSet = _a[_i];
104
+ if (valueSet.length > 0) {
105
+ var lineInfoElt = createElement("div");
106
+ for (var _b = 0, valueSet_1 = valueSet; _b < valueSet_1.length; _b++) {
107
+ var value = valueSet_1[_b];
108
+ lineInfoElt.appendChild(createMetricTitle(value[0]));
109
+ lineInfoElt.appendChild(createElement("span", {
110
+ textContent: value[1] + " ",
111
+ }));
112
+ }
113
+ generalInfoElt.appendChild(lineInfoElt);
114
+ }
115
+ }
116
+ if (isExtendedMode(parentElt)) {
117
+ var url = instance.getUrl();
118
+ if (url !== undefined) {
119
+ var reducedUrl = url.length > 100 ?
120
+ url.substring(0, 99) + "…" :
121
+ url;
122
+ generalInfoElt.appendChild(createCompositeElement("div", [
123
+ createMetricTitle("url"),
124
+ createElement("span", {
125
+ textContent: reducedUrl,
126
+ }),
127
+ ]));
128
+ }
129
+ }
130
+ }
131
+ if (isExtendedMode(parentElt)) {
132
+ var videoId = instance.getAvailableVideoTracks().map(function (_a) {
133
+ var id = _a.id, active = _a.active;
134
+ return active ? "*".concat(id) : id;
135
+ });
136
+ var audioId = instance.getAvailableAudioTracks().map(function (_a) {
137
+ var id = _a.id, active = _a.active;
138
+ return active ? "*".concat(id) : id;
139
+ });
140
+ var textId = instance.getAvailableTextTracks().map(function (_a) {
141
+ var id = _a.id, active = _a.active;
142
+ return active ? "*".concat(id) : id;
143
+ });
144
+ adaptationsElt.innerHTML = "";
145
+ if (videoId.length > 0) {
146
+ var textContent = "".concat(videoId.length, ":").concat(videoId.join(" "), " ");
147
+ if (textContent.length > 100) {
148
+ textContent = textContent.substring(0, 98) + "… ";
149
+ }
150
+ var videoAdaps = createCompositeElement("div", [
151
+ createMetricTitle("vt"),
152
+ createElement("span", { textContent: textContent }),
153
+ ]);
154
+ adaptationsElt.appendChild(videoAdaps);
155
+ }
156
+ if (audioId.length > 0) {
157
+ var textContent = "".concat(audioId.length, ":").concat(audioId.join(" "), " ");
158
+ if (textContent.length > 100) {
159
+ textContent = textContent.substring(0, 98) + "… ";
160
+ }
161
+ var audioAdaps = createCompositeElement("div", [
162
+ createMetricTitle("at"),
163
+ createElement("span", { textContent: textContent }),
164
+ ]);
165
+ adaptationsElt.appendChild(audioAdaps);
166
+ }
167
+ if (textId.length > 0) {
168
+ var textContent = "".concat(textId.length, ":").concat(textId.join(" "), " ");
169
+ if (textContent.length > 100) {
170
+ textContent = textContent.substring(0, 98) + "… ";
171
+ }
172
+ var textAdaps = createCompositeElement("div", [
173
+ createMetricTitle("tt"),
174
+ createElement("span", { textContent: textContent }),
175
+ ]);
176
+ adaptationsElt.appendChild(textAdaps);
177
+ }
178
+ var videoBitrates = instance.getAvailableVideoBitrates();
179
+ var audioBitrates = instance.getAvailableAudioBitrates();
180
+ representationsElt.innerHTML = "";
181
+ if (videoBitrates.length > 0) {
182
+ representationsElt.appendChild(createMetricTitle("vb"));
183
+ representationsElt.appendChild(createElement("span", {
184
+ textContent: videoBitrates.join(" ") + " ",
185
+ }));
186
+ }
187
+ if (audioBitrates.length > 0) {
188
+ representationsElt.appendChild(createMetricTitle("ab"));
189
+ representationsElt.appendChild(createElement("span", {
190
+ textContent: audioBitrates.join(" ") + " ",
191
+ }));
192
+ }
193
+ }
194
+ else {
195
+ adaptationsElt.innerHTML = "";
196
+ representationsElt.innerHTML = "";
197
+ }
198
+ }
199
+ }
@@ -0,0 +1,4 @@
1
+ import { CancellationSignal } from "../../../../utils/task_canceller";
2
+ import { IBufferType } from "../../../segment_buffers";
3
+ import RxPlayer from "../../public_api";
4
+ export default function createSegmentBufferGraph(instance: RxPlayer, bufferType: IBufferType, title: string, parentElt: HTMLElement, cancelSignal: CancellationSignal): HTMLElement;
@@ -0,0 +1,121 @@
1
+ import isNullOrUndefined from "../../../../utils/is_null_or_undefined";
2
+ import SegmentBufferGraph from "../buffer_graph";
3
+ import { DEFAULT_REFRESH_INTERVAL } from "../constants";
4
+ import { createElement, createGraphCanvas, createMetricTitle, isExtendedMode, } from "../utils";
5
+ export default function createSegmentBufferGraph(instance, bufferType, title, parentElt, cancelSignal) {
6
+ var bufferGraphWrapper = createElement("div");
7
+ var bufferTitle = createMetricTitle(title);
8
+ var canvasElt = createGraphCanvas();
9
+ var currentRangeRepInfoElt = createElement("div");
10
+ var loadingRangeRepInfoElt = createElement("div");
11
+ var bufferGraph = new SegmentBufferGraph(canvasElt);
12
+ var intervalId = setInterval(update, DEFAULT_REFRESH_INTERVAL);
13
+ cancelSignal.register(function () {
14
+ clearInterval(intervalId);
15
+ });
16
+ bufferGraphWrapper.appendChild(bufferTitle);
17
+ bufferGraphWrapper.appendChild(canvasElt);
18
+ bufferGraphWrapper.appendChild(currentRangeRepInfoElt);
19
+ bufferGraphWrapper.appendChild(loadingRangeRepInfoElt);
20
+ bufferGraphWrapper.style.padding = "5px 0px";
21
+ update();
22
+ return bufferGraphWrapper;
23
+ function update() {
24
+ var _a, _b, _c, _d;
25
+ if (instance.getVideoElement() === null) {
26
+ // disposed player. Clean-up everything
27
+ bufferGraphWrapper.style.display = "none";
28
+ bufferGraphWrapper.innerHTML = "";
29
+ clearInterval(intervalId);
30
+ return;
31
+ }
32
+ var showAllInfo = isExtendedMode(parentElt);
33
+ var inventory = instance.__priv_getSegmentBufferContent(bufferType);
34
+ if (inventory === null) {
35
+ bufferGraphWrapper.style.display = "none";
36
+ currentRangeRepInfoElt.innerHTML = "";
37
+ loadingRangeRepInfoElt.innerHTML = "";
38
+ }
39
+ else {
40
+ bufferGraphWrapper.style.display = "block";
41
+ var currentTime = instance.getPosition();
42
+ var width = Math.min(parentElt.clientWidth - 150, 600);
43
+ bufferGraph.update({
44
+ currentTime: currentTime,
45
+ minimumPosition: (_a = instance.getMinimumPosition()) !== null && _a !== void 0 ? _a : undefined,
46
+ maximumPosition: (_b = instance.getMaximumPosition()) !== null && _b !== void 0 ? _b : undefined,
47
+ inventory: inventory,
48
+ width: width,
49
+ height: 10,
50
+ });
51
+ if (!showAllInfo) {
52
+ currentRangeRepInfoElt.innerHTML = "";
53
+ loadingRangeRepInfoElt.innerHTML = "";
54
+ return;
55
+ }
56
+ currentRangeRepInfoElt.innerHTML = "";
57
+ for (var i = 0; i < inventory.length; i++) {
58
+ var rangeInfo = inventory[i];
59
+ var bufferedStart = rangeInfo.bufferedStart, bufferedEnd = rangeInfo.bufferedEnd, infos = rangeInfo.infos;
60
+ if (bufferedStart !== undefined && bufferedEnd !== undefined &&
61
+ currentTime >= bufferedStart && currentTime < bufferedEnd) {
62
+ currentRangeRepInfoElt.appendChild(createMetricTitle("play"));
63
+ currentRangeRepInfoElt.appendChild(createElement("span", {
64
+ textContent: constructRepresentationInfo(infos),
65
+ }));
66
+ break;
67
+ }
68
+ }
69
+ loadingRangeRepInfoElt.innerHTML = "";
70
+ var rep = (_c = instance.getCurrentRepresentations()) === null || _c === void 0 ? void 0 : _c[bufferType];
71
+ var adap = (_d = instance.getCurrentAdaptations()) === null || _d === void 0 ? void 0 : _d[bufferType];
72
+ var manifest = instance.getManifest();
73
+ if (manifest !== null && !isNullOrUndefined(rep) && !isNullOrUndefined(adap)) {
74
+ var period = manifest.getPeriodForTime(currentTime);
75
+ if (period !== undefined) {
76
+ loadingRangeRepInfoElt.appendChild(createMetricTitle("load"));
77
+ loadingRangeRepInfoElt.appendChild(createElement("span", {
78
+ textContent: constructRepresentationInfo({
79
+ period: period,
80
+ adaptation: adap,
81
+ representation: rep,
82
+ }),
83
+ }));
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ function constructRepresentationInfo(content) {
90
+ var _a;
91
+ var period = content.period;
92
+ var _b = content.adaptation, language = _b.language, isAudioDescription = _b.isAudioDescription, isClosedCaption = _b.isClosedCaption, isTrickModeTrack = _b.isTrickModeTrack, isSignInterpreted = _b.isSignInterpreted, bufferType = _b.type;
93
+ var _c = content.representation, id = _c.id, height = _c.height, width = _c.width, bitrate = _c.bitrate, codec = _c.codec;
94
+ var representationInfo = "\"".concat(id, "\" ");
95
+ if (height !== undefined && width !== undefined) {
96
+ representationInfo += "".concat(width, "x").concat(height, " ");
97
+ }
98
+ if (bitrate !== undefined) {
99
+ representationInfo += "(".concat((bitrate / 1000).toFixed(0), "kbps) ");
100
+ }
101
+ if (codec !== undefined) {
102
+ representationInfo += "c:\"".concat(codec, "\" ");
103
+ }
104
+ if (language !== undefined) {
105
+ representationInfo += "l:\"".concat(language, "\" ");
106
+ }
107
+ if (bufferType === "video" && typeof isSignInterpreted === "boolean") {
108
+ representationInfo += "si:".concat(isSignInterpreted ? 1 : 0, " ");
109
+ }
110
+ if (bufferType === "video" && typeof isTrickModeTrack === "boolean") {
111
+ representationInfo += "tm:".concat(isTrickModeTrack ? 1 : 0, " ");
112
+ }
113
+ if (bufferType === "audio" && typeof isAudioDescription === "boolean") {
114
+ representationInfo += "ad:".concat(isAudioDescription ? 1 : 0, " ");
115
+ }
116
+ if (bufferType === "text" && typeof isClosedCaption === "boolean") {
117
+ representationInfo += "cc:".concat(isClosedCaption ? 1 : 0, " ");
118
+ }
119
+ representationInfo += "p:".concat(period.start, "-").concat((_a = period.end) !== null && _a !== void 0 ? _a : "?");
120
+ return representationInfo;
121
+ }
@@ -0,0 +1,3 @@
1
+ import { CancellationSignal } from "../../../../utils/task_canceller";
2
+ import RxPlayer from "../../public_api";
3
+ export default function createSegmentBufferSizeGraph(instance: RxPlayer, parentElt: HTMLElement, cancelSignal: CancellationSignal): HTMLElement;
@@ -0,0 +1,35 @@
1
+ import BufferSizeGraph from "../buffer_size_graph";
2
+ import { DEFAULT_REFRESH_INTERVAL } from "../constants";
3
+ import { createElement, createGraphCanvas, createMetricTitle, } from "../utils";
4
+ export default function createSegmentBufferSizeGraph(instance, parentElt, cancelSignal) {
5
+ var bufferSizeGraphWrapperElt = createElement("div");
6
+ var bufferSizeTitle = createMetricTitle("bgap");
7
+ var canvasElt = createGraphCanvas();
8
+ var bufferSizeGraph = new BufferSizeGraph(canvasElt);
9
+ var intervalId = setInterval(addBufferSize, DEFAULT_REFRESH_INTERVAL);
10
+ cancelSignal.register(function () {
11
+ clearInterval(intervalId);
12
+ });
13
+ bufferSizeGraphWrapperElt.appendChild(bufferSizeTitle);
14
+ bufferSizeGraphWrapperElt.appendChild(canvasElt);
15
+ bufferSizeGraphWrapperElt.style.padding = "7px 0px";
16
+ addBufferSize();
17
+ return bufferSizeGraphWrapperElt;
18
+ function addBufferSize() {
19
+ if (instance.getVideoElement() === null) {
20
+ // disposed player. Clean-up everything
21
+ bufferSizeGraphWrapperElt.innerHTML = "";
22
+ clearInterval(intervalId);
23
+ return;
24
+ }
25
+ var bufferGap = instance.getVideoBufferGap();
26
+ if (bufferGap === Infinity) {
27
+ bufferSizeGraph.pushBufferSize(0);
28
+ }
29
+ else {
30
+ bufferSizeGraph.pushBufferSize(bufferGap);
31
+ }
32
+ var width = Math.min(parentElt.clientWidth - 150, 600);
33
+ bufferSizeGraph.reRender(width, 10);
34
+ }
35
+ }
@@ -0,0 +1,3 @@
1
+ import { CancellationSignal } from "../../../utils/task_canceller";
2
+ import RxPlayer from "../public_api";
3
+ export default function renderDebugElement(parentElt: HTMLElement, instance: RxPlayer, cancelSignal: CancellationSignal): void;
@@ -0,0 +1,32 @@
1
+ import constructDebugGeneralInfo from "./modules/general_info";
2
+ import createSegmentBufferGraph from "./modules/segment_buffer_content";
3
+ import createSegmentBufferSizeGraph from "./modules/segment_buffer_size";
4
+ import { createCompositeElement, createElement } from "./utils";
5
+ export default function renderDebugElement(parentElt, instance, cancelSignal) {
6
+ var debugElementTitleElt = createElement("div", {
7
+ textContent: "RxPlayer Debug Information",
8
+ });
9
+ debugElementTitleElt.style.fontWeight = "bold";
10
+ debugElementTitleElt.style.borderBottom = "1px solid white";
11
+ debugElementTitleElt.style.marginBottom = "5px";
12
+ debugElementTitleElt.style.fontStyle = "italic";
13
+ var debugWrapperElt = createCompositeElement("div", [
14
+ debugElementTitleElt,
15
+ constructDebugGeneralInfo(instance, parentElt, cancelSignal),
16
+ createSegmentBufferGraph(instance, "video", "vbuf", parentElt, cancelSignal),
17
+ createSegmentBufferGraph(instance, "audio", "abuf", parentElt, cancelSignal),
18
+ createSegmentBufferGraph(instance, "text", "tbuf", parentElt, cancelSignal),
19
+ createSegmentBufferSizeGraph(instance, parentElt, cancelSignal),
20
+ ]);
21
+ debugWrapperElt.style.backgroundColor = "#00000099";
22
+ debugWrapperElt.style.padding = "7px";
23
+ debugWrapperElt.style.fontSize = "13px";
24
+ debugWrapperElt.style.fontFamily = "mono";
25
+ debugWrapperElt.style.color = "white";
26
+ debugWrapperElt.style.display = "inline-block";
27
+ debugWrapperElt.style.bottom = "0px";
28
+ parentElt.appendChild(debugWrapperElt);
29
+ cancelSignal.register(function () {
30
+ parentElt.removeChild(debugWrapperElt);
31
+ });
32
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Create an HTML element.
3
+ * @param {string} elementName - The element's name, like `"div"` for example.
4
+ * @param {Object} [options={}] - Optional attributes for the element.
5
+ * @param {string} [options.textContent] - Inner text for that element.
6
+ * @param {string} [options.className] - Value for a `class` attribute
7
+ * associated to this element.
8
+ * @param {string} [options.href] - Value for a `href` attribute
9
+ * associated to this element.
10
+ * @returns {HTMLElement}
11
+ */
12
+ export declare function createElement(elementName: "input", opts?: CreateElementOptions | undefined): HTMLInputElement;
13
+ export declare function createElement(elementName: "button", opts?: CreateElementOptions | undefined): HTMLButtonElement;
14
+ export declare function createElement(elementName: "a", opts?: CreateElementOptions | undefined): HTMLLinkElement;
15
+ export declare function createElement(elementName: "canvas", opts?: CreateElementOptions | undefined): HTMLCanvasElement;
16
+ export declare function createElement(elementName: string, opts?: CreateElementOptions | undefined): HTMLElement;
17
+ interface CreateElementOptions {
18
+ textContent?: string | undefined;
19
+ className?: string | undefined;
20
+ }
21
+ /**
22
+ * Create an HTML element which may contain mutiple HTML sub-elements.
23
+ * @param {string} rootElementName - The element's name, like `"div"` for
24
+ * example.
25
+ * @param {Array.<string|HTMLElement>} parts - The HTML sub-elements, in order.
26
+ * Those can also just be strings, in which case only text nodes (and no actual
27
+ * HTMLElement) will be added at this place.
28
+ * @param {Object} [options={}] - Optional attributes for the element.
29
+ * @param {string} [options.className] - Value for a `class` attribute
30
+ * associated to this element.
31
+ * @returns {HTMLElement}
32
+ */
33
+ export declare function createCompositeElement(rootElementName: string, parts: Array<HTMLElement | string>, { className }?: {
34
+ className?: string;
35
+ } | undefined): HTMLElement;
36
+ export declare function isExtendedMode(parentElt: HTMLElement): boolean;
37
+ export declare function createMetricTitle(title: string): HTMLElement;
38
+ export declare function createGraphCanvas(): HTMLCanvasElement;
39
+ export {};
@@ -0,0 +1,57 @@
1
+ export function createElement(elementName, _a) {
2
+ var _b = _a === void 0 ? {} : _a, textContent = _b.textContent, className = _b.className;
3
+ var elt = document.createElement(elementName);
4
+ if (className !== undefined) {
5
+ elt.className = className;
6
+ }
7
+ if (textContent !== undefined) {
8
+ elt.textContent = textContent;
9
+ }
10
+ return elt;
11
+ }
12
+ /**
13
+ * Create an HTML element which may contain mutiple HTML sub-elements.
14
+ * @param {string} rootElementName - The element's name, like `"div"` for
15
+ * example.
16
+ * @param {Array.<string|HTMLElement>} parts - The HTML sub-elements, in order.
17
+ * Those can also just be strings, in which case only text nodes (and no actual
18
+ * HTMLElement) will be added at this place.
19
+ * @param {Object} [options={}] - Optional attributes for the element.
20
+ * @param {string} [options.className] - Value for a `class` attribute
21
+ * associated to this element.
22
+ * @returns {HTMLElement}
23
+ */
24
+ export function createCompositeElement(rootElementName, parts, _a) {
25
+ var _b = _a === void 0 ? {} : _a, className = _b.className;
26
+ var elt = document.createElement(rootElementName);
27
+ if (className !== undefined) {
28
+ elt.className = className;
29
+ }
30
+ for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {
31
+ var subElt = parts_1[_i];
32
+ if (typeof subElt === "string") {
33
+ elt.appendChild(document.createTextNode(subElt));
34
+ }
35
+ else {
36
+ elt.appendChild(subElt);
37
+ }
38
+ }
39
+ return elt;
40
+ }
41
+ export function isExtendedMode(parentElt) {
42
+ return parentElt.clientHeight > 400;
43
+ }
44
+ export function createMetricTitle(title) {
45
+ var elt = createElement("span", {
46
+ textContent: title + "/",
47
+ });
48
+ elt.style.fontWeight = "bold";
49
+ return elt;
50
+ }
51
+ export function createGraphCanvas() {
52
+ var canvasElt = createElement("canvas");
53
+ canvasElt.style.border = "1px solid white";
54
+ canvasElt.style.height = "15px";
55
+ canvasElt.style.marginLeft = "2px";
56
+ return canvasElt;
57
+ }
@@ -154,7 +154,7 @@ var PlaybackObserver = /** @class */ (function () {
154
154
  */
155
155
  PlaybackObserver.prototype.listen = function (cb, options) {
156
156
  var _a;
157
- if (this._canceller.isUsed || ((_a = options === null || options === void 0 ? void 0 : options.clearSignal) === null || _a === void 0 ? void 0 : _a.isCancelled) === true) {
157
+ if (this._canceller.isUsed() || ((_a = options === null || options === void 0 ? void 0 : options.clearSignal) === null || _a === void 0 ? void 0 : _a.isCancelled()) === true) {
158
158
  return noop;
159
159
  }
160
160
  this._observationRef.onUpdate(cb, {
@@ -565,7 +565,8 @@ function generateReadOnlyObserver(src, transform, cancellationSignal) {
565
565
  },
566
566
  listen: function (cb, options) {
567
567
  var _a;
568
- if (cancellationSignal.isCancelled || ((_a = options === null || options === void 0 ? void 0 : options.clearSignal) === null || _a === void 0 ? void 0 : _a.isCancelled) === true) {
568
+ if (cancellationSignal.isCancelled() ||
569
+ ((_a = options === null || options === void 0 ? void 0 : options.clearSignal) === null || _a === void 0 ? void 0 : _a.isCancelled()) === true) {
569
570
  return;
570
571
  }
571
572
  mappedRef.onUpdate(cb, {
@@ -161,6 +161,9 @@ declare class Player extends EventEmitter<IPublicAPIEvent> {
161
161
  };
162
162
  autoPlay?: boolean;
163
163
  }): void;
164
+ createDebugElement(element: HTMLElement): {
165
+ dispose(): void;
166
+ };
164
167
  /**
165
168
  * From given options, initialize content playback.
166
169
  * @param {Object} options
@@ -89,7 +89,7 @@ var Player = /** @class */ (function (_super) {
89
89
  // Workaround to support Firefox autoplay on FF 42.
90
90
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
91
91
  videoElement.preload = "auto";
92
- _this.version = /* PLAYER_VERSION */ "3.30.0-dev.2023020100";
92
+ _this.version = /* PLAYER_VERSION */ "3.30.0-dev.2023030200";
93
93
  _this.log = log;
94
94
  _this.state = "STOPPED";
95
95
  _this.videoElement = videoElement;
@@ -312,6 +312,18 @@ var Player = /** @class */ (function (_super) {
312
312
  }
313
313
  this._priv_initializeContentPlayback(newOptions);
314
314
  };
315
+ Player.prototype.createDebugElement = function (element) {
316
+ if (features.createDebugElement === null) {
317
+ throw new Error("Feature `DEBUG_ELEMENT` not added to the RxPlayer");
318
+ }
319
+ var canceller = new TaskCanceller();
320
+ features.createDebugElement(element, this, canceller.signal);
321
+ return {
322
+ dispose: function () {
323
+ canceller.cancel();
324
+ },
325
+ };
326
+ };
315
327
  /**
316
328
  * From given options, initialize content playback.
317
329
  * @param {Object} options
@@ -422,7 +434,7 @@ var Player = /** @class */ (function (_super) {
422
434
  }
423
435
  mediaElementTrackChoiceManager =
424
436
  this._priv_initializeMediaElementTrackChoiceManager(defaultAudioTrack, defaultTextTrack, currentContentCanceller.signal);
425
- if (currentContentCanceller.isUsed) {
437
+ if (currentContentCanceller.isUsed()) {
426
438
  return;
427
439
  }
428
440
  initializer = new features.directfile.initDirectFile({ autoPlay: autoPlay, keySystems: keySystems, speed: this._priv_speed, startAt: startAt, url: url });
@@ -589,7 +601,7 @@ var Player = /** @class */ (function (_super) {
589
601
  playerStateRef.onUpdate(function (newState) {
590
602
  updateReloadingMetadata(newState);
591
603
  _this._priv_setPlayerState(newState);
592
- if (currentContentCanceller.isUsed) {
604
+ if (currentContentCanceller.isUsed()) {
593
605
  return;
594
606
  }
595
607
  if (seekEventsCanceller !== null) {
@@ -599,15 +611,14 @@ var Player = /** @class */ (function (_super) {
599
611
  }
600
612
  }
601
613
  else if (isLoadedState(_this.state)) {
602
- seekEventsCanceller = new TaskCanceller({
603
- cancelOn: currentContentCanceller.signal,
604
- });
614
+ seekEventsCanceller = new TaskCanceller();
615
+ seekEventsCanceller.linkToSignal(currentContentCanceller.signal);
605
616
  emitSeekEvents(videoElement, playbackObserver, function () { return _this.trigger("seeking", null); }, function () { return _this.trigger("seeked", null); }, seekEventsCanceller.signal);
606
617
  }
607
618
  // Previous call could have performed all kind of side-effects, thus,
608
619
  // we re-check the current state associated to the RxPlayer
609
620
  if (_this.state === "ENDED" /* PLAYER_STATES.ENDED */ && _this._priv_stopAtEnd) {
610
- currentContentCanceller.cancel();
621
+ _this.stop();
611
622
  }
612
623
  }, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
613
624
  // React to playback conditions change
@@ -1933,16 +1944,16 @@ var Player = /** @class */ (function (_super) {
1933
1944
  this._priv_triggerEventIfNotStopped("videoTrackChange", null, cancelSignal);
1934
1945
  }
1935
1946
  this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", this.getAvailableAudioBitrates(), cancelSignal);
1936
- if (contentInfos.currentContentCanceller.isUsed) {
1947
+ if (contentInfos.currentContentCanceller.isUsed()) {
1937
1948
  return;
1938
1949
  }
1939
1950
  this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", this.getAvailableVideoBitrates(), cancelSignal);
1940
- if (contentInfos.currentContentCanceller.isUsed) {
1951
+ if (contentInfos.currentContentCanceller.isUsed()) {
1941
1952
  return;
1942
1953
  }
1943
1954
  var audioBitrate = (_f = (_e = (_d = this._priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) === null || _e === void 0 ? void 0 : _e.bitrate) !== null && _f !== void 0 ? _f : -1;
1944
1955
  this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", audioBitrate, cancelSignal);
1945
- if (contentInfos.currentContentCanceller.isUsed) {
1956
+ if (contentInfos.currentContentCanceller.isUsed()) {
1946
1957
  return;
1947
1958
  }
1948
1959
  var videoBitrate = (_j = (_h = (_g = this._priv_getCurrentRepresentations()) === null || _g === void 0 ? void 0 : _g.video) === null || _h === void 0 ? void 0 : _h.bitrate) !== null && _j !== void 0 ? _j : -1;
@@ -2230,7 +2241,7 @@ var Player = /** @class */ (function (_super) {
2230
2241
  */
2231
2242
  Player.prototype._priv_triggerAvailableBitratesChangeEvent = function (event, newVal, currentContentCancelSignal) {
2232
2243
  var prevVal = this._priv_contentEventsMemory[event];
2233
- if (!currentContentCancelSignal.isCancelled &&
2244
+ if (!currentContentCancelSignal.isCancelled() &&
2234
2245
  (prevVal === undefined || !areArraysOfNumbersEqual(newVal, prevVal))) {
2235
2246
  this._priv_contentEventsMemory[event] = newVal;
2236
2247
  this.trigger(event, newVal);
@@ -2244,7 +2255,7 @@ var Player = /** @class */ (function (_super) {
2244
2255
  * @param {Object} currentContentCancelSignal
2245
2256
  */
2246
2257
  Player.prototype._priv_triggerCurrentBitrateChangeEvent = function (event, newVal, currentContentCancelSignal) {
2247
- if (!currentContentCancelSignal.isCancelled &&
2258
+ if (!currentContentCancelSignal.isCancelled() &&
2248
2259
  newVal !== this._priv_contentEventsMemory[event]) {
2249
2260
  this._priv_contentEventsMemory[event] = newVal;
2250
2261
  this.trigger(event, newVal);
@@ -2268,7 +2279,7 @@ var Player = /** @class */ (function (_super) {
2268
2279
  * @param {Object} currentContentCancelSignal
2269
2280
  */
2270
2281
  Player.prototype._priv_triggerEventIfNotStopped = function (evt, arg, currentContentCancelSignal) {
2271
- if (!currentContentCancelSignal.isCancelled) {
2282
+ if (!currentContentCancelSignal.isCancelled()) {
2272
2283
  this.trigger(evt, arg);
2273
2284
  }
2274
2285
  };
@@ -2328,5 +2339,5 @@ var Player = /** @class */ (function (_super) {
2328
2339
  };
2329
2340
  return Player;
2330
2341
  }(EventEmitter));
2331
- Player.version = /* PLAYER_VERSION */ "3.30.0-dev.2023020100";
2342
+ Player.version = /* PLAYER_VERSION */ "3.30.0-dev.2023030200";
2332
2343
  export default Player;