xhr.js 2.7 KB

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