Files
agentic-studio/network-poc/frontend/public/worker.js
Jaakko Vanhala 0dc53dba1c Korjattu Worker-laskentasolmun timing: odotetaan WS-yhteyden avautumista
Ongelma: start_agent_node palautui heti ennen kuin WebSocket ehti avautua.
Worker lähetti 'started' ja warmup lähti liian aikaisin → hub ei löytänyt
solmua → "Ei vapaata solmua" -virhe.

Korjaukset:
1. worker.js: kuuntelee "Yhteys Hubiin avattu" -logia Wasmista ja
   resolveaa started-Promisen vasta sen jälkeen (15s timeout)
2. worker.js: onerror + onunhandledrejection käsittelijät
3. worker.js: console.error välitetään pääsäikeelle
4. index.astro: ensureCoderNode odottaa (await) workerStarted-Promisea
   ennen warmupia ja pending-promptin lähetystä

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:55:22 +03:00

82 lines
2.9 KiB
JavaScript

// Kipinä WASM Worker (ES module) — ajaa kielimallin inferenssin erillisessä säikeessä
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);
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) => {
const { type, data } = e.data;
if (type === 'init') {
try {
await init();
wasmReady = true;
self.postMessage({ type: 'ready' });
} catch (err) {
self.postMessage({ type: 'error', message: 'WASM init: ' + err.message });
}
} else if (type === 'start') {
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 });
}
} else if (type === 'set_gpu_load') {
if (wasmReady) set_gpu_load(data.load);
} else if (type === 'set_auto_tasks') {
if (wasmReady) set_auto_tasks(data.enabled);
}
};