import { networkInterfaces } from 'os' import { readFileSync, existsSync } from 'fs' import { execSync } from 'child_process' function isWSL() { try { return existsSync('/proc/sys/kernel/osrelease') && readFileSync('/proc/sys/kernel/osrelease', 'utf8').toLowerCase().includes('microsoft') } catch { return false } } // Un IPv4 è "pubblicabile" in LAN se non è loopback, link-local o bridge Docker. function isLanIPv4(address) { return !!address && !address.startsWith('127.') && !address.startsWith('169.254.') && !address.startsWith('172.') } // Estrae gli IP LAN da un oggetto in stile os.networkInterfaces(). // Esportata per poter essere testata in isolamento, senza dipendere dalla piattaforma. export function collectIPs(nets) { const out = [] for (const name of Object.keys(nets || {})) { for (const net of nets[name]) { if (net.family === 'IPv4' && !net.internal && isLanIPv4(net.address)) { out.push(net.address) } } } return out } // Restituisce gli IP di rete della macchina. // Passando `nets` (oggetto in stile os.networkInterfaces) si forza il percorso // deterministico, scavalcando il rilevamento WSL/PowerShell: utile nei test. export function getNetworkIPs(nets) { if (nets) return collectIPs(nets) if (isWSL()) { try { const out = execSync( 'powershell.exe -NoProfile -Command "Get-NetIPAddress -AddressFamily IPv4 | Select-Object -ExpandProperty IPAddress"', { timeout: 3000 } ) return out.toString().trim().split('\n') .map(s => s.trim()) .filter(isLanIPv4) } catch { return [] } } return collectIPs(networkInterfaces()) } // `networkIPs` è iniettabile per rendere la stampa testabile in modo deterministico. export function printServerInfo(port = 3000, networkIPs = getNetworkIPs()) { console.log(`\nSegnapunti Server`) console.log(` Display: http://127.0.0.1:${port}/display`) console.log(` Controller: http://127.0.0.1:${port}/controller`) if (networkIPs.length > 0) { console.log(`\n Da dispositivi remoti:`) networkIPs.forEach(ip => { console.log(` Display: http://${ip}:${port}/display`) console.log(` Controller: http://${ip}:${port}/controller`) }) } console.log() }