V45.39: fix SERVER OFFLINE lau + UI load cham - engine ghi port file (engine_port.txt), UI bootstrap doc port engine cua chinh no (get_engine_port) + timeout/retry 60s, health poll self-heal reload, khong taskkill /IM daw_engine (giet engine instance khac), /api/v1/plugins/available chay scan trong threadpool (khong chan event loop -> /health het timeout)
This commit is contained in:
+34
-5
@@ -20,16 +20,45 @@
|
||||
// (origin tauri:// giữ nguyên -> __TAURI__ sống), base href + API_BASE_URL
|
||||
// trỏ engine HTTP (CORS * đã bật).
|
||||
(async function () {
|
||||
// Đợi engine của CHÍNH app này (port do desktop_engine.py ghi vào
|
||||
// engine_port.txt, đọc qua lệnh Tauri get_engine_port) tối đa 60s.
|
||||
// Fallback: quét 8000-8010 (engine cũ/cài chồng) nhưng CÓ timeout mỗi
|
||||
// port — trước đây fetch không timeout + không retry: port giữ kết nối
|
||||
// không phản hồi → UI treo "Đang khởi động" vĩnh viễn; engine khởi
|
||||
// động chậm (cold start) → "Không tìm thấy" dù sau đó engine sống.
|
||||
var base = null;
|
||||
for (var p = 8000; p <= 8010 && !base; p++) {
|
||||
var deadline = Date.now() + 60000;
|
||||
function withTimeout(ms) {
|
||||
var ctl = new AbortController();
|
||||
var t = setTimeout(function () { ctl.abort(); }, ms);
|
||||
return { ctl: ctl, t: t };
|
||||
}
|
||||
while (!base && Date.now() < deadline) {
|
||||
try {
|
||||
var r = await fetch('http://127.0.0.1:' + p + '/health', { cache: 'no-store' });
|
||||
if (r.ok) base = 'http://127.0.0.1:' + p + '/';
|
||||
} catch (e) { /* port chưa mở */ }
|
||||
if (window.__TAURI__ && window.__TAURI__.core && window.__TAURI__.core.invoke) {
|
||||
var port = await window.__TAURI__.core.invoke('get_engine_port');
|
||||
if (port && port > 0) {
|
||||
var h = withTimeout(2000);
|
||||
try {
|
||||
var r = await fetch('http://127.0.0.1:' + port + '/health', { signal: h.ctl.signal, cache: 'no-store' });
|
||||
if (r.ok) base = 'http://127.0.0.1:' + port + '/';
|
||||
} finally { clearTimeout(h.t); }
|
||||
}
|
||||
}
|
||||
} catch (e) { /* engine chưa ghi port — retry */ }
|
||||
if (base) break;
|
||||
for (var p = 8000; p <= 8010 && !base; p++) {
|
||||
var h2 = withTimeout(1000);
|
||||
try {
|
||||
var r2 = await fetch('http://127.0.0.1:' + p + '/health', { signal: h2.ctl.signal, cache: 'no-store' });
|
||||
if (r2.ok) base = 'http://127.0.0.1:' + p + '/';
|
||||
} catch (e) { /* port chưa mở */ } finally { clearTimeout(h2.t); }
|
||||
}
|
||||
if (!base) await new Promise(function (res) { setTimeout(res, 1500); });
|
||||
}
|
||||
if (!base) {
|
||||
document.getElementById('msg').textContent =
|
||||
'Không tìm thấy SonicForge Engine (port 8000–8010). Hãy đóng và chạy lại ứng dụng. ' +
|
||||
'Không tìm thấy SonicForge Engine (port 8000–8010) sau 60s. Hãy đóng và chạy lại ứng dụng. ' +
|
||||
'Nếu lặp lại, xem log: %APPDATA%\\SonicForgeDAW\\logs\\engine.log';
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user