fix: default to 0.0.0.0 to fix WSL2 health check failure (#520)

PR #470 changed the default listen host to undefined, letting Node.js
bind to IPv6 :: on systems that support it. This broke WSL2 where IPv6
dual-stack is unreliable — the server binds to :: but IPv4 127.0.0.1
connections fail, causing the health check to time out.

Revert to 0.0.0.0 as the default. Users who need IPv6 can set
BIND_HOST=:: explicitly.

Fixes #518

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-05-07 19:11:32 +08:00
committed by GitHub
parent 8f6a6ec782
commit f1839db473
8 changed files with 171 additions and 130 deletions
+20 -17
View File
@@ -110,7 +110,7 @@ function createSession(shell: string): PtySession {
// ─── WebSocket server setup ─────────────────────────────────────
export function setupTerminalWebSocket(httpServer: HttpServer) {
export function setupTerminalWebSocket(httpServers: HttpServer | HttpServer[]) {
if (!pty) {
logger.warn('node-pty not available, skipping terminal WebSocket setup')
return
@@ -118,26 +118,29 @@ export function setupTerminalWebSocket(httpServer: HttpServer) {
const wss = new WebSocketServer({ noServer: true })
const defaultShell = findShell()
const servers = Array.isArray(httpServers) ? httpServers : [httpServers]
httpServer.on('upgrade', async (req, socket, head) => {
const url = new URL(req.url || '', `http://${req.headers.host}`)
if (url.pathname !== '/api/hermes/terminal') {
return
}
// Auth check
const authToken = await getToken()
if (authToken) {
const token = url.searchParams.get('token') || ''
if (token !== authToken) {
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n')
socket.destroy()
servers.forEach((httpServer) => {
httpServer.on('upgrade', async (req, socket, head) => {
const url = new URL(req.url || '', `http://${req.headers.host}`)
if (url.pathname !== '/api/hermes/terminal') {
return
}
}
wss.handleUpgrade(req, socket, head, (ws) => {
wss.emit('connection', ws, req)
// Auth check
const authToken = await getToken()
if (authToken) {
const token = url.searchParams.get('token') || ''
if (token !== authToken) {
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n')
socket.destroy()
return
}
}
wss.handleUpgrade(req, socket, head, (ws) => {
wss.emit('connection', ws, req)
})
})
})