diff --git a/scripts/install-gamecult-orchestrator-task.ps1 b/scripts/install-gamecult-orchestrator-task.ps1 index 54d37bc..6ad42ec 100644 --- a/scripts/install-gamecult-orchestrator-task.ps1 +++ b/scripts/install-gamecult-orchestrator-task.ps1 @@ -11,7 +11,7 @@ $ProgressPreference = "SilentlyContinue" $repoRoot = Split-Path -Parent $PSScriptRoot $runnerScript = Join-Path $PSScriptRoot "run-gamecult-orchestrator.ps1" -$hiddenLauncher = Join-Path $PSScriptRoot "run-hidden-powershell.vbs" +$hiddenLauncher = Join-Path $PSScriptRoot "start-gamecult-orchestrator-hidden.vbs" if ($IntervalMinutes -lt 1) { throw "IntervalMinutes must be at least 1." @@ -26,7 +26,7 @@ if (-not (Test-Path -LiteralPath $hiddenLauncher)) { $startAt = (Get-Date).AddMinutes(1) $action = New-ScheduledTaskAction ` -Execute "wscript.exe" ` - -Argument "//B //nologo `"$hiddenLauncher`" -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$runnerScript`"" ` + -Argument "//B //nologo `"$hiddenLauncher`"" ` -WorkingDirectory $repoRoot $trigger = New-ScheduledTaskTrigger -Once -At $startAt -RepetitionInterval (New-TimeSpan -Minutes $IntervalMinutes) -RepetitionDuration (New-TimeSpan -Days 3650) $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit (New-TimeSpan -Minutes 30) -MultipleInstances IgnoreNew diff --git a/scripts/publish-idunn-rudp-health.cjs b/scripts/publish-idunn-rudp-health.cjs index 9d45cb1..6a4dc15 100644 --- a/scripts/publish-idunn-rudp-health.cjs +++ b/scripts/publish-idunn-rudp-health.cjs @@ -43,7 +43,15 @@ async function publishIdunnRudpHealth(publisher, health) { try { const connect = session.createConnect(Date.now(), new Uint8Array()); - await receiveAccept(receiver, session, publisher.endpoint, connect, 5000); + await sendPacket(socket, publisher.endpoint, connect); + await receiveUntil( + receiver, + session, + publisher.endpoint, + (packet) => packet.packetType === "accept", + 5000, + "accept", + ); const record = { daemonId: publisher.daemonId, @@ -91,31 +99,11 @@ async function publishIdunnRudpHealth(publisher, health) { await ack; } finally { receiver.close(); - socket.close(); - } -} - -async function receiveAccept(receiver, session, endpoint, connectPacket, timeoutMs) { - const deadline = Date.now() + timeoutMs; - let nextConnectMs = 0; - while (Date.now() < deadline) { - const now = Date.now(); - if (now >= nextConnectMs) { - await sendPacket(receiver.socket, endpoint, connectPacket); - nextConnectMs = now + 100; - } try { - const packet = await receiver.next(Math.min(100, deadline - now), "accept"); - const result = session.receive(packet, Date.now()); - if (result.reply) { - throw new Error("VoidBot RUDP health publisher received an unexpected reply-required packet."); - } - if (packet.packetType === "accept") return; - } catch (error) { - if (error.code !== "ETIMEDOUT") throw error; - } + socket.unref(); + } catch {} + await closeSocket(socket); } - throw new Error(`timed out waiting for Idunn RUDP accept response after ${timeoutMs}ms`); } async function bindSocket(socket, endpoint) { @@ -274,6 +262,23 @@ async function sendPacket(socket, endpoint, packet) { }); } +async function closeSocket(socket) { + await new Promise((resolve) => { + let settled = false; + const finish = () => { + if (settled) return; + settled = true; + resolve(); + }; + socket.once("close", finish); + try { + socket.close(finish); + } catch { + finish(); + } + }); +} + main().catch((error) => { console.error(error?.stack || String(error)); process.exit(1); diff --git a/scripts/start-gamecult-orchestrator-hidden.vbs b/scripts/start-gamecult-orchestrator-hidden.vbs new file mode 100644 index 0000000..208402c --- /dev/null +++ b/scripts/start-gamecult-orchestrator-hidden.vbs @@ -0,0 +1,19 @@ +Option Explicit + +Dim shell +Dim scriptDir +Dim runnerScript +Dim command + +Set shell = CreateObject("WScript.Shell") +scriptDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) +runnerScript = scriptDir & "\run-gamecult-orchestrator.ps1" + +command = QuoteArg(shell.ExpandEnvironmentStrings("%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe")) +command = command & " -NoProfile -NonInteractive -ExecutionPolicy Bypass -File " & QuoteArg(runnerScript) + +shell.Run command, 0, False + +Function QuoteArg(value) + QuoteArg = """" & Replace(value, """", """""") & """" +End Function diff --git a/scripts/start-voidbot-stack.ps1 b/scripts/start-voidbot-stack.ps1 index 72c1193..6a43092 100644 --- a/scripts/start-voidbot-stack.ps1 +++ b/scripts/start-voidbot-stack.ps1 @@ -697,6 +697,15 @@ $status.completedAt = (Get-Date).ToString("o") $status.ready = $true Write-StatusFile -Path $statusPath -Status $status +$installOrchestratorTaskScript = Join-Path $PSScriptRoot "install-gamecult-orchestrator-task.ps1" +if (Test-Path -LiteralPath $installOrchestratorTaskScript) { + Write-Host "Refreshing GameCult Local Orchestrator task..." + & $installOrchestratorTaskScript -RunNow + if ($LASTEXITCODE -ne 0) { + throw "install-gamecult-orchestrator-task.ps1 failed." + } +} + Write-Host "VoidBot stack is up." Write-Host "Status: $statusPath" Write-Host "Bot log: $botOut"