Home Reference Source

src/utils/fetch-loader.js

  1. /**
  2. * Fetch based loader
  3. * timeout / abort / onprogress not supported for now
  4. * timeout / abort : some ideas here : https://github.com/whatwg/fetch/issues/20#issuecomment-196113354
  5. * but still it is not bullet proof as it fails to avoid data waste....
  6. */
  7.  
  8. class FetchLoader {
  9. constructor (config) {
  10. this.fetchSetup = config.fetchSetup;
  11. }
  12.  
  13. destroy () {}
  14.  
  15. abort () {}
  16.  
  17. load (context, config, callbacks) {
  18. let stats = {
  19. trequest: window.performance.now(),
  20. retry: 0
  21. };
  22.  
  23. let targetURL = context.url;
  24. let request;
  25.  
  26. const initParams = {
  27. method: 'GET',
  28. mode: 'cors',
  29. credentials: 'same-origin'
  30. };
  31.  
  32. const headersObj = {};
  33.  
  34. if (context.rangeEnd) {
  35. headersObj['Range'] = 'bytes=' + context.rangeStart + '-' + String(context.rangeEnd - 1);
  36. } /* jshint ignore:line */
  37.  
  38. initParams.headers = new window.Headers(headersObj);
  39.  
  40. if (this.fetchSetup) {
  41. request = this.fetchSetup(context, initParams);
  42. } else {
  43. request = new window.Request(context.url, initParams);
  44. }
  45.  
  46. let fetchPromise = window.fetch(request, initParams);
  47.  
  48. // process fetchPromise
  49. let responsePromise = fetchPromise.then(function (response) {
  50. if (response.ok) {
  51. stats.tfirst = Math.max(stats.trequest, window.performance.now());
  52. targetURL = response.url;
  53. if (context.responseType === 'arraybuffer') {
  54. return response.arrayBuffer();
  55. } else {
  56. return response.text();
  57. }
  58. } else {
  59. callbacks.onError({ text: 'fetch, bad network response' }, context);
  60. }
  61. }).catch(function (error) {
  62. callbacks.onError({ text: error.message }, context);
  63. });
  64. // process response Promise
  65. responsePromise.then(function (responseData) {
  66. if (responseData) {
  67. stats.tload = Math.max(stats.tfirst, window.performance.now());
  68. let len;
  69. if (typeof responseData === 'string') {
  70. len = responseData.length;
  71. } else {
  72. len = responseData.byteLength;
  73. }
  74.  
  75. stats.loaded = stats.total = len;
  76. let response = { url: targetURL, data: responseData };
  77. callbacks.onSuccess(response, stats, context);
  78. }
  79. });
  80. }
  81. }
  82.  
  83. export default FetchLoader;