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.
- package/CHANGELOG.md +11 -1
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/event_listeners.d.ts +18 -2
- package/dist/_esm5.processed/compat/event_listeners.js +64 -2
- package/dist/_esm5.processed/compat/on_height_width_change.d.ts +5 -4
- package/dist/_esm5.processed/compat/on_height_width_change.js +43 -34
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +12 -2
- package/dist/_esm5.processed/core/api/playback_observer.js +27 -12
- package/dist/_esm5.processed/core/api/public_api.js +14 -14
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +7 -0
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +10 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +8 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +10 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +7 -0
- package/dist/_esm5.processed/core/init/initialize_directfile.js +1 -1
- package/dist/_esm5.processed/core/init/load_on_media_source.js +1 -1
- package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -2
- package/dist/_esm5.processed/core/init/stall_avoider.js +32 -26
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +12 -6
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +142 -78
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -16
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +53 -41
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +6 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +37 -39
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +23 -22
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +84 -72
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +6 -12
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +33 -43
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +12 -9
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +7 -6
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +17 -10
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +20 -9
- package/dist/_esm5.processed/core/stream/period/period_stream.js +25 -14
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -7
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +80 -23
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +5 -4
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +78 -26
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -3
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +7 -1
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +7 -1
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -8
- package/dist/_esm5.processed/default_config.js +1 -1
- package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -2
- package/dist/_esm5.processed/errors/custom_loader_error.js +3 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +5 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.js +5 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +9 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +3 -1
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +4 -3
- package/dist/_esm5.processed/public_types.d.ts +22 -3
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -1
- package/dist/_esm5.processed/transports/dash/init_segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +12 -6
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +3 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +6 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +12 -9
- package/dist/_esm5.processed/transports/dash/text_loader.js +6 -3
- package/dist/_esm5.processed/transports/local/pipelines.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/pipelines.js +6 -6
- package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +4 -3
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +5 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +15 -10
- package/dist/_esm5.processed/transports/smooth/pipelines.d.ts +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +18 -14
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +8 -6
- package/dist/_esm5.processed/transports/types.d.ts +25 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +9 -6
- package/dist/_esm5.processed/utils/request/fetch.js +7 -8
- package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/xhr.js +28 -14
- package/dist/_esm5.processed/utils/task_canceller.d.ts +1 -2
- package/dist/_esm5.processed/utils/task_canceller.js +1 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +1116 -695
- package/dist/rx-player.min.js +1 -1
- package/package.json +7 -7
- package/sonar-project.properties +1 -1
- package/src/compat/event_listeners.ts +86 -1
- package/src/compat/on_height_width_change.ts +48 -49
- package/src/core/api/playback_observer.ts +34 -14
- package/src/core/api/public_api.ts +23 -18
- package/src/core/fetchers/manifest/manifest_fetcher.ts +20 -2
- package/src/core/fetchers/segment/segment_fetcher.ts +23 -3
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +7 -0
- package/src/core/init/initialize_directfile.ts +1 -1
- package/src/core/init/load_on_media_source.ts +1 -0
- package/src/core/init/stall_avoider.ts +40 -26
- package/src/core/segment_buffers/garbage_collector.ts +55 -47
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +92 -70
- package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +37 -42
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +103 -105
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +35 -46
- package/src/core/segment_buffers/implementations/types.ts +22 -9
- package/src/core/segment_buffers/segment_buffers_store.ts +23 -14
- package/src/core/stream/orchestrator/stream_orchestrator.ts +31 -12
- package/src/core/stream/period/period_stream.ts +31 -18
- package/src/core/stream/representation/append_segment_to_buffer.ts +27 -42
- package/src/core/stream/representation/force_garbage_collection.ts +28 -32
- package/src/core/stream/representation/get_buffer_status.ts +7 -3
- package/src/core/stream/representation/push_init_segment.ts +12 -6
- package/src/core/stream/representation/push_media_segment.ts +12 -6
- package/src/core/stream/representation/representation_stream.ts +11 -5
- package/src/default_config.ts +17 -17
- package/src/errors/custom_loader_error.ts +3 -2
- package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +7 -2
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +6 -2
- package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +10 -2
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +3 -1
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +4 -3
- package/src/public_types.ts +28 -4
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
- package/src/transports/dash/image_pipelines.ts +4 -0
- package/src/transports/dash/init_segment_loader.ts +8 -0
- package/src/transports/dash/low_latency_segment_loader.ts +4 -0
- package/src/transports/dash/manifest_parser.ts +4 -0
- package/src/transports/dash/segment_loader.ts +21 -5
- package/src/transports/dash/text_loader.ts +7 -2
- package/src/transports/local/pipelines.ts +7 -5
- package/src/transports/local/segment_loader.ts +4 -2
- package/src/transports/metaplaylist/manifest_loader.ts +9 -2
- package/src/transports/metaplaylist/pipelines.ts +16 -6
- package/src/transports/smooth/pipelines.ts +17 -9
- package/src/transports/smooth/segment_loader.ts +8 -0
- package/src/transports/types.ts +27 -0
- package/src/transports/utils/call_custom_manifest_loader.ts +8 -2
- package/src/transports/utils/generate_manifest_loader.ts +18 -5
- package/src/utils/request/fetch.ts +7 -8
- package/src/utils/request/xhr.ts +31 -15
- 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 (
|
|
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 (
|
|
99
|
-
var smoothManifestParser = createSmoothManifestParser(
|
|
100
|
-
var segmentLoader = generateSegmentLoader(
|
|
101
|
-
var manifestLoaderOptions = { customManifestLoader:
|
|
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:
|
|
142
|
-
supplementaryImageTracks:
|
|
143
|
-
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",
|
|
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",
|
|
231
|
+
return request({ url: url, responseType: "arraybuffer",
|
|
232
|
+
timeout: loaderOptions.timeout, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
|
|
230
233
|
.then(function (data) {
|
|
231
|
-
if (
|
|
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",
|
|
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}
|
|
22
|
-
* @returns {
|
|
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",
|
|
34
|
+
return request({ url: url, responseType: "arraybuffer",
|
|
35
|
+
timeout: loaderOptions.timeout, cancelSignal: cancelSignal });
|
|
35
36
|
case "text":
|
|
36
|
-
return request({ url: url, responseType: "text",
|
|
37
|
+
return request({ url: url, responseType: "text",
|
|
38
|
+
timeout: loaderOptions.timeout, cancelSignal: cancelSignal });
|
|
37
39
|
case "document":
|
|
38
|
-
return request({ url: url, responseType: "document",
|
|
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
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
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
|
-
*
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
261
|
-
*
|
|
260
|
+
* Error created when a task is cancelled.
|
|
262
261
|
* @class CancellationError
|
|
263
262
|
* @extends Error
|
|
264
263
|
*/
|
package/dist/mpd-parser.wasm
CHANGED
|
Binary file
|