rx-player 3.28.1-dev.2022083000 → 3.29.0-dev.2022090500

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 (139) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/VERSION +1 -1
  3. package/dist/_esm5.processed/compat/event_listeners.d.ts +18 -2
  4. package/dist/_esm5.processed/compat/event_listeners.js +64 -2
  5. package/dist/_esm5.processed/compat/on_height_width_change.d.ts +5 -4
  6. package/dist/_esm5.processed/compat/on_height_width_change.js +43 -34
  7. package/dist/_esm5.processed/core/api/playback_observer.d.ts +12 -2
  8. package/dist/_esm5.processed/core/api/playback_observer.js +27 -12
  9. package/dist/_esm5.processed/core/api/public_api.js +14 -14
  10. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +7 -0
  11. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +10 -2
  12. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  13. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +10 -4
  14. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +7 -0
  15. package/dist/_esm5.processed/core/init/initialize_directfile.js +1 -1
  16. package/dist/_esm5.processed/core/init/load_on_media_source.js +1 -1
  17. package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -2
  18. package/dist/_esm5.processed/core/init/stall_avoider.js +32 -26
  19. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +12 -6
  20. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +142 -78
  21. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -16
  22. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +53 -41
  23. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +6 -5
  24. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +37 -39
  25. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +23 -22
  26. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +84 -72
  27. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +6 -12
  28. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +33 -43
  29. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +12 -9
  30. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +7 -6
  31. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +17 -10
  32. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +20 -9
  33. package/dist/_esm5.processed/core/stream/period/period_stream.js +25 -14
  34. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -7
  35. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +80 -23
  36. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +5 -4
  37. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +78 -26
  38. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -3
  39. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +7 -1
  40. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +7 -1
  41. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -8
  42. package/dist/_esm5.processed/default_config.js +1 -1
  43. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -2
  44. package/dist/_esm5.processed/errors/custom_loader_error.js +3 -2
  45. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +5 -2
  46. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.js +5 -2
  47. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +9 -2
  48. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +3 -1
  49. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +4 -3
  50. package/dist/_esm5.processed/public_types.d.ts +22 -3
  51. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -2
  52. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
  53. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -1
  54. package/dist/_esm5.processed/transports/dash/init_segment_loader.d.ts +3 -2
  55. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +12 -6
  56. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.d.ts +3 -2
  57. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +3 -2
  58. package/dist/_esm5.processed/transports/dash/manifest_parser.js +6 -2
  59. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +3 -2
  60. package/dist/_esm5.processed/transports/dash/segment_loader.js +12 -9
  61. package/dist/_esm5.processed/transports/dash/text_loader.js +6 -3
  62. package/dist/_esm5.processed/transports/local/pipelines.d.ts +2 -2
  63. package/dist/_esm5.processed/transports/local/pipelines.js +6 -6
  64. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
  65. package/dist/_esm5.processed/transports/local/segment_loader.js +4 -3
  66. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +2 -2
  67. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +5 -2
  68. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +15 -10
  69. package/dist/_esm5.processed/transports/smooth/pipelines.d.ts +1 -1
  70. package/dist/_esm5.processed/transports/smooth/pipelines.js +18 -14
  71. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +2 -2
  72. package/dist/_esm5.processed/transports/smooth/segment_loader.js +8 -6
  73. package/dist/_esm5.processed/transports/types.d.ts +25 -2
  74. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.d.ts +2 -2
  75. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  76. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +2 -2
  77. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +9 -6
  78. package/dist/_esm5.processed/utils/request/fetch.js +7 -8
  79. package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
  80. package/dist/_esm5.processed/utils/request/xhr.js +28 -14
  81. package/dist/_esm5.processed/utils/task_canceller.d.ts +1 -2
  82. package/dist/_esm5.processed/utils/task_canceller.js +1 -2
  83. package/dist/mpd-parser.wasm +0 -0
  84. package/dist/rx-player.js +1116 -695
  85. package/dist/rx-player.min.js +1 -1
  86. package/package.json +7 -7
  87. package/sonar-project.properties +1 -1
  88. package/src/compat/event_listeners.ts +86 -1
  89. package/src/compat/on_height_width_change.ts +48 -49
  90. package/src/core/api/playback_observer.ts +34 -14
  91. package/src/core/api/public_api.ts +23 -18
  92. package/src/core/fetchers/manifest/manifest_fetcher.ts +20 -2
  93. package/src/core/fetchers/segment/segment_fetcher.ts +23 -3
  94. package/src/core/fetchers/segment/segment_fetcher_creator.ts +7 -0
  95. package/src/core/init/initialize_directfile.ts +1 -1
  96. package/src/core/init/load_on_media_source.ts +1 -0
  97. package/src/core/init/stall_avoider.ts +40 -26
  98. package/src/core/segment_buffers/garbage_collector.ts +55 -47
  99. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +92 -70
  100. package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +37 -42
  101. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +103 -105
  102. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +35 -46
  103. package/src/core/segment_buffers/implementations/types.ts +22 -9
  104. package/src/core/segment_buffers/segment_buffers_store.ts +23 -14
  105. package/src/core/stream/orchestrator/stream_orchestrator.ts +31 -12
  106. package/src/core/stream/period/period_stream.ts +31 -18
  107. package/src/core/stream/representation/append_segment_to_buffer.ts +27 -42
  108. package/src/core/stream/representation/force_garbage_collection.ts +28 -32
  109. package/src/core/stream/representation/get_buffer_status.ts +7 -3
  110. package/src/core/stream/representation/push_init_segment.ts +12 -6
  111. package/src/core/stream/representation/push_media_segment.ts +12 -6
  112. package/src/core/stream/representation/representation_stream.ts +11 -5
  113. package/src/default_config.ts +17 -17
  114. package/src/errors/custom_loader_error.ts +3 -2
  115. package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +7 -2
  116. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +6 -2
  117. package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +10 -2
  118. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +3 -1
  119. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +4 -3
  120. package/src/public_types.ts +28 -4
  121. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  122. package/src/transports/dash/image_pipelines.ts +4 -0
  123. package/src/transports/dash/init_segment_loader.ts +8 -0
  124. package/src/transports/dash/low_latency_segment_loader.ts +4 -0
  125. package/src/transports/dash/manifest_parser.ts +4 -0
  126. package/src/transports/dash/segment_loader.ts +21 -5
  127. package/src/transports/dash/text_loader.ts +7 -2
  128. package/src/transports/local/pipelines.ts +7 -5
  129. package/src/transports/local/segment_loader.ts +4 -2
  130. package/src/transports/metaplaylist/manifest_loader.ts +9 -2
  131. package/src/transports/metaplaylist/pipelines.ts +16 -6
  132. package/src/transports/smooth/pipelines.ts +17 -9
  133. package/src/transports/smooth/segment_loader.ts +8 -0
  134. package/src/transports/types.ts +27 -0
  135. package/src/transports/utils/call_custom_manifest_loader.ts +8 -2
  136. package/src/transports/utils/generate_manifest_loader.ts +18 -5
  137. package/src/utils/request/fetch.ts +7 -8
  138. package/src/utils/request/xhr.ts +31 -15
  139. package/src/utils/task_canceller.ts +1 -2
@@ -14,4 +14,4 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { ITransportOptions, ITransportPipelines } from "../types";
17
- export default function (options: ITransportOptions): ITransportPipelines;
17
+ export default function (transportOptions: ITransportOptions): ITransportPipelines;
@@ -95,10 +95,10 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
95
95
  }
96
96
  }
97
97
  }
98
- export default function (options) {
99
- var smoothManifestParser = createSmoothManifestParser(options);
100
- var segmentLoader = generateSegmentLoader(options);
101
- var manifestLoaderOptions = { customManifestLoader: options.manifestLoader };
98
+ export default function (transportOptions) {
99
+ var smoothManifestParser = createSmoothManifestParser(transportOptions);
100
+ var segmentLoader = generateSegmentLoader(transportOptions);
101
+ var manifestLoaderOptions = { customManifestLoader: transportOptions.manifestLoader };
102
102
  var manifestLoader = generateManifestLoader(manifestLoaderOptions, "text");
103
103
  var manifestPipeline = {
104
104
  // TODO (v4.x.x) Remove that function
@@ -138,9 +138,9 @@ export default function (options) {
138
138
  responseData; // TODO find a way to check if Document?
139
139
  var parserResult = smoothManifestParser(documentData, url, manifestReceivedTime);
140
140
  var manifest = new Manifest(parserResult, {
141
- representationFilter: options.representationFilter,
142
- supplementaryImageTracks: options.supplementaryImageTracks,
143
- supplementaryTextTracks: options.supplementaryTextTracks,
141
+ representationFilter: transportOptions.representationFilter,
142
+ supplementaryImageTracks: transportOptions.supplementaryImageTracks,
143
+ supplementaryTextTracks: transportOptions.supplementaryTextTracks,
144
144
  });
145
145
  return { manifest: manifest, url: url };
146
146
  },
@@ -154,12 +154,13 @@ export default function (options) {
154
154
  * Load a Smooth audio/video segment.
155
155
  * @param {string|null} url
156
156
  * @param {Object} content
157
+ * @param {Object} loaderOptions
157
158
  * @param {Object} cancelSignal
158
159
  * @param {Object} callbacks
159
160
  * @returns {Promise}
160
161
  */
161
- loadSegment: function (url, content, cancelSignal, callbacks) {
162
- return segmentLoader(url, content, cancelSignal, callbacks);
162
+ loadSegment: function (url, content, loaderOptions, cancelSignal, callbacks) {
163
+ return segmentLoader(url, content, loaderOptions, cancelSignal, callbacks);
163
164
  },
164
165
  parseSegment: function (loadedSegment, content, initTimescale) {
165
166
  var _a, _b;
@@ -213,7 +214,7 @@ export default function (options) {
213
214
  },
214
215
  };
215
216
  var textTrackPipeline = {
216
- loadSegment: function (url, content, cancelSignal, callbacks) {
217
+ loadSegment: function (url, content, loaderOptions, cancelSignal, callbacks) {
217
218
  var segment = content.segment, representation = content.representation;
218
219
  if (segment.isInit || url === null) {
219
220
  return Promise.resolve({ resultType: "segment-created",
@@ -221,14 +222,16 @@ export default function (options) {
221
222
  }
222
223
  var isMP4 = isMP4EmbeddedTrack(representation);
223
224
  if (!isMP4) {
224
- return request({ url: url, responseType: "text", cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
225
+ return request({ url: url, responseType: "text",
226
+ timeout: loaderOptions.timeout, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
225
227
  .then(function (data) { return ({ resultType: "segment-loaded",
226
228
  resultData: data }); });
227
229
  }
228
230
  else {
229
- return request({ url: url, responseType: "arraybuffer", cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
231
+ return request({ url: url, responseType: "arraybuffer",
232
+ timeout: loaderOptions.timeout, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
230
233
  .then(function (data) {
231
- if (options.checkMediaSegmentIntegrity !== true) {
234
+ if (transportOptions.checkMediaSegmentIntegrity !== true) {
232
235
  return { resultType: "segment-loaded",
233
236
  resultData: data };
234
237
  }
@@ -365,7 +368,7 @@ export default function (options) {
365
368
  },
366
369
  };
367
370
  var imageTrackPipeline = {
368
- loadSegment: function (url, content, cancelSignal, callbacks) {
371
+ loadSegment: function (url, content, loaderOptions, cancelSignal, callbacks) {
369
372
  return __awaiter(this, void 0, void 0, function () {
370
373
  var data;
371
374
  return __generator(this, function (_a) {
@@ -377,6 +380,7 @@ export default function (options) {
377
380
  resultData: null }];
378
381
  }
379
382
  return [4 /*yield*/, request({ url: url, responseType: "arraybuffer",
383
+ timeout: loaderOptions.timeout,
380
384
  onProgress: callbacks.onProgress, cancelSignal: cancelSignal })];
381
385
  case 1:
382
386
  data = _a.sent();
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { ISegmentLoader as ICustomSegmentLoader } from "../../public_types";
17
17
  import { CancellationSignal } from "../../utils/task_canceller";
18
- import { ISegmentContext, ISegmentLoaderCallbacks, ISegmentLoaderResultSegmentCreated, ISegmentLoaderResultSegmentLoaded } from "../types";
18
+ import { ISegmentContext, ISegmentLoaderCallbacks, ISegmentLoaderOptions, ISegmentLoaderResultSegmentCreated, ISegmentLoaderResultSegmentLoaded } from "../types";
19
19
  /**
20
20
  * Defines the url for the request, load the right loader (custom/default
21
21
  * one).
@@ -23,5 +23,5 @@ import { ISegmentContext, ISegmentLoaderCallbacks, ISegmentLoaderResultSegmentCr
23
23
  declare const generateSegmentLoader: ({ checkMediaSegmentIntegrity, customSegmentLoader, }: {
24
24
  checkMediaSegmentIntegrity?: boolean | undefined;
25
25
  customSegmentLoader?: ICustomSegmentLoader | undefined;
26
- }) => (url: string | null, content: ISegmentContext, cancelSignal: CancellationSignal, callbacks: ISegmentLoaderCallbacks<Uint8Array | ArrayBuffer | null>) => Promise<ISegmentLoaderResultSegmentLoaded<Uint8Array | ArrayBuffer | null> | ISegmentLoaderResultSegmentCreated<Uint8Array | ArrayBuffer | null>>;
26
+ }) => (url: string | null, content: ISegmentContext, loaderOptions: ISegmentLoaderOptions, cancelSignal: CancellationSignal, callbacks: ISegmentLoaderCallbacks<Uint8Array | ArrayBuffer | null>) => Promise<ISegmentLoaderResultSegmentLoaded<Uint8Array | ArrayBuffer | null> | ISegmentLoaderResultSegmentCreated<Uint8Array | ArrayBuffer | null>>;
27
27
  export default generateSegmentLoader;
@@ -35,18 +35,19 @@ import { isMP4EmbeddedTrack } from "./utils";
35
35
  * Segment loader triggered if there was no custom-defined one in the API.
36
36
  * @param {string} url
37
37
  * @param {Object} content
38
+ * @param {Object} loaderOptions
38
39
  * @param {Object} callbacks
39
40
  * @param {Object} cancelSignal
40
41
  * @param {boolean} checkMediaSegmentIntegrity
41
42
  * @returns {Promise}
42
43
  */
43
- function regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaSegmentIntegrity) {
44
+ function regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity) {
44
45
  var headers;
45
46
  var range = content.segment.range;
46
47
  if (Array.isArray(range)) {
47
48
  headers = { Range: byteRange(range) };
48
49
  }
49
- return request({ url: url, responseType: "arraybuffer", headers: headers, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
50
+ return request({ url: url, responseType: "arraybuffer", headers: headers, timeout: loaderOptions.timeout, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
50
51
  .then(function (data) {
51
52
  var isMP4 = isMP4EmbeddedTrack(content.representation);
52
53
  if (!isMP4 || checkMediaSegmentIntegrity !== true) {
@@ -65,7 +66,7 @@ function regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaS
65
66
  */
66
67
  var generateSegmentLoader = function (_a) {
67
68
  var checkMediaSegmentIntegrity = _a.checkMediaSegmentIntegrity, customSegmentLoader = _a.customSegmentLoader;
68
- return function (url, content, cancelSignal, callbacks) {
69
+ return function (url, content, loaderOptions, cancelSignal, callbacks) {
69
70
  var segment = content.segment, manifest = content.manifest, period = content.period, adaptation = content.adaptation, representation = content.representation;
70
71
  if (segment.isInit) {
71
72
  if (segment.privateInfos === undefined ||
@@ -105,9 +106,10 @@ var generateSegmentLoader = function (_a) {
105
106
  resultData: null });
106
107
  }
107
108
  else {
108
- var args_1 = { adaptation: adaptation, manifest: manifest, period: period, representation: representation, segment: segment, transport: "smooth", url: url };
109
+ var args_1 = { adaptation: adaptation, manifest: manifest, period: period, representation: representation, segment: segment, transport: "smooth",
110
+ timeout: loaderOptions.timeout, url: url };
109
111
  if (typeof customSegmentLoader !== "function") {
110
- return regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaSegmentIntegrity);
112
+ return regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity);
111
113
  }
112
114
  return new Promise(function (res, rej) {
113
115
  /** `true` when the custom segmentLoader should not be active anymore. */
@@ -169,7 +171,7 @@ var generateSegmentLoader = function (_a) {
169
171
  }
170
172
  hasFinished = true;
171
173
  cancelSignal.deregister(abortCustomLoader);
172
- regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaSegmentIntegrity)
174
+ regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity)
173
175
  .then(res, rej);
174
176
  };
175
177
  var customCallbacks = { reject: reject, resolve: resolve, fallback: fallback, progress: progress };
@@ -65,7 +65,7 @@ export interface ITransportManifestPipeline {
65
65
  * - The loading operation failed, most likely due to a request error.
66
66
  * In that case, this Promise will reject with the corresponding Error.
67
67
  */
68
- loadManifest: (url: string | undefined, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>;
68
+ loadManifest: (url: string | undefined, options: IManifestLoaderOptions, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>;
69
69
  /**
70
70
  * "Parser" of the Manifest pipeline, allowing to parse a loaded Manifest so
71
71
  * it can be exploited by the rest of the RxPlayer's logic.
@@ -154,6 +154,19 @@ export interface ITransportManifestPipeline {
154
154
  */
155
155
  resolveManifestUrl?: (url: string | undefined, cancelSignal: CancellationSignal) => Promise<string | undefined>;
156
156
  }
157
+ /**
158
+ * Options given to the `loadManifest` method of an
159
+ * `ITransportManifestPipeline` to configure its behavior.
160
+ */
161
+ export interface IManifestLoaderOptions {
162
+ /**
163
+ * Timeout, in milliseconds, after which a manifest request should be aborted
164
+ * with the corresponding error.
165
+ *
166
+ * `undefined` means that no timeout will be enforced.
167
+ */
168
+ timeout?: number | undefined;
169
+ }
157
170
  /** Functions allowing to load and parse segments of any type. */
158
171
  export interface ISegmentPipeline<TLoadedFormat, TParsedSegmentDataFormat> {
159
172
  loadSegment: ISegmentLoader<TLoadedFormat>;
@@ -175,7 +188,17 @@ export interface ISegmentPipeline<TLoadedFormat, TParsedSegmentDataFormat> {
175
188
  * @returns {Promise.<Object>} - Promise resolving when it has finished loading
176
189
  * the segment.
177
190
  */
178
- export declare type ISegmentLoader<TLoadedFormat> = (url: string | null, content: ISegmentContext, cancelSignal: CancellationSignal, callbacks: ISegmentLoaderCallbacks<TLoadedFormat>) => Promise<ISegmentLoaderResultSegmentCreated<TLoadedFormat> | ISegmentLoaderResultSegmentLoaded<TLoadedFormat> | ISegmentLoaderResultChunkedComplete>;
191
+ export declare type ISegmentLoader<TLoadedFormat> = (url: string | null, content: ISegmentContext, options: ISegmentLoaderOptions, cancelSignal: CancellationSignal, callbacks: ISegmentLoaderCallbacks<TLoadedFormat>) => Promise<ISegmentLoaderResultSegmentCreated<TLoadedFormat> | ISegmentLoaderResultSegmentLoaded<TLoadedFormat> | ISegmentLoaderResultChunkedComplete>;
192
+ /** Options given to an `ISegmentLoader` to configure its behavior. */
193
+ export interface ISegmentLoaderOptions {
194
+ /**
195
+ * Timeout, in milliseconds, after which a segment request should be aborted
196
+ * with the corresponding error.
197
+ *
198
+ * `undefined` means that no timeout will be enforced.
199
+ */
200
+ timeout?: number | undefined;
201
+ }
179
202
  /**
180
203
  * Segment parser function, allowing to parse a chunk (which may be a sub-part
181
204
  * of a segment) of any type.
@@ -15,5 +15,5 @@
15
15
  */
16
16
  import { IManifestLoader, ILoadedManifestFormat } from "../../public_types";
17
17
  import { CancellationSignal } from "../../utils/task_canceller";
18
- import { IRequestedData } from "../types";
19
- export default function callCustomManifestLoader(customManifestLoader: IManifestLoader, fallbackManifestLoader: (url: string | undefined, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>): (url: string | undefined, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>;
18
+ import { IManifestLoaderOptions, IRequestedData } from "../types";
19
+ export default function callCustomManifestLoader(customManifestLoader: IManifestLoader, fallbackManifestLoader: (url: string | undefined, loaderOptions: IManifestLoaderOptions, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>): (url: string | undefined, loaderOptions: IManifestLoaderOptions, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>;
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { CustomLoaderError } from "../../errors";
17
17
  export default function callCustomManifestLoader(customManifestLoader, fallbackManifestLoader) {
18
- return function (url, cancelSignal) {
18
+ return function (url, loaderOptions, cancelSignal) {
19
19
  return new Promise(function (res, rej) {
20
20
  var timeAPIsDelta = Date.now() - performance.now();
21
21
  /** `true` when the custom segmentLoader should not be active anymore. */
@@ -67,10 +67,10 @@ export default function callCustomManifestLoader(customManifestLoader, fallbackM
67
67
  }
68
68
  hasFinished = true;
69
69
  cancelSignal.deregister(abortCustomLoader);
70
- fallbackManifestLoader(url, cancelSignal).then(res, rej);
70
+ fallbackManifestLoader(url, loaderOptions, cancelSignal).then(res, rej);
71
71
  };
72
72
  var callbacks = { reject: reject, resolve: resolve, fallback: fallback };
73
- var abort = customManifestLoader(url, callbacks);
73
+ var abort = customManifestLoader(url, callbacks, { timeout: loaderOptions.timeout });
74
74
  cancelSignal.register(abortCustomLoader);
75
75
  /**
76
76
  * The logic to run when the custom loader is cancelled while pending.
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { IManifestLoader, ILoadedManifestFormat } from "../../public_types";
17
17
  import { CancellationSignal } from "../../utils/task_canceller";
18
- import { IRequestedData } from "../types";
18
+ import { IManifestLoaderOptions, IRequestedData } from "../types";
19
19
  /**
20
20
  * Generate a manifest loader for the application
21
21
  * @param {Function} [customManifestLoader]
@@ -23,4 +23,4 @@ import { IRequestedData } from "../types";
23
23
  */
24
24
  export default function generateManifestLoader({ customManifestLoader }: {
25
25
  customManifestLoader?: IManifestLoader | undefined;
26
- }, preferredType: "arraybuffer" | "text" | "document"): (url: string | undefined, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>;
26
+ }, preferredType: "arraybuffer" | "text" | "document"): (url: string | undefined, loaderOptions: IManifestLoaderOptions, cancelSignal: CancellationSignal) => Promise<IRequestedData<ILoadedManifestFormat>>;
@@ -18,11 +18,11 @@ import request from "../../utils/request";
18
18
  import callCustomManifestLoader from "./call_custom_manifest_loader";
19
19
  /**
20
20
  * Manifest loader triggered if there was no custom-defined one in the API.
21
- * @param {string} url
22
- * @returns {Observable}
21
+ * @param {string} preferredType
22
+ * @returns {Function}
23
23
  */
24
24
  function generateRegularManifestLoader(preferredType) {
25
- return function regularManifestLoader(url, cancelSignal) {
25
+ return function regularManifestLoader(url, loaderOptions, cancelSignal) {
26
26
  if (url === undefined) {
27
27
  throw new Error("Cannot perform HTTP(s) request. URL not known");
28
28
  }
@@ -31,11 +31,14 @@ function generateRegularManifestLoader(preferredType) {
31
31
  // So I wrote that instead, temporarily of course ;)
32
32
  switch (preferredType) {
33
33
  case "arraybuffer":
34
- return request({ url: url, responseType: "arraybuffer", cancelSignal: cancelSignal });
34
+ return request({ url: url, responseType: "arraybuffer",
35
+ timeout: loaderOptions.timeout, cancelSignal: cancelSignal });
35
36
  case "text":
36
- return request({ url: url, responseType: "text", cancelSignal: cancelSignal });
37
+ return request({ url: url, responseType: "text",
38
+ timeout: loaderOptions.timeout, cancelSignal: cancelSignal });
37
39
  case "document":
38
- return request({ url: url, responseType: "document", cancelSignal: cancelSignal });
40
+ return request({ url: url, responseType: "document",
41
+ timeout: loaderOptions.timeout, cancelSignal: cancelSignal });
39
42
  default:
40
43
  assertUnreachable(preferredType);
41
44
  }
@@ -49,7 +49,6 @@ 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 config from "../../config";
53
52
  import { NetworkErrorTypes, RequestError, } from "../../errors";
54
53
  import log from "../../log";
55
54
  import isNullOrUndefined from "../is_null_or_undefined";
@@ -90,13 +89,13 @@ export default function fetchRequest(options) {
90
89
  }
91
90
  abortController.abort();
92
91
  }
93
- var requestTimeout = isNullOrUndefined(options.timeout) ?
94
- config.getCurrent().DEFAULT_REQUEST_TIMEOUT :
95
- options.timeout;
96
- var timeout = window.setTimeout(function () {
97
- timeouted = true;
98
- abortFetch();
99
- }, requestTimeout);
92
+ var timeout;
93
+ if (options.timeout !== undefined) {
94
+ timeout = window.setTimeout(function () {
95
+ timeouted = true;
96
+ abortFetch();
97
+ }, options.timeout);
98
+ }
100
99
  var deregisterCancelLstnr = options.cancelSignal
101
100
  .register(function abortRequest(err) {
102
101
  cancellation = err;
@@ -112,7 +112,7 @@ export interface IRequestOptions<ResponseType> {
112
112
  responseType?: ResponseType | undefined;
113
113
  /**
114
114
  * Optional timeout, in milliseconds, after which we will cancel a request.
115
- * Set to DEFAULT_REQUEST_TIMEOUT by default.
115
+ * To not set or to set to `undefined` for disable.
116
116
  */
117
117
  timeout?: number | undefined;
118
118
  /**
@@ -13,28 +13,36 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import config from "../../config";
17
16
  import { RequestError } from "../../errors";
18
17
  import isNonEmptyString from "../is_non_empty_string";
19
18
  import isNullOrUndefined from "../is_null_or_undefined";
20
19
  var DEFAULT_RESPONSE_TYPE = "json";
21
20
  export default function request(options) {
22
- var DEFAULT_REQUEST_TIMEOUT = config.getCurrent().DEFAULT_REQUEST_TIMEOUT;
23
21
  var requestOptions = {
24
22
  url: options.url,
25
23
  headers: options.headers,
26
24
  responseType: isNullOrUndefined(options.responseType) ? DEFAULT_RESPONSE_TYPE :
27
25
  options.responseType,
28
- timeout: isNullOrUndefined(options.timeout) ? DEFAULT_REQUEST_TIMEOUT :
29
- options.timeout,
26
+ timeout: options.timeout,
30
27
  };
31
28
  return new Promise(function (resolve, reject) {
32
29
  var onProgress = options.onProgress, cancelSignal = options.cancelSignal;
33
30
  var url = requestOptions.url, headers = requestOptions.headers, responseType = requestOptions.responseType, timeout = requestOptions.timeout;
34
31
  var xhr = new XMLHttpRequest();
35
32
  xhr.open("GET", url, true);
36
- if (timeout >= 0) {
33
+ var timeoutId;
34
+ if (timeout !== undefined) {
37
35
  xhr.timeout = timeout;
36
+ // We've seen on some browser (mainly on some LG TVs), that `xhr.timeout`
37
+ // was either not supported or did not function properly despite the
38
+ // browser being recent enough to support it.
39
+ // That's why we also start a manual timeout. We do this a little later
40
+ // than the "native one" performed on the xhr assuming that the latter
41
+ // is more precise, it might also be more efficient.
42
+ timeoutId = window.setTimeout(function () {
43
+ clearCancellingProcess();
44
+ reject(new RequestError(url, xhr.status, "TIMEOUT", xhr));
45
+ }, timeout + 3000);
38
46
  }
39
47
  xhr.responseType = responseType;
40
48
  if (xhr.responseType === "document") {
@@ -54,6 +62,7 @@ export default function request(options) {
54
62
  if (cancelSignal !== undefined) {
55
63
  deregisterCancellationListener = cancelSignal
56
64
  .register(function abortRequest(err) {
65
+ clearCancellingProcess();
57
66
  if (!isNullOrUndefined(xhr) && xhr.readyState !== 4) {
58
67
  xhr.abort();
59
68
  }
@@ -64,15 +73,11 @@ export default function request(options) {
64
73
  }
65
74
  }
66
75
  xhr.onerror = function onXHRError() {
67
- if (deregisterCancellationListener !== null) {
68
- deregisterCancellationListener();
69
- }
76
+ clearCancellingProcess();
70
77
  reject(new RequestError(url, xhr.status, "ERROR_EVENT", xhr));
71
78
  };
72
79
  xhr.ontimeout = function onXHRTimeout() {
73
- if (deregisterCancellationListener !== null) {
74
- deregisterCancellationListener();
75
- }
80
+ clearCancellingProcess();
76
81
  reject(new RequestError(url, xhr.status, "TIMEOUT", xhr));
77
82
  };
78
83
  if (onProgress !== undefined) {
@@ -84,9 +89,7 @@ export default function request(options) {
84
89
  }
85
90
  xhr.onload = function onXHRLoad(event) {
86
91
  if (xhr.readyState === 4) {
87
- if (deregisterCancellationListener !== null) {
88
- deregisterCancellationListener();
89
- }
92
+ clearCancellingProcess();
90
93
  if (xhr.status >= 200 && xhr.status < 300) {
91
94
  var receivedTime = performance.now();
92
95
  var totalSize = xhr.response instanceof
@@ -122,6 +125,17 @@ export default function request(options) {
122
125
  }
123
126
  };
124
127
  xhr.send();
128
+ /**
129
+ * Clear resources and timers created to handle cancellation and timeouts.
130
+ */
131
+ function clearCancellingProcess() {
132
+ if (timeoutId !== undefined) {
133
+ clearTimeout(timeoutId);
134
+ }
135
+ if (deregisterCancellationListener !== null) {
136
+ deregisterCancellationListener();
137
+ }
138
+ }
125
139
  });
126
140
  }
127
141
  /**
@@ -233,8 +233,7 @@ export declare class CancellationSignal {
233
233
  */
234
234
  export declare type ICancellationListener = (error: CancellationError) => void;
235
235
  /**
236
- * Error created when a task is cancelled through the TaskCanceller.
237
- *
236
+ * Error created when a task is cancelled.
238
237
  * @class CancellationError
239
238
  * @extends Error
240
239
  */
@@ -257,8 +257,7 @@ var CancellationSignal = /** @class */ (function () {
257
257
  }());
258
258
  export { CancellationSignal };
259
259
  /**
260
- * Error created when a task is cancelled through the TaskCanceller.
261
- *
260
+ * Error created when a task is cancelled.
262
261
  * @class CancellationError
263
262
  * @extends Error
264
263
  */
Binary file