From b0bc3629bec1088a97eccbedcc465f19155e9036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 11 Jul 2026 10:27:06 +0400 Subject: [PATCH] fix: bulletproof WS promise + cache bust, bump 1.0.24 --- site/app.py | 2 +- site/static/app.js | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/site/app.py b/site/app.py index 7e01d9c..77e9e72 100644 --- a/site/app.py +++ b/site/app.py @@ -6,7 +6,7 @@ from flask_sock import Sock app = Flask(__name__) sock = Sock(app) -VERSION = '1.0.23' +VERSION = '1.0.24' @app.route('/') diff --git a/site/static/app.js b/site/static/app.js index 7dad31c..353597d 100644 --- a/site/static/app.js +++ b/site/static/app.js @@ -167,6 +167,7 @@ async function uploadAll() { renderTable(); try { var result = await uploadFileWS(wsUrl, f); + if (!result) throw new Error('Empty result'); f.status = 'ok'; f.elapsed = result.elapsed_ms; f.speed = result.elapsed_ms > 0 ? Math.round(result.bytes / (result.elapsed_ms / 1000)) : null; @@ -175,7 +176,7 @@ async function uploadAll() { okCount++; } catch (e) { f.status = 'err'; - f.error = e.message || 'Unknown error'; + f.error = (e && e.message) || String(e) || 'Unknown error'; errCount++; } renderTable(); @@ -201,10 +202,20 @@ function uploadFileWS(url, f) { var offset = 0; var startTime = Date.now(); var lastProgress = 0; - var timer = setTimeout(function () { ws.close(); reject(new Error('Timeout')); }, 300000); + var done = false; ws.binaryType = 'arraybuffer'; + function finish(err, data) { + if (done) return; + done = true; + try { ws.close(); } catch (e) {} + if (err) reject(err); + else resolve(data); + } + + setTimeout(function () { finish(new Error('Timeout')); }, 300000); + ws.onopen = function () { var reader = new FileReader(); reader.onload = function (e) { @@ -228,20 +239,16 @@ function uploadFileWS(url, f) { ws.onmessage = function (e) { try { var r = JSON.parse(e.data); - if (r.ok) { - clearTimeout(timer); + if (r && r.ok) { f.progress = 100; renderTable(); - ws.close(); - resolve({ bytes: r.bytes, elapsed_ms: Date.now() - startTime }); + finish(null, { bytes: r.bytes, elapsed_ms: Date.now() - startTime }); } - } catch (err) { - reject(new Error('Bad response')); - } + } catch (err) {} }; - ws.onerror = function () { reject(new Error('WebSocket error')); }; - ws.onclose = function () { if (offset < f.size) reject(new Error('WS closed early')); }; + ws.onerror = function () { finish(new Error('Connection failed')); }; + ws.onclose = function () { if (offset < f.size) finish(new Error('Closed early')); }; }); }