rx-player 3.26.2 → 3.26.3-dev.2022021400

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 (218) hide show
  1. package/.github/workflows/perfs.yml +22 -0
  2. package/CHANGELOG.md +19 -1
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +6 -2
  5. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  6. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  7. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
  8. package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
  9. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
  10. package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
  11. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  12. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +20 -3
  13. package/dist/_esm5.processed/core/api/public_api.d.ts +3 -3
  14. package/dist/_esm5.processed/core/api/public_api.js +2 -2
  15. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
  16. package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.d.ts +0 -2
  17. package/dist/_esm5.processed/core/eme/__tests__/__global__/utils.js +5 -10
  18. package/dist/_esm5.processed/core/eme/find_key_system.js +15 -5
  19. package/dist/_esm5.processed/core/eme/types.d.ts +2 -2
  20. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
  21. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +1 -1
  22. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
  23. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +5 -1
  24. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
  25. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +2 -2
  26. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +1 -1
  27. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  28. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  29. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  30. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
  31. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
  32. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
  33. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +3 -4
  34. package/dist/_esm5.processed/errors/request_error.js +3 -1
  35. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  36. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -3
  37. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  38. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  39. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  40. package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
  41. package/dist/_esm5.processed/manifest/adaptation.js +3 -1
  42. package/dist/_esm5.processed/manifest/manifest.d.ts +9 -9
  43. package/dist/_esm5.processed/manifest/period.d.ts +3 -3
  44. package/dist/_esm5.processed/manifest/representation.d.ts +2 -2
  45. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
  46. package/dist/_esm5.processed/manifest/types.d.ts +3 -3
  47. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  48. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  49. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
  50. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  51. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
  52. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
  53. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
  54. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  55. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
  56. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +19 -4
  57. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  58. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  59. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
  60. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +24 -23
  61. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
  62. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
  63. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
  64. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
  65. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
  66. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
  67. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
  68. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
  69. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
  70. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
  71. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  72. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  73. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  74. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  75. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  76. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
  77. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
  78. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  79. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
  80. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  81. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  82. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
  83. package/dist/_esm5.processed/transports/dash/image_pipelines.js +1 -1
  84. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  85. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  86. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  87. package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
  88. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
  89. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
  90. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
  91. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
  92. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
  93. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  94. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
  95. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  96. package/dist/_esm5.processed/transports/smooth/pipelines.js +1 -1
  97. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
  98. package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
  99. package/dist/_esm5.processed/transports/types.d.ts +36 -30
  100. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  101. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
  102. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
  103. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  104. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
  105. package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
  106. package/dist/_esm5.processed/utils/request/fetch.js +7 -4
  107. package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
  108. package/dist/_esm5.processed/utils/request/xhr.js +2 -1
  109. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
  110. package/dist/rx-player.js +404 -321
  111. package/dist/rx-player.min.js +1 -1
  112. package/package.json +3 -4
  113. package/scripts/doc-generator/generate_header_html.js +6 -7
  114. package/scripts/doc-generator/generate_page_html.js +3 -4
  115. package/scripts/doc-generator/generate_page_list_html.js +4 -5
  116. package/scripts/doc-generator/generate_sidebar_html.js +4 -7
  117. package/scripts/doc-generator/utils.js +0 -11
  118. package/scripts/generate_demo_list.js +3 -3
  119. package/scripts/generate_documentation_list.js +3 -3
  120. package/scripts/launch_static_server.js +127 -67
  121. package/scripts/run_standalone_demo.js +1 -0
  122. package/scripts/start_demo_web_server.js +1 -0
  123. package/sonar-project.properties +1 -1
  124. package/src/compat/__tests__/fullscreen.test.ts +7 -7
  125. package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
  126. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  127. package/src/compat/eme/custom_media_keys/index.ts +7 -3
  128. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  129. package/src/core/abr/buffer_based_chooser.ts +85 -20
  130. package/src/core/abr/network_analyzer.ts +1 -1
  131. package/src/core/abr/pending_requests_store.ts +3 -5
  132. package/src/core/abr/representation_estimator.ts +6 -3
  133. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  134. package/src/core/api/public_api.ts +6 -6
  135. package/src/core/api/track_choice_manager.ts +10 -9
  136. package/src/core/eme/__tests__/__global__/utils.ts +5 -10
  137. package/src/core/eme/find_key_system.ts +14 -12
  138. package/src/core/eme/types.ts +2 -2
  139. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -5
  140. package/src/core/fetchers/segment/segment_fetcher.ts +6 -3
  141. package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
  142. package/src/core/init/initialize_directfile.ts +2 -2
  143. package/src/core/init/initialize_media_source.ts +2 -2
  144. package/src/core/init/manifest_update_scheduler.ts +7 -7
  145. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  146. package/src/core/init/stream_events_emitter/types.ts +2 -2
  147. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -3
  148. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
  149. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  150. package/src/core/stream/representation/force_garbage_collection.ts +3 -5
  151. package/src/errors/request_error.ts +4 -1
  152. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +3 -6
  153. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
  154. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  155. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  156. package/src/manifest/adaptation.ts +6 -4
  157. package/src/manifest/manifest.ts +10 -10
  158. package/src/manifest/period.ts +3 -3
  159. package/src/manifest/representation.ts +2 -2
  160. package/src/manifest/representation_index/types.ts +18 -18
  161. package/src/manifest/types.ts +3 -3
  162. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  163. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  164. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  165. package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
  166. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
  167. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
  168. package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
  169. package/src/parsers/manifest/dash/common/indexes/template.ts +17 -16
  170. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  171. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +50 -22
  172. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  173. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  174. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +58 -70
  175. package/src/parsers/manifest/dash/common/parse_mpd.ts +8 -8
  176. package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
  177. package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
  178. package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
  179. package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
  180. package/src/parsers/manifest/dash/parsers_types.ts +3 -3
  181. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  182. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
  183. package/src/parsers/manifest/smooth/create_parser.ts +23 -21
  184. package/src/parsers/manifest/smooth/representation_index.ts +14 -14
  185. package/src/parsers/manifest/types.ts +28 -28
  186. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
  187. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
  188. package/src/parsers/manifest/utils/index_helpers.ts +2 -2
  189. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  190. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  191. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  192. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  193. package/src/transports/dash/image_pipelines.ts +1 -1
  194. package/src/transports/dash/init_segment_loader.ts +1 -1
  195. package/src/transports/dash/manifest_parser.ts +1 -1
  196. package/src/transports/dash/segment_loader.ts +7 -7
  197. package/src/transports/dash/segment_parser.ts +3 -1
  198. package/src/transports/dash/text_loader.ts +2 -2
  199. package/src/transports/dash/text_parser.ts +3 -1
  200. package/src/transports/local/segment_loader.ts +4 -4
  201. package/src/transports/metaplaylist/manifest_loader.ts +1 -1
  202. package/src/transports/metaplaylist/pipelines.ts +1 -1
  203. package/src/transports/smooth/pipelines.ts +7 -7
  204. package/src/transports/smooth/segment_loader.ts +8 -8
  205. package/src/transports/types.ts +37 -30
  206. package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
  207. package/src/transports/utils/generate_manifest_loader.ts +1 -1
  208. package/src/utils/__tests__/flat_map.test.ts +12 -7
  209. package/src/utils/cancellable_sleep.ts +1 -1
  210. package/src/utils/cast_to_observable.ts +1 -2
  211. package/src/utils/request/fetch.ts +16 -13
  212. package/src/utils/request/xhr.ts +9 -7
  213. package/src/utils/rx-from_cancellable_promise.ts +1 -2
  214. package/tsconfig.json +1 -2
  215. package/tsconfig.modules.json +1 -2
  216. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  217. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  218. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
@@ -0,0 +1,22 @@
1
+ name: Performance tests
2
+ on:
3
+ pull_request:
4
+ types: [ labeled ]
5
+
6
+ jobs:
7
+ perf-tests:
8
+ if: ${{ github.event.label.name == 'Performance checks' }}
9
+ runs-on: [ubuntu-latest]
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Use Node.js ${{ matrix.node-version }}
13
+ uses: actions/setup-node@v2
14
+ with:
15
+ node-version: ${{ matrix.node-version }}
16
+ cache: 'npm'
17
+ # needed for integration & memory tests codecs support
18
+ - run: sudo add-apt-repository multiverse && sudo apt update && sudo apt install -y ubuntu-restricted-extras
19
+ - run: npm install
20
+ - run: export DISPLAY=:99
21
+ - run: sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional
22
+ - run: node tests/performance/run.js
package/CHANGELOG.md CHANGED
@@ -1,6 +1,24 @@
1
1
  # Changelog
2
2
 
3
- ## v3.26.2 (2022-01-XX)
3
+ ## v3.26.3-dev.2022021400 (2022-02-14)
4
+
5
+ ### Bug fixes
6
+
7
+ - subtitles: Fix rare issue where subtitles could be skipped due to a rounding error [#1064]
8
+ - DASH: fix issue where the wrong segments would be requested on $Number$-based MPD with a SegmentTimeline older than the `timeShiftBufferDepth` [#1052, #1060]
9
+ - directfile: disable all audio tracks before enabling one to work-around Safari issue on MacOS Monterey [#1067]
10
+ - avoid unnecessary warning logs when loading some initialization segments [#1049]
11
+ - TypeScript: Add forgotten TypeScript types in the exposed segment and manifest loader APIs [#1057]
12
+
13
+ ### Other improvements
14
+
15
+ - DASH: always consider that the non-last Period is finished when it contains SegmentTimeline elements [#1047]
16
+ - add better buffer cleaning logic on a browser's `QuotaExceededError` to better handle memory limitations [#1065]
17
+ - avoid mistakenly relying on pinkie's Promise implementation when a native one is already available [#1058]
18
+ - tests: add performance tests, to better catch and avoid performance regressions [#1053, #1062]
19
+
20
+
21
+ ## v3.26.2 (2022-01-11)
4
22
 
5
23
  ### Bug fixes
6
24
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.26.2
1
+ 3.26.3-dev.2022021400
@@ -129,13 +129,17 @@ else {
129
129
  supported = supported && (distinctiveIdentifier !== "required");
130
130
  if (supported) {
131
131
  var keySystemConfigurationResponse = {
132
- videoCapabilities: videoCapabilities,
133
- audioCapabilities: audioCapabilities,
134
132
  initDataTypes: ["cenc"],
135
133
  distinctiveIdentifier: "not-allowed",
136
134
  persistentState: "required",
137
135
  sessionTypes: ["temporary", "persistent-license"],
138
136
  };
137
+ if (videoCapabilities !== undefined) {
138
+ keySystemConfigurationResponse.videoCapabilities = videoCapabilities;
139
+ }
140
+ if (audioCapabilities !== undefined) {
141
+ keySystemConfigurationResponse.audioCapabilities = audioCapabilities;
142
+ }
139
143
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
140
144
  var customMediaKeys = createCustomMediaKeys_1(keyType);
141
145
  return observableOf(new CustomMediaKeySystemAccess(keyType, customMediaKeys, keySystemConfigurationResponse));
@@ -13,8 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Observable } from "rxjs";
17
- import { IBufferBasedChooserPlaybackObservation } from "./get_estimate_from_buffer_levels";
18
16
  /**
19
17
  * Choose a bitrate based on the currently available buffer.
20
18
  *
@@ -26,8 +24,32 @@ import { IBufferBasedChooserPlaybackObservation } from "./get_estimate_from_buff
26
24
  * "maintanable" or not.
27
25
  * If so, we may switch to a better quality, or conversely to a worse quality.
28
26
  *
29
- * @param {Observable} update$
30
- * @param {Array.<number>} bitrates
31
- * @returns {Observable}
27
+ * @class BufferBasedChooser
32
28
  */
33
- export default function BufferBasedChooser(update$: Observable<IBufferBasedChooserPlaybackObservation>, bitrates: number[]): Observable<number | undefined>;
29
+ export default class BufferBasedChooser {
30
+ private _levelsMap;
31
+ private _bitrates;
32
+ /**
33
+ * @param {Array.<number>} number;
34
+ */
35
+ constructor(bitrates: number[]);
36
+ /**
37
+ * @param {Object} playbackObservation
38
+ * @returns {number|undefined}
39
+ */
40
+ getEstimate(playbackObservation: IBufferBasedChooserPlaybackObservation): number | undefined;
41
+ }
42
+ /** Playback observation needed by the `BufferBasedChooser`. */
43
+ export interface IBufferBasedChooserPlaybackObservation {
44
+ /**
45
+ * Difference in seconds between the current position and the next
46
+ * non-buffered position
47
+ */
48
+ bufferGap: number;
49
+ /** The bitrate of the currently downloaded segments, in bps. */
50
+ currentBitrate?: number | undefined;
51
+ /** The "maintainability score" of the currently downloaded segments. */
52
+ currentScore?: number | undefined;
53
+ /** Playback rate wanted */
54
+ speed: number;
55
+ }
@@ -13,10 +13,9 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { map, } from "rxjs";
17
16
  import log from "../../log";
17
+ import arrayFindIndex from "../../utils/array_find_index";
18
18
  import getBufferLevels from "./get_buffer_levels";
19
- import getEstimateFromBufferLevels from "./get_estimate_from_buffer_levels";
20
19
  /**
21
20
  * Choose a bitrate based on the currently available buffer.
22
21
  *
@@ -28,14 +27,66 @@ import getEstimateFromBufferLevels from "./get_estimate_from_buffer_levels";
28
27
  * "maintanable" or not.
29
28
  * If so, we may switch to a better quality, or conversely to a worse quality.
30
29
  *
31
- * @param {Observable} update$
32
- * @param {Array.<number>} bitrates
33
- * @returns {Observable}
30
+ * @class BufferBasedChooser
34
31
  */
35
- export default function BufferBasedChooser(update$, bitrates) {
36
- var levelsMap = getBufferLevels(bitrates);
37
- log.debug("ABR: Steps for buffer based chooser.", levelsMap.map(function (l, i) { return ({ bufferLevel: l, bitrate: bitrates[i] }); }));
38
- return update$.pipe(map(function (playbackObservation) {
39
- return getEstimateFromBufferLevels(playbackObservation, bitrates, levelsMap);
40
- }));
41
- }
32
+ var BufferBasedChooser = /** @class */ (function () {
33
+ /**
34
+ * @param {Array.<number>} number;
35
+ */
36
+ function BufferBasedChooser(bitrates) {
37
+ this._levelsMap = getBufferLevels(bitrates);
38
+ this._bitrates = bitrates;
39
+ log.debug("ABR: Steps for buffer based chooser.", this._levelsMap.map(function (l, i) { return ({ bufferLevel: l, bitrate: bitrates[i] }); }));
40
+ }
41
+ /**
42
+ * @param {Object} playbackObservation
43
+ * @returns {number|undefined}
44
+ */
45
+ BufferBasedChooser.prototype.getEstimate = function (playbackObservation) {
46
+ var bufferLevels = this._levelsMap;
47
+ var bitrates = this._bitrates;
48
+ var bufferGap = playbackObservation.bufferGap, currentBitrate = playbackObservation.currentBitrate, currentScore = playbackObservation.currentScore, speed = playbackObservation.speed;
49
+ if (currentBitrate == null) {
50
+ return bitrates[0];
51
+ }
52
+ var currentBitrateIndex = arrayFindIndex(bitrates, function (b) { return b === currentBitrate; });
53
+ if (currentBitrateIndex < 0 || bitrates.length !== bufferLevels.length) {
54
+ log.error("ABR: Current Bitrate not found in the calculated levels");
55
+ return bitrates[0];
56
+ }
57
+ var scaledScore;
58
+ if (currentScore != null) {
59
+ scaledScore = speed === 0 ? currentScore : (currentScore / speed);
60
+ }
61
+ if (scaledScore != null && scaledScore > 1) {
62
+ var currentBufferLevel_1 = bufferLevels[currentBitrateIndex];
63
+ var nextIndex = (function () {
64
+ for (var i = currentBitrateIndex + 1; i < bufferLevels.length; i++) {
65
+ if (bufferLevels[i] > currentBufferLevel_1) {
66
+ return i;
67
+ }
68
+ }
69
+ })();
70
+ if (nextIndex != null) {
71
+ var nextBufferLevel = bufferLevels[nextIndex];
72
+ if (bufferGap >= nextBufferLevel) {
73
+ return bitrates[nextIndex];
74
+ }
75
+ }
76
+ }
77
+ if (scaledScore == null || scaledScore < 1.15) {
78
+ var currentBufferLevel = bufferLevels[currentBitrateIndex];
79
+ if (bufferGap < currentBufferLevel) {
80
+ for (var i = currentBitrateIndex - 1; i >= 0; i--) {
81
+ if (bitrates[i] < currentBitrate) {
82
+ return bitrates[i];
83
+ }
84
+ }
85
+ return currentBitrate;
86
+ }
87
+ }
88
+ return currentBitrate;
89
+ };
90
+ return BufferBasedChooser;
91
+ }());
92
+ export default BufferBasedChooser;
@@ -69,7 +69,7 @@ export default class NetworkAnalyzer {
69
69
  * @returns {Object}
70
70
  */
71
71
  getBandwidthEstimate(playbackInfo: IPlaybackConditionsInfo, bandwidthEstimator: BandwidthEstimator, currentRepresentation: Representation | null, currentRequests: IRequestInfo[], lastEstimatedBitrate: number | undefined): {
72
- bandwidthEstimate?: number;
72
+ bandwidthEstimate?: number | undefined;
73
73
  bitrateChosen: number;
74
74
  };
75
75
  /**
@@ -55,11 +55,9 @@ var PendingRequestsStore = /** @class */ (function () {
55
55
  */
56
56
  PendingRequestsStore.prototype.remove = function (id) {
57
57
  if (this._currentRequests[id] == null) {
58
- // TODO This breaks github actions.
59
- // Find why
60
- // if (__ENVIRONMENT__.CURRENT_ENV === __ENVIRONMENT__.DEV as number) {
61
- // throw new Error("ABR: can't remove unknown request");
62
- // }
58
+ if (0 /* CURRENT_ENV */ === 1 /* DEV */) {
59
+ throw new Error("ABR: can't remove unknown request");
60
+ }
63
61
  log.warn("ABR: can't remove unknown request");
64
62
  }
65
63
  delete this._currentRequests[id];
@@ -79,7 +79,7 @@ export interface IABREstimate {
79
79
  * have, you will most likely only want to do it when the Representation is
80
80
  * known to be maintaninable.
81
81
  */
82
- knownStableBitrate?: number;
82
+ knownStableBitrate?: number | undefined;
83
83
  }
84
84
  /** Media properties the `RepresentationEstimator` will need to keep track of. */
85
85
  export interface IRepresentationEstimatorPlaybackObservation {
@@ -137,8 +137,8 @@ export default function RepresentationEstimator(_a) {
137
137
  return { bufferGap: bufferGap, currentBitrate: currentBitrate, currentScore: currentScore, speed: speed };
138
138
  }));
139
139
  var bitrates = representations.map(function (r) { return r.bitrate; });
140
- var bufferBasedEstimation$ = BufferBasedChooser(bufferBasedobservation$, bitrates)
141
- .pipe(startWith(undefined));
140
+ var bufferBasedChooser = new BufferBasedChooser(bitrates);
141
+ var bufferBasedEstimation$ = bufferBasedobservation$.pipe(map(function (bbo) { return bufferBasedChooser.getEstimate(bbo); }), startWith(undefined));
142
142
  return observableCombineLatest([observation$,
143
143
  minAutoBitrate$,
144
144
  maxAutoBitrate$,
@@ -247,5 +247,11 @@ export default class MediaElementTrackChoiceManager extends EventEmitter<IMediaE
247
247
  * change events.
248
248
  */
249
249
  private _handleNativeTracksCallbacks;
250
+ /**
251
+ * Enable an audio track (and disable all others), based on its index in the
252
+ * `this._audioTracks` array.
253
+ * @param {number} index}
254
+ */
255
+ private _enableAudioTrackFromIndex;
250
256
  }
251
257
  export {};
@@ -28,6 +28,7 @@ var __extends = (this && this.__extends) || (function () {
28
28
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
29
29
  };
30
30
  })();
31
+ import assert from "../../utils/assert";
31
32
  import EventEmitter from "../../utils/event_emitter";
32
33
  import normalizeLanguage from "../../utils/languages";
33
34
  /**
@@ -205,7 +206,7 @@ var MediaElementTrackChoiceManager = /** @class */ (function (_super) {
205
206
  for (var i = 0; i < this._audioTracks.length; i++) {
206
207
  var _a = this._audioTracks[i], track = _a.track, nativeTrack = _a.nativeTrack;
207
208
  if (track.id === id) {
208
- nativeTrack.enabled = true;
209
+ this._enableAudioTrackFromIndex(i);
209
210
  this._audioTrackLockedOn = nativeTrack;
210
211
  return;
211
212
  }
@@ -433,7 +434,7 @@ var MediaElementTrackChoiceManager = /** @class */ (function (_super) {
433
434
  for (var i = 0; i < this._audioTracks.length; i++) {
434
435
  var nativeTrack = this._audioTracks[i].nativeTrack;
435
436
  if (nativeTrack === this._audioTrackLockedOn) {
436
- nativeTrack.enabled = true;
437
+ this._enableAudioTrackFromIndex(i);
437
438
  return;
438
439
  }
439
440
  }
@@ -457,7 +458,7 @@ var MediaElementTrackChoiceManager = /** @class */ (function (_super) {
457
458
  var audioTrack = this._audioTracks[j];
458
459
  if (audioTrack.track.normalized === normalized &&
459
460
  audioTrack.track.audioDescription === track.audioDescription) {
460
- audioTrack.nativeTrack.enabled = true;
461
+ this._enableAudioTrackFromIndex(j);
461
462
  return;
462
463
  }
463
464
  }
@@ -736,6 +737,22 @@ var MediaElementTrackChoiceManager = /** @class */ (function (_super) {
736
737
  };
737
738
  }
738
739
  };
740
+ /**
741
+ * Enable an audio track (and disable all others), based on its index in the
742
+ * `this._audioTracks` array.
743
+ * @param {number} index}
744
+ */
745
+ MediaElementTrackChoiceManager.prototype._enableAudioTrackFromIndex = function (index) {
746
+ assert(index < this._audioTracks.length);
747
+ // Seen on Safari MacOS only (2022-02-14), not disabling ALL audio tracks
748
+ // first (even the wanted one), can lead to the media not playing.
749
+ for (var _i = 0, _a = this._audioTracks; _i < _a.length; _i++) {
750
+ var audioTrack = _a[_i];
751
+ audioTrack.nativeTrack.enabled = false;
752
+ }
753
+ this._audioTracks[index].nativeTrack.enabled = true;
754
+ return;
755
+ };
739
756
  return MediaElementTrackChoiceManager;
740
757
  }(EventEmitter));
741
758
  export default MediaElementTrackChoiceManager;
@@ -35,13 +35,13 @@ interface IPositionUpdateItem {
35
35
  /** Amount of buffer available for now in front of the current position, in seconds. */
36
36
  bufferGap: number;
37
37
  /** Current maximum seekable position. */
38
- maximumBufferTime?: number;
39
- wallClockTime?: number;
38
+ maximumBufferTime?: number | undefined;
39
+ wallClockTime?: number | undefined;
40
40
  /**
41
41
  * Only for live contents. Difference between the "live edge" and the current
42
42
  * position, in seconds.
43
43
  */
44
- liveGap?: number;
44
+ liveGap?: number | undefined;
45
45
  }
46
46
  /** Payload emitted with a `bitrateEstimationChange` event. */
47
47
  interface IBitrateEstimate {
@@ -88,7 +88,7 @@ var Player = /** @class */ (function (_super) {
88
88
  // Workaround to support Firefox autoplay on FF 42.
89
89
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
90
90
  videoElement.preload = "auto";
91
- _this.version = /* PLAYER_VERSION */ "3.26.2";
91
+ _this.version = /* PLAYER_VERSION */ "3.26.3-dev.2022021400";
92
92
  _this.log = log;
93
93
  _this.state = "STOPPED";
94
94
  _this.videoElement = videoElement;
@@ -2264,5 +2264,5 @@ var Player = /** @class */ (function (_super) {
2264
2264
  };
2265
2265
  return Player;
2266
2266
  }(EventEmitter));
2267
- Player.version = /* PLAYER_VERSION */ "3.26.2";
2267
+ Player.version = /* PLAYER_VERSION */ "3.26.3-dev.2022021400";
2268
2268
  export default Player;
@@ -50,7 +50,7 @@ interface IVideoTrackPreferenceObject {
50
50
  interface ITMAudioRepresentation {
51
51
  id: string | number;
52
52
  bitrate: number;
53
- codec?: string;
53
+ codec?: string | undefined;
54
54
  }
55
55
  /** Audio track returned by the TrackChoiceManager. */
56
56
  export interface ITMAudioTrack {
@@ -75,11 +75,11 @@ export interface ITMTextTrack {
75
75
  interface ITMVideoRepresentation {
76
76
  id: string | number;
77
77
  bitrate: number;
78
- width?: number;
79
- height?: number;
80
- codec?: string;
81
- frameRate?: string;
82
- hdrInfo?: IHDRInformation;
78
+ width?: number | undefined;
79
+ height?: number | undefined;
80
+ codec?: string | undefined;
81
+ frameRate?: string | undefined;
82
+ hdrInfo?: IHDRInformation | undefined;
83
83
  }
84
84
  /** Video track returned by the TrackChoiceManager. */
85
85
  export interface ITMVideoTrack {
@@ -21,7 +21,6 @@ import EventEmitter from "../../../../utils/event_emitter";
21
21
  export declare const defaultKSConfig: {
22
22
  audioCapabilities: {
23
23
  contentType: string;
24
- robustness: undefined;
25
24
  }[];
26
25
  distinctiveIdentifier: "optional";
27
26
  initDataTypes: readonly ["cenc"];
@@ -29,7 +28,6 @@ export declare const defaultKSConfig: {
29
28
  sessionTypes: readonly ["temporary"];
30
29
  videoCapabilities: {
31
30
  contentType: string;
32
- robustness: undefined;
33
31
  }[];
34
32
  }[];
35
33
  /** Default Widevine MediaKeySystemAccess configuration used by the RxPlayer. */
@@ -55,20 +55,15 @@ import flatMap from "../../../../utils/flat_map";
55
55
  import { strToUtf8, utf8ToStr, } from "../../../../utils/string_parsing";
56
56
  /** Default MediaKeySystemAccess configuration used by the RxPlayer. */
57
57
  export var defaultKSConfig = [{
58
- audioCapabilities: [{ contentType: "audio/mp4;codecs=\"mp4a.40.2\"",
59
- robustness: undefined },
60
- { contentType: "audio/webm;codecs=opus",
61
- robustness: undefined }],
58
+ audioCapabilities: [{ contentType: "audio/mp4;codecs=\"mp4a.40.2\"" },
59
+ { contentType: "audio/webm;codecs=opus" }],
62
60
  distinctiveIdentifier: "optional",
63
61
  initDataTypes: ["cenc"],
64
62
  persistentState: "optional",
65
63
  sessionTypes: ["temporary"],
66
- videoCapabilities: [{ contentType: "video/mp4;codecs=\"avc1.4d401e\"",
67
- robustness: undefined },
68
- { contentType: "video/mp4;codecs=\"avc1.42e01e\"",
69
- robustness: undefined },
70
- { contentType: "video/webm;codecs=\"vp8\"",
71
- robustness: undefined }],
64
+ videoCapabilities: [{ contentType: "video/mp4;codecs=\"avc1.4d401e\"" },
65
+ { contentType: "video/mp4;codecs=\"avc1.42e01e\"" },
66
+ { contentType: "video/webm;codecs=\"vp8\"" }],
72
67
  }];
73
68
  /** Default Widevine MediaKeySystemAccess configuration used by the RxPlayer. */
74
69
  export var defaultWidevineConfig = (function () {
@@ -121,11 +121,21 @@ function buildKeySystemConfigurations(ksName, keySystem) {
121
121
  // More details here:
122
122
  // https://storage.googleapis.com/wvdocs/Chrome_EME_Changes_and_Best_Practices.pdf
123
123
  // https://www.w3.org/TR/encrypted-media/#get-supported-configuration-and-consent
124
- var videoCapabilities = flatMap(videoRobustnesses, function (robustness) { return [{ contentType: "video/mp4;codecs=\"avc1.4d401e\"", robustness: robustness },
125
- { contentType: "video/mp4;codecs=\"avc1.42e01e\"", robustness: robustness },
126
- { contentType: "video/webm;codecs=\"vp8\"", robustness: robustness }]; });
127
- var audioCapabilities = flatMap(audioRobustnesses, function (robustness) { return [{ contentType: "audio/mp4;codecs=\"mp4a.40.2\"", robustness: robustness },
128
- { contentType: "audio/webm;codecs=opus", robustness: robustness }]; });
124
+ var videoCapabilities = flatMap(audioRobustnesses, function (robustness) {
125
+ return ["video/mp4;codecs=\"avc1.4d401e\"",
126
+ "video/mp4;codecs=\"avc1.42e01e\"",
127
+ "video/webm;codecs=\"vp8\""].map(function (contentType) {
128
+ return robustness !== undefined ? { contentType: contentType, robustness: robustness } :
129
+ { contentType: contentType };
130
+ });
131
+ });
132
+ var audioCapabilities = flatMap(audioRobustnesses, function (robustness) {
133
+ return ["audio/mp4;codecs=\"mp4a.40.2\"",
134
+ "audio/webm;codecs=opus"].map(function (contentType) {
135
+ return robustness !== undefined ? { contentType: contentType, robustness: robustness } :
136
+ { contentType: contentType };
137
+ });
138
+ });
129
139
  // TODO Re-test with a set contentType but an undefined robustness on the
130
140
  // STBs on which this problem was found.
131
141
  //
@@ -34,7 +34,7 @@ export interface IInitializationDataInfo {
34
34
  * `undefined` when not known (different from an empty array - which would
35
35
  * just mean that there's no key id involved).
36
36
  */
37
- keyIds?: Uint8Array[];
37
+ keyIds?: Uint8Array[] | undefined;
38
38
  /** Every initialization data for that type. */
39
39
  values: Array<{
40
40
  /**
@@ -272,7 +272,7 @@ export interface IContentProtection {
272
272
  * `undefined` when not known (different from an empty array - which would
273
273
  * just mean that there's no key id involved).
274
274
  */
275
- keyIds?: Uint8Array[];
275
+ keyIds?: Uint8Array[] | undefined;
276
276
  /** Every initialization data for that type. */
277
277
  values: Array<{
278
278
  /**
@@ -27,10 +27,10 @@ export interface IManifestFetcherParsedResult {
27
27
  * The time (`performance.now()`) at which the request was started (at which
28
28
  * the JavaScript call was done).
29
29
  */
30
- sendingTime?: number;
30
+ sendingTime?: number | undefined;
31
31
  /** The time (`performance.now()`) at which the request was fully received. */
32
- receivedTime?: number;
33
- parsingTime?: number;
32
+ receivedTime?: number | undefined;
33
+ parsingTime?: number | undefined;
34
34
  }
35
35
  /** Emitted when a fetching or parsing minor error happened. */
36
36
  export interface IManifestFetcherWarningEvent {
@@ -51,7 +51,7 @@ export interface IManifestFetcherParserOptions {
51
51
  * If set, offset to add to `performance.now()` to obtain the current
52
52
  * server's time.
53
53
  */
54
- externalClockOffset?: number;
54
+ externalClockOffset?: number | undefined;
55
55
  /** The previous value of the Manifest (when updating). */
56
56
  previousManifest: Manifest | null;
57
57
  /**
@@ -49,12 +49,12 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
49
49
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
50
50
  }
51
51
  };
52
- import PPromise from "pinkie";
53
52
  import { Observable, } from "rxjs";
54
53
  import config from "../../../config";
55
54
  import { formatError, } from "../../../errors";
56
55
  import log from "../../../log";
57
56
  import assert from "../../../utils/assert";
57
+ import PPromise from "../../../utils/promise";
58
58
  import TaskCanceller from "../../../utils/task_canceller";
59
59
  import errorSelector from "../utils/error_selector";
60
60
  import { tryRequestPromiseWithBackoff, } from "../utils/try_urls_with_backoff";
@@ -130,7 +130,7 @@ export interface ISegmentFetcherOptions {
130
130
  * @returns {Object}
131
131
  */
132
132
  export declare function getSegmentFetcherOptions(bufferType: string, { maxRetryRegular, maxRetryOffline, lowLatencyMode }: {
133
- maxRetryRegular?: number;
134
- maxRetryOffline?: number;
133
+ maxRetryRegular?: number | undefined;
134
+ maxRetryOffline?: number | undefined;
135
135
  lowLatencyMode: boolean;
136
136
  }): ISegmentFetcherOptions;
@@ -76,7 +76,8 @@ export default function createSegmentFetcher(bufferType, pipeline, callbacks, op
76
76
  /**
77
77
  * If the request succeeded, set to the corresponding
78
78
  * `IChunkCompleteInformation` object.
79
- * If the request failed or was cancelled, set to `null`.
79
+ * For any other completion cases: if the request either failed, was
80
+ * cancelled or just if no request was needed, set to `null`.
80
81
  *
81
82
  * Stays to `undefined` when the request is still pending.
82
83
  */
@@ -162,6 +163,9 @@ export default function createSegmentFetcher(bufferType, pipeline, callbacks, op
162
163
  requestInfo = res.resultData;
163
164
  sendNetworkMetricsIfAvailable();
164
165
  }
166
+ else {
167
+ requestInfo = null;
168
+ }
165
169
  if (!canceller.isUsed) {
166
170
  // The current Observable could have been canceled as a result of one
167
171
  // of the previous `next` calls. In that case, we don't want to send
@@ -49,12 +49,12 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
49
49
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
50
50
  }
51
51
  };
52
- import PPromise from "pinkie";
53
52
  import { isOffline } from "../../../compat";
54
53
  import { CustomLoaderError, isKnownError, NetworkErrorTypes, RequestError, } from "../../../errors";
55
54
  import log from "../../../log";
56
55
  import cancellableSleep from "../../../utils/cancellable_sleep";
57
56
  import getFuzzedDelay from "../../../utils/get_fuzzed_delay";
57
+ import PPromise from "../../../utils/promise";
58
58
  import TaskCanceller from "../../../utils/task_canceller";
59
59
  /**
60
60
  * Called on a loader error.
@@ -29,8 +29,8 @@ export interface IDirectFileOptions {
29
29
  mediaElement: HTMLMediaElement;
30
30
  playbackObserver: PlaybackObserver;
31
31
  speed: IReadOnlySharedReference<number>;
32
- startAt?: IInitialTimeOptions;
33
- url?: string;
32
+ startAt?: IInitialTimeOptions | undefined;
33
+ url?: string | undefined;
34
34
  }
35
35
  /**
36
36
  * Launch a content in "Directfile mode".
@@ -67,7 +67,7 @@ export interface IInitializeArguments {
67
67
  /** Emit the playback rate (speed) set by the user. */
68
68
  speed: IReadOnlySharedReference<number>;
69
69
  /** The configured starting position. */
70
- startAt?: IInitialTimeOptions;
70
+ startAt?: IInitialTimeOptions | undefined;
71
71
  /** Configuration specific to the text track. */
72
72
  textTrackOptions: ITextTrackSegmentBufferOptions;
73
73
  }
@@ -24,9 +24,9 @@ export interface IManifestUpdateSchedulerArguments {
24
24
  /** Information about the initial load of the manifest */
25
25
  initialManifest: {
26
26
  manifest: Manifest;
27
- sendingTime?: number;
28
- receivedTime?: number;
29
- parsingTime?: number;
27
+ sendingTime?: number | undefined;
28
+ receivedTime?: number | undefined;
29
+ parsingTime?: number | undefined;
30
30
  };
31
31
  /** Minimum interval to keep between Manifest updates */
32
32
  minimumManifestUpdateInterval: number;
@@ -47,7 +47,7 @@ export interface IManifestRefreshSchedulerEvent {
47
47
  * Optional wanted refresh delay, which is the minimum time you want to wait
48
48
  * before updating the Manifest
49
49
  */
50
- delay?: number;
50
+ delay?: number | undefined;
51
51
  /**
52
52
  * Whether the parsing can be done in the more efficient "unsafeMode".
53
53
  * This mode is extremely fast but can lead to de-synchronisation with the
@@ -28,12 +28,12 @@
28
28
  * @returns {Boolean}
29
29
  */
30
30
  declare function areSameStreamEvents(evt1: {
31
- id?: string;
31
+ id?: string | undefined;
32
32
  start: number;
33
- end?: number;
33
+ end?: number | undefined;
34
34
  }, evt2: {
35
- id?: string;
35
+ id?: string | undefined;
36
36
  start: number;
37
- end?: number;
37
+ end?: number | undefined;
38
38
  }): boolean;
39
39
  export default areSameStreamEvents;