86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
/**
|
|
* @file xhr.js
|
|
*/
|
|
|
|
/**
|
|
* A wrapper for videojs.xhr that tracks bandwidth.
|
|
*
|
|
* @param {Object} options options for the XHR
|
|
* @param {Function} callback the callback to call when done
|
|
* @return {Request} the xhr request that is going to be made
|
|
*/
|
|
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
var _videoJs = require('video.js');
|
|
|
|
var _videoJs2 = _interopRequireDefault(_videoJs);
|
|
|
|
var xhrFactory = function xhrFactory() {
|
|
var xhr = function XhrFunction(options, callback) {
|
|
// Add a default timeout for all hls requests
|
|
options = (0, _videoJs.mergeOptions)({
|
|
timeout: 45e3
|
|
}, options);
|
|
|
|
// Allow an optional user-specified function to modify the option
|
|
// object before we construct the xhr request
|
|
var beforeRequest = XhrFunction.beforeRequest || _videoJs2['default'].Hls.xhr.beforeRequest;
|
|
|
|
if (beforeRequest && typeof beforeRequest === 'function') {
|
|
var newOptions = beforeRequest(options);
|
|
|
|
if (newOptions) {
|
|
options = newOptions;
|
|
}
|
|
}
|
|
|
|
var request = (0, _videoJs.xhr)(options, function (error, response) {
|
|
var reqResponse = request.response;
|
|
|
|
if (!error && reqResponse) {
|
|
request.responseTime = Date.now();
|
|
request.roundTripTime = request.responseTime - request.requestTime;
|
|
request.bytesReceived = reqResponse.byteLength || reqResponse.length;
|
|
if (!request.bandwidth) {
|
|
request.bandwidth = Math.floor(request.bytesReceived / request.roundTripTime * 8 * 1000);
|
|
}
|
|
}
|
|
|
|
// videojs.xhr now uses a specific code on the error
|
|
// object to signal that a request has timed out instead
|
|
// of setting a boolean on the request object
|
|
if (error && error.code === 'ETIMEDOUT') {
|
|
request.timedout = true;
|
|
}
|
|
|
|
// videojs.xhr no longer considers status codes outside of 200 and 0
|
|
// (for file uris) to be errors, but the old XHR did, so emulate that
|
|
// behavior. Status 206 may be used in response to byterange requests.
|
|
if (!error && !request.aborted && response.statusCode !== 200 && response.statusCode !== 206 && response.statusCode !== 0) {
|
|
error = new Error('XHR Failed with a response of: ' + (request && (reqResponse || request.responseText)));
|
|
}
|
|
|
|
callback(error, request);
|
|
});
|
|
var originalAbort = request.abort;
|
|
|
|
request.abort = function () {
|
|
request.aborted = true;
|
|
return originalAbort.apply(request, arguments);
|
|
};
|
|
request.uri = options.uri;
|
|
request.requestTime = Date.now();
|
|
return request;
|
|
};
|
|
|
|
return xhr;
|
|
};
|
|
|
|
exports['default'] = xhrFactory;
|
|
module.exports = exports['default']; |