# FORNAI Windows Worker # Scaricato da https://fornai.dev $ErrorActionPreference = "Stop" $fornaiRoot = Join-Path $env:LOCALAPPDATA "FORNAI" $workerFile = Join-Path $fornaiRoot "fornai-worker.mjs" $workerBase64 = @" aW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSAibm9kZTpmcyI7CmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICJub2RlOnBhdGgiOwoKY29uc3QgZGVmYXVsdEFwaVVybCA9ICJodHRwczovL2Zvcm5haS5kZXYiOwpjb25zdCBlbWJlZGRlZFdvcmtlclRva2VuID0gIiI7CmNvbnN0IGVtYmVkZGVkV2FsbGV0ID0gIiI7Cgpsb2FkRG90RW52TG9jYWwoKTsKCmNvbnN0IGFwaVVybCA9IHByb2Nlc3MuZW52LkZPUk5BSV9BUElfVVJMID8/IGRlZmF1bHRBcGlVcmw7CmNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5GT1JOQUlfV09SS0VSX05BTUUgPz8gImxvY2FsLWJ1aWxkZXIiOwpjb25zdCB0aWVyID0gcHJvY2Vzcy5lbnYuRk9STkFJX1dPUktFUl9USUVSID8/ICJidWlsZGVyIjsKY29uc3QgbW9kZWwgPSBwcm9jZXNzLmVudi5GT1JOQUlfV09SS0VSX01PREVMID8/ICJRd2VuIENvZGVyIDMyQiBRNCI7CmNvbnN0IHdhbGxldCA9IHByb2Nlc3MuZW52LkZPUk5BSV9XT1JLRVJfV0FMTEVUID8/IGVtYmVkZGVkV2FsbGV0Owpjb25zdCBpbnRlcnZhbE1zID0gTnVtYmVyKHByb2Nlc3MuZW52LkZPUk5BSV9XT1JLRVJfSU5URVJWQUxfTVMgPz8gMTUwMDApOwpjb25zdCB3b3JrZXJUb2tlbiA9IHByb2Nlc3MuZW52LkZPUk5BSV9XT1JLRVJfVE9LRU4gPz8gZW1iZWRkZWRXb3JrZXJUb2tlbjsKY29uc3Qgd29ya2VyU2VjcmV0ID0gcHJvY2Vzcy5lbnYuRk9STkFJX1dPUktFUl9TRUNSRVQgPz8gIiI7CgpmdW5jdGlvbiBsb2FkRG90RW52TG9jYWwoKSB7CiAgY29uc3QgZW52UGF0aCA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgIi5lbnYubG9jYWwiKTsKICBpZiAoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHJldHVybjsKCiAgY29uc3QgbGluZXMgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgInV0ZjgiKS5zcGxpdCgvXHI/XG4vKTsKICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTsKICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoIiMiKSkgY29udGludWU7CgogICAgY29uc3Qgc2VwYXJhdG9yID0gdHJpbW1lZC5pbmRleE9mKCI9Iik7CiAgICBpZiAoc2VwYXJhdG9yID09PSAtMSkgY29udGludWU7CgogICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBzZXBhcmF0b3IpLnRyaW0oKTsKICAgIGNvbnN0IHJhd1ZhbHVlID0gdHJpbW1lZC5zbGljZShzZXBhcmF0b3IgKyAxKS50cmltKCk7CiAgICBpZiAoIWtleSB8fCBwcm9jZXNzLmVudltrZXldICE9PSB1bmRlZmluZWQpIGNvbnRpbnVlOwoKICAgIHByb2Nlc3MuZW52W2tleV0gPSByYXdWYWx1ZS5yZXBsYWNlKC9eWyInXXxbIiddJC9nLCAiIik7CiAgfQp9CgpmdW5jdGlvbiBoZWFkZXJzKCkgewogIHJldHVybiB7CiAgICAiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgLi4uKHdvcmtlclRva2VuID8geyAieC1mb3JuYWktd29ya2VyLXRva2VuIjogd29ya2VyVG9rZW4gfSA6IHt9KSwKICAgIC4uLih3b3JrZXJTZWNyZXQgPyB7ICJ4LWZvcm5haS13b3JrZXItc2VjcmV0Ijogd29ya2VyU2VjcmV0IH0gOiB7fSksCiAgfTsKfQoKYXN5bmMgZnVuY3Rpb24gaGVhcnRiZWF0KCkgewogIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXBpVXJsICsgIi9hcGkvd29ya2VyL2hlYXJ0YmVhdCIsIHsKICAgIG1ldGhvZDogIlBPU1QiLAogICAgaGVhZGVyczogaGVhZGVycygpLAogICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lLCB0aWVyLCBtb2RlbCwgd2FsbGV0LCBzdGF0dXM6ICJyZWFkeSIgfSksCiAgfSk7CgogIGlmICghcmVzcG9uc2Uub2spIHsKICAgIHRocm93IG5ldyBFcnJvcigiSGVhcnRiZWF0IGZhaWxlZDogIiArIHJlc3BvbnNlLnN0YXR1cyk7CiAgfQoKICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogIGNvbnNvbGUubG9nKAogICAgIlsiICsKICAgICAgZGF0YS5yZWNlaXZlZEF0ICsKICAgICAgIl0gIiArCiAgICAgIGRhdGEud29ya2VyLm5hbWUgKwogICAgICAiICIgKwogICAgICBkYXRhLndvcmtlci5zdGF0dXMgKwogICAgICAiIHJld2FyZD0iICsKICAgICAgZGF0YS5yZXdhcmRTdGF0dXMgKwogICAgICAiICsiICsKICAgICAgZGF0YS53b3JrZXIucmV3YXJkUGVySG91ciArCiAgICAgICIgIiArCiAgICAgIGRhdGEud29ya2VyLnJld2FyZFRva2VuICsKICAgICAgIi9oIiwKICApOwp9Cgphc3luYyBmdW5jdGlvbiBjbGFpbUFuZFJ1bkpvYigpIHsKICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgd29ya2VyOiBuYW1lIH0pOwogIGlmICh3YWxsZXQpIHBhcmFtcy5zZXQoIndhbGxldCIsIHdhbGxldCk7CgogIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXBpVXJsICsgIi9hcGkvd29ya2VyL2pvYnM/IiArIHBhcmFtcy50b1N0cmluZygpLCB7CiAgICBoZWFkZXJzOiBoZWFkZXJzKCksCiAgfSk7CiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSByZXR1cm47CiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCJDbGFpbSBmYWlsZWQ6ICIgKyByZXNwb25zZS5zdGF0dXMpOwoKICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogIGlmICghZGF0YS5qb2IpIHJldHVybjsKCiAgY29uc3Qgb3V0cHV0ID0gWwogICAgIldvcmtlciAiICsgbmFtZSArICIgaGEgY29tcGxldGF0byAiICsgZGF0YS5qb2IuaWQgKyAiLiIsCiAgICAiUmVwbzogIiArIGRhdGEuam9iLnJlcG8gKyAiLiIsCiAgICAiVGFzazogIiArIGRhdGEuam9iLnByb21wdCwKICAgICJWZXJpZmljYSBjb25zaWdsaWF0YTogZXNlZ3VpIGJ1aWxkLCBsaW50IGUgdGVzdCBtaXJhdGkgcHJpbWEgZGVsIG1lcmdlLiIsCiAgXS5qb2luKCJcbiIpOwoKICBjb25zdCBjb21wbGV0ZSA9IGF3YWl0IGZldGNoKGFwaVVybCArICIvYXBpL3dvcmtlci9qb2JzIiwgewogICAgbWV0aG9kOiAiUE9TVCIsCiAgICBoZWFkZXJzOiBoZWFkZXJzKCksCiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgIGlkOiBkYXRhLmpvYi5pZCwKICAgICAgd2FsbGV0LAogICAgICB3b3JrZXI6IG5hbWUsCiAgICAgIHN0YXR1czogInZlcmlmaWVkIiwKICAgICAgb3V0cHV0LAogICAgfSksCiAgfSk7CgogIGlmICghY29tcGxldGUub2spIHRocm93IG5ldyBFcnJvcigiQ29tcGxldGUgZmFpbGVkOiAiICsgY29tcGxldGUuc3RhdHVzKTsKICBjb25zb2xlLmxvZygiW2pvYl0gIiArIGRhdGEuam9iLmlkICsgIiB2ZXJpZmllZCBieSAiICsgbmFtZSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHRpY2soKSB7CiAgYXdhaXQgaGVhcnRiZWF0KCk7CiAgYXdhaXQgY2xhaW1BbmRSdW5Kb2IoKTsKfQoKY29uc29sZS5sb2coIkZPUk5BSSB3b3JrZXIgc3RhcnRpbmcgYWdhaW5zdCAiICsgYXBpVXJsKTsKaWYgKCF3b3JrZXJUb2tlbiAmJiAhd29ya2VyU2VjcmV0KSB7CiAgY29uc29sZS5sb2coIk5vIEZPUk5BSV9XT1JLRVJfVE9LRU4gZm91bmQ6IHJld2FyZHMgd2lsbCBzdGF5IGluIHByZXZpZXcgbW9kZS4iKTsKfQphd2FpdCB0aWNrKCk7CnNldEludGVydmFsKCgpID0+IHsKICB0aWNrKCkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpOwogIH0pOwp9LCBpbnRlcnZhbE1zKTsK "@ New-Item -ItemType Directory -Force -Path $fornaiRoot | Out-Null $nodeCommand = Get-Command node -ErrorAction SilentlyContinue if (-not $nodeCommand) { Write-Host "Node.js non trovato. Installa Node.js LTS e rilancia questo file." Start-Process "https://nodejs.org/en/download" exit 1 } $workerBytes = [System.Convert]::FromBase64String(($workerBase64 -replace "\s", "")) [System.IO.File]::WriteAllBytes($workerFile, $workerBytes) Write-Host "FORNAI worker installato in $workerFile" Write-Host "Avvio worker. Lascia aperta questa finestra per contribuire calcolo." Set-Location $fornaiRoot & $nodeCommand.Source $workerFile