This commit is contained in:
+20
-12
@@ -214,28 +214,36 @@ async function uploadAll() {
|
||||
fileSummary.textContent = summary;
|
||||
}
|
||||
|
||||
/** uploadChunk(blob) — отправить чанк как raw тело */
|
||||
/** uploadChunk(blob) — отправить чанк с ретраем до 3 раз */
|
||||
function uploadChunk(blob) {
|
||||
var MAX = 3;
|
||||
var attempt = 0;
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
function trySend() {
|
||||
attempt++;
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', '/upload');
|
||||
xhr.timeout = 10000;
|
||||
xhr.timeout = 5000;
|
||||
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
|
||||
xhr.onload = function () {
|
||||
try {
|
||||
var r = JSON.parse(xhr.responseText);
|
||||
if (r.ok) {
|
||||
resolve({ bytes: r.bytes, elapsed_ms: r.elapsed_ms });
|
||||
} else {
|
||||
reject(new Error(r.error || 'Ошибка сервера'));
|
||||
}
|
||||
} catch (e) {
|
||||
reject(new Error('Bad JSON'));
|
||||
}
|
||||
if (r.ok) { resolve({ bytes: r.bytes, elapsed_ms: r.elapsed_ms }); }
|
||||
else { reject(new Error(r.error || 'Ошибка сервера')); }
|
||||
} catch (e) { reject(new Error('Bad JSON')); }
|
||||
};
|
||||
xhr.onerror = function () {
|
||||
if (attempt < MAX) { setTimeout(trySend, 300); }
|
||||
else { reject(new Error('Сеть')); }
|
||||
};
|
||||
xhr.ontimeout = function () {
|
||||
if (attempt < MAX) { setTimeout(trySend, 300); }
|
||||
else { reject(new Error('Таймаут')); }
|
||||
};
|
||||
xhr.onerror = function () { reject(new Error('Сеть')); };
|
||||
xhr.ontimeout = function () { reject(new Error('Таймаут')); };
|
||||
xhr.send(blob);
|
||||
}
|
||||
trySend();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user