lib_futch.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. module.exports = function futch(url, opts = {}, onProgress) {
  2. return fetch(url, opts)
  3. .then(response => {
  4. if (!response.ok) {
  5. throw Error(response.status + ' ' + response.statusText)
  6. }
  7. if (!response.body) {
  8. throw Error('ReadableStream not yet supported in this browser.')
  9. }
  10. const contentLength = response.headers.get('content-length');
  11. if (!contentLength) {
  12. throw Error('Content-Length response header unavailable');
  13. }
  14. const total = parseInt(contentLength, 10);
  15. let loaded = 0;
  16. onProgress({
  17. loaded, total
  18. })
  19. return new Response(
  20. new ReadableStream({
  21. start(controller) {
  22. const reader = response.body.getReader();
  23. read();
  24. function read() {
  25. reader.read().then(({
  26. done, value
  27. }) => {
  28. if (done) {
  29. controller.close();
  30. return;
  31. }
  32. loaded += value.byteLength;
  33. onProgress({
  34. loaded, total
  35. })
  36. controller.enqueue(value);
  37. read();
  38. }).catch(error => {
  39. controller.error(error)
  40. })
  41. }
  42. }
  43. })
  44. );
  45. })
  46. }