diff --git a/src/routes/settings.tsx b/src/routes/settings.tsx index dde409f..2b80297 100644 --- a/src/routes/settings.tsx +++ b/src/routes/settings.tsx @@ -9,6 +9,7 @@ export const Route = createFileRoute('/settings')({ function SettingsPage() { const [ip, setIp] = useState(''); + const [availableIps, setAvailableIps] = useState([]); const [frontendPort, setFrontendPort] = useState(String(CONFIG.FRONTEND_PORT)); const [invertScroll, setInvertScroll] = useState(CONFIG.MOUSE_INVERT); const [sensitivity, setSensitivity] = useState(CONFIG.MOUSE_SENSITIVITY); @@ -61,7 +62,16 @@ function SettingsPage() { const data = JSON.parse(event.data); if (data.type === 'server-ip' && data.ip) { console.log('Auto-detected IP:', data.ip); - setIp(data.ip); + + // Only override if user hasn't set one, or if it's default + const stored = localStorage.getItem('rein_ip'); + if (!stored || stored === 'localhost' || stored === '127.0.0.1' || stored === window.location.hostname) { + setIp(data.ip); + } + + if (data.ips && Array.isArray(data.ips)) { + setAvailableIps(data.ips); + } socket.close(); } } catch (e) { @@ -95,6 +105,22 @@ function SettingsPage() { value={ip} onChange={(e) => setIp(e.target.value)} /> + {availableIps.length > 0 && ( +
+ Detected LAN IPs: +
+ {availableIps.map(addr => ( + + ))} +
+
+ )} diff --git a/src/server/websocket.ts b/src/server/websocket.ts index f06ad7a..4f0c61b 100644 --- a/src/server/websocket.ts +++ b/src/server/websocket.ts @@ -5,26 +5,32 @@ import fs from 'fs'; import { Server, IncomingMessage } from 'http'; import { Socket } from 'net'; -// Helper to find LAN IP -function getLocalIp() { +// Helper to find LAN IPs +function getLocalIps() { const nets = os.networkInterfaces(); + const results: string[] = []; for (const name of Object.keys(nets)) { for (const net of nets[name]!) { if (net.family === 'IPv4' && !net.internal) { - return net.address; + results.push(net.address); } } } - return 'localhost'; + return results.length > 0 ? results : ['localhost']; } export function createWsServer(server: Server) { const wss = new WebSocketServer({ noServer: true }); const inputHandler = new InputHandler(); - const LAN_IP = getLocalIp(); + const LAN_IPS = getLocalIps(); + // Heuristic: Prefer 192.168.x.x, then 10.x.x.x, then first available + const BEST_IP = LAN_IPS.find(ip => ip.startsWith('192.168.')) + || LAN_IPS.find(ip => ip.startsWith('10.')) + || LAN_IPS[0]; console.log(`WebSocket Server initialized (Upgrade mode)`); - console.log(`WS LAN IP: ${LAN_IP}`); + console.log(`WS LAN IPS: ${LAN_IPS.join(', ')}`); + console.log(`Selected Best IP: ${BEST_IP}`); server.on('upgrade', (request: IncomingMessage, socket: Socket, head: Buffer) => { const pathname = request.url; @@ -39,7 +45,7 @@ export function createWsServer(server: Server) { wss.on('connection', (ws: WebSocket) => { console.log('Client connected to /ws'); - ws.send(JSON.stringify({ type: 'connected', serverIp: LAN_IP })); + ws.send(JSON.stringify({ type: 'connected', serverIp: BEST_IP, ips: LAN_IPS })); ws.on('message', async (data: string) => { try { @@ -47,7 +53,7 @@ export function createWsServer(server: Server) { const msg = JSON.parse(raw); if (msg.type === 'get-ip') { - ws.send(JSON.stringify({ type: 'server-ip', ip: LAN_IP })); + ws.send(JSON.stringify({ type: 'server-ip', ip: BEST_IP, ips: LAN_IPS })); return; }