35 lines
1.0 KiB
JavaScript
35 lines
1.0 KiB
JavaScript
export function trackDownloadProgress(response, {id, postMessage, asset = 'model', file}) {
|
|
const reader = response.body?.getReader?.();
|
|
if (!reader || typeof ReadableStream !== 'function' || typeof Response !== 'function') return response;
|
|
|
|
const total = Number(response.headers.get('content-length')) || 0;
|
|
let loaded = 0;
|
|
const body = new ReadableStream({
|
|
async pull(controller) {
|
|
try {
|
|
const {done, value} = await reader.read();
|
|
if (done) {
|
|
controller.close();
|
|
return;
|
|
}
|
|
loaded += value.byteLength;
|
|
const progress = {asset, loaded, total};
|
|
if (file) progress.file = file;
|
|
postMessage({id, type: 'progress', progress});
|
|
controller.enqueue(value);
|
|
} catch (error) {
|
|
controller.error(error);
|
|
}
|
|
},
|
|
cancel(reason) {
|
|
return reader.cancel(reason);
|
|
},
|
|
});
|
|
|
|
return new Response(body, {
|
|
status: response.status,
|
|
statusText: response.statusText,
|
|
headers: response.headers,
|
|
});
|
|
}
|