diff --git a/network-poc/frontend/public/worker.js b/network-poc/frontend/public/worker.js index f7a14bf..5694da0 100644 --- a/network-poc/frontend/public/worker.js +++ b/network-poc/frontend/public/worker.js @@ -2,12 +2,35 @@ import init, { start_agent_node, set_gpu_load, set_auto_tasks } from './pkg/node.js'; let wasmReady = false; +let wsConnectedResolve = null; // Promise-resolve jota kutsutaan kun WS-yhteys aukeaa // Välitetään console.log -viestit pääsäikeelle jotta UI-kuuntelijat näkevät ne const _origLog = console.log; console.log = function(...args) { _origLog.apply(console, args); - self.postMessage({ type: 'log', message: args.join(' ') }); + const msg = args.join(' '); + self.postMessage({ type: 'log', message: msg }); + + // Tunnistetaan WS-yhteyden avautuminen Wasm-logista + if (msg.includes('Yhteys Hubiin avattu') && wsConnectedResolve) { + wsConnectedResolve(); + wsConnectedResolve = null; + } +}; + +// Välitetään myös console.error/warn +const _origError = console.error; +console.error = function(...args) { + _origError.apply(console, args); + self.postMessage({ type: 'error', message: args.join(' ') }); +}; + +self.onerror = function(e) { + self.postMessage({ type: 'error', message: 'Worker error: ' + (e.message || e) }); +}; + +self.onunhandledrejection = function(e) { + self.postMessage({ type: 'error', message: 'Unhandled rejection: ' + (e.reason || e) }); }; self.onmessage = async (e) => { @@ -22,10 +45,30 @@ self.onmessage = async (e) => { self.postMessage({ type: 'error', message: 'WASM init: ' + err.message }); } } else if (type === 'start') { - if (!wasmReady) return; + if (!wasmReady) { + self.postMessage({ type: 'error', message: 'WASM ei alustettu' }); + return; + } const { hubUrl, hasWebGPU, deviceInfo, taskId } = data; try { + // Luodaan Promise joka resolvataan kun WS-yhteys aukeaa + const wsConnected = new Promise((resolve) => { + wsConnectedResolve = resolve; + // Timeout: jos yhteys ei aukea 15s:ssa + setTimeout(() => { + if (wsConnectedResolve) { + wsConnectedResolve = null; + resolve(); // Resolvataan silti jotta ei jäädä ikuisesti jumiin + self.postMessage({ type: 'error', message: 'WS-yhteys hubiin aikakatkaistiin (15s)' }); + } + }, 15000); + }); + await start_agent_node(hubUrl, hasWebGPU, deviceInfo, taskId); + + // Odotetaan kunnes WS-yhteys on oikeasti auki ja auth lähetetty + await wsConnected; + self.postMessage({ type: 'started' }); } catch (err) { self.postMessage({ type: 'error', message: 'Node: ' + err.message }); diff --git a/network-poc/frontend/src/pages/index.astro b/network-poc/frontend/src/pages/index.astro index 26fe08e..80d76a8 100644 --- a/network-poc/frontend/src/pages/index.astro +++ b/network-poc/frontend/src/pages/index.astro @@ -3678,39 +3678,44 @@ ${filesHtml} }; const taskId = coderSize === '3b' ? 5 : 4; - // Käynnistetään node Workerissa - coderWorker.onmessage = (e) => { - if (e.data.type === 'started') { - document.getElementById('coder-status').textContent = 'Connected'; - document.getElementById('coder-status').style.color = '#d29922'; - coderWsReady = true; - } else if (e.data.type === 'log') { - // Workerin console.log → pääsäikeen kuuntelijat (tilaindikaattori, pipeline-stepit) - console.log(e.data.message); - } else if (e.data.type === 'error') { - console.log('[Worker] Virhe: ' + e.data.message); - } - }; + // Käynnistetään node Workerissa — odotetaan WS-yhteyden avautumista + const workerStarted = new Promise((resolve) => { + coderWorker.onmessage = (e) => { + if (e.data.type === 'started') { + document.getElementById('coder-status').textContent = 'Connected'; + document.getElementById('coder-status').style.color = '#d29922'; + coderWsReady = true; + resolve(); + } else if (e.data.type === 'log') { + console.log(e.data.message); + } else if (e.data.type === 'error') { + console.error('[Worker] ' + e.data.message); + resolve(); // Resolvataan silti jotta ei jäädä jumiin + } + }; + }); + coderWorker.postMessage({ type: 'start', data: { hubUrl: wsUrl, hasWebGPU: false, deviceInfo: JSON.stringify(deviceInfo), taskId } }); - // Warmup - setTimeout(() => { - if (uiSocket && uiSocket.readyState === 1) { - uiSocket.send(JSON.stringify({ - type: 'user_text', - text: '{"prompt":"warmup","max_tokens":1}', - task_type: 'qwen-coder' - })); - } - }, 500); + // Odotetaan kunnes Worker on yhdistänyt hubiin + await workerStarted; + + // Warmup — nyt WS on varmasti auki + if (uiSocket && uiSocket.readyState === 1) { + uiSocket.send(JSON.stringify({ + type: 'user_text', + text: '{"prompt":"warmup","max_tokens":1}', + task_type: 'qwen-coder' + })); + } if (pendingCodePrompt) { setTimeout(() => { sendCodeToHub(pendingCodePrompt); - }, 2000); + }, 500); pendingCodePrompt = null; } } catch(e) {