UNPKG

2.79 kBJavaScriptView Raw
1/**
2 * @file xhr.js
3 */
4
5/**
6 * A wrapper for videojs.xhr that tracks bandwidth.
7 *
8 * @param {Object} options options for the XHR
9 * @param {Function} callback the callback to call when done
10 * @return {Request} the xhr request that is going to be made
11 */
12'use strict';
13
14Object.defineProperty(exports, '__esModule', {
15 value: true
16});
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
19
20var _videoJs = require('video.js');
21
22var _videoJs2 = _interopRequireDefault(_videoJs);
23
24var xhrFactory = function xhrFactory() {
25 var xhr = function XhrFunction(options, callback) {
26 // Add a default timeout for all hls requests
27 options = (0, _videoJs.mergeOptions)({
28 timeout: 45e3
29 }, options);
30
31 // Allow an optional user-specified function to modify the option
32 // object before we construct the xhr request
33 var beforeRequest = XhrFunction.beforeRequest || _videoJs2['default'].Hls.xhr.beforeRequest;
34
35 if (beforeRequest && typeof beforeRequest === 'function') {
36 var newOptions = beforeRequest(options);
37
38 if (newOptions) {
39 options = newOptions;
40 }
41 }
42
43 var request = (0, _videoJs.xhr)(options, function (error, response) {
44 var reqResponse = request.response;
45
46 if (!error && reqResponse) {
47 request.responseTime = Date.now();
48 request.roundTripTime = request.responseTime - request.requestTime;
49 request.bytesReceived = reqResponse.byteLength || reqResponse.length;
50 if (!request.bandwidth) {
51 request.bandwidth = Math.floor(request.bytesReceived / request.roundTripTime * 8 * 1000);
52 }
53 }
54
55 // videojs.xhr now uses a specific code on the error
56 // object to signal that a request has timed out instead
57 // of setting a boolean on the request object
58 if (error && error.code === 'ETIMEDOUT') {
59 request.timedout = true;
60 }
61
62 // videojs.xhr no longer considers status codes outside of 200 and 0
63 // (for file uris) to be errors, but the old XHR did, so emulate that
64 // behavior. Status 206 may be used in response to byterange requests.
65 if (!error && !request.aborted && response.statusCode !== 200 && response.statusCode !== 206 && response.statusCode !== 0) {
66 error = new Error('XHR Failed with a response of: ' + (request && (reqResponse || request.responseText)));
67 }
68
69 callback(error, request);
70 });
71 var originalAbort = request.abort;
72
73 request.abort = function () {
74 request.aborted = true;
75 return originalAbort.apply(request, arguments);
76 };
77 request.uri = options.uri;
78 request.requestTime = Date.now();
79 return request;
80 };
81
82 return xhr;
83};
84
85exports['default'] = xhrFactory;
86module.exports = exports['default'];
\No newline at end of file