module.exports = function futch(url, opts = {}, onProgress) { return fetch(url, opts) .then(response => { if (!response.ok) { throw Error(response.status + ' ' + response.statusText) } if (!response.body) { throw Error('ReadableStream not yet supported in this browser.') } const contentLength = response.headers.get('content-length'); if (!contentLength) { throw Error('Content-Length response header unavailable'); } const total = parseInt(contentLength, 10); let loaded = 0; onProgress({ loaded, total }) return new Response( new ReadableStream({ start(controller) { const reader = response.body.getReader(); read(); function read() { reader.read().then(({ done, value }) => { if (done) { controller.close(); return; } loaded += value.byteLength; onProgress({ loaded, total }) controller.enqueue(value); read(); }).catch(error => { controller.error(error) }) } } }) ); }) }