1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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)
- })
- }
- }
- })
- );
- })
- }
|