feat: retry 3x + warmup health check for upload (Phase 2), bump 1.0.5→1.0.6
Deploy loadtest / validate (push) Waiting to run

This commit is contained in:
2026-07-10 21:19:31 +04:00
parent d303985877
commit 6ce7bd9720
7 changed files with 328 additions and 2 deletions
+43 -1
View File
@@ -130,6 +130,19 @@ function renderTable() {
}
}
/** warmup() — прогрев соединения перед загрузкой */
function warmup() {
return new Promise(function (resolve) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/health');
xhr.timeout = 3000;
xhr.onload = function () { resolve(true); };
xhr.onerror = function () { resolve(false); };
xhr.ontimeout = function () { resolve(false); };
xhr.send();
});
}
/** uploadAll() — последовательная загрузка всех файлов */
async function uploadAll() {
if (uploading || files.length === 0) return;
@@ -137,6 +150,9 @@ async function uploadAll() {
uploadBtn.disabled = true;
clearBtn.disabled = true;
// Прогрев соединения
await warmup();
var totalBytes = 0;
var totalElapsed = 0;
var okCount = 0;
@@ -151,7 +167,7 @@ async function uploadAll() {
renderTable();
try {
var result = await uploadOne(f, i);
var result = await uploadOneWithRetry(f, i);
f.status = 'ok';
f.elapsed = result.elapsed_ms;
f.speed = result.elapsed_ms > 0 ? Math.round(result.bytes / (result.elapsed_ms / 1000)) : null;
@@ -180,6 +196,32 @@ async function uploadAll() {
fileSummary.textContent = summary;
}
/** uploadOneWithRetry(f, idx) — ретрай до 3 раз */
function uploadOneWithRetry(f, idx) {
var MAX_RETRIES = 3;
var RETRY_DELAY = 500; // ms
return new Promise(function (resolve, reject) {
var attempt = 0;
function tryUpload() {
attempt++;
uploadOne(f, idx).then(resolve).catch(function (e) {
if (attempt < MAX_RETRIES) {
f.progress = 0;
f.status = 'uploading';
renderTable();
setTimeout(tryUpload, RETRY_DELAY);
} else {
reject(e);
}
});
}
tryUpload();
});
}
/** uploadOne(fileEntry, idx) — читает файл в base64, отправляет как поле формы */
function uploadOne(f, idx) {
return new Promise(function (resolve, reject) {