Привет! Я пытаюсь реализовать создание и подключение к игровому лобби по локальной сети через вебсокеты. У меня уже есть код сервера, но возникла проблема с подключением. Для подключения нужно указать адрес вебсокета, а что если мы не знаем адрес, а должны автоматически узнать его при вводе айди лобби? Или как лучше сделать? Каковы твои предложения?
const WebSocket = require('ws');
const os = require('os');

function generateLobbyId() {
  return Math.random().toString(36).substr(2,6).toUpperCase();
}

function broadcastToLobby(lobbyId, data) {
  if (!lobbies[lobbyId]) return;
  lobbies[lobbyId].clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify(data));
    }
  })
}

function getLocalIp() {
  const interfaces = os.networkInterfaces();
  for (const name of Object.keys(interfaces)) {
    for (const net of interfaces[name]) {
      // Пропускаем внутренние и не-IPv4 интерфейсы
      if (net.family === 'IPv4' && !net.internal) {
        return net.address;
      }
    }
  }
  return 'localhost'; // Fallback
}

const LOCAL_IP = getLocalIp();
const PORT = 8080;

const lobbies = {};

const wss = new WebSocket.Server({ host: '0.0.0.0', port: PORT });

wss.on('connection', (ws) => {
  ws.lobbyId = null;

  ws.on('message', (message) => {
    let msg;
    try {
      msg = JSON.parse(message);
    } catch(e) {
      ws.send(JSON.stringify({error: 'Invalid message format, must be JSON'}));
      return;
    }

    if (msg.command === 'create_lobby') {
      const lobbyId = generateLobbyId();
      lobbies[lobbyId] = { clients: new Set() };
      lobbies[lobbyId].clients.add(ws);

      ws.send(JSON.stringify({ command: 'lobby_created', lobbyId}));
      broadcastToLobby(lobbyId, {
        command: 'player_joined',
        playersCount: lobbies[lobbyId].clients.size 
      });
      console.log(`Lobby ${lobbyId} created`);

    } else if (msg.command === 'join_lobby') {
      const { lobbyId } = msg;
      if (!lobbyId || !lobbies[lobbyId]) {
        ws.send(JSON.stringify({ error: 'Lobby not found'}));
        return;
      }

      lobbies[lobbyId].clients.add(ws);
      ws.lobbyId = lobbyId;

      ws.send(JSON.stringify({
        command: 'player_joined',
        playersCount: lobbies[lobbyId].clients.size 
      }));
      console.log(`Client joined lobby ${lobbyId}`);

    } else if (msg.command === 'chat_message') {
      if (!lobbyId || !lobbies[lobbyId]) {
        ws.send(JSON.stringify({ error: 'You are not in any lobby'}));
        return;
      }
      broadcastToLobby(ws.lobbyId, { command: 'chat_message', text: msg.text });

    } else {
      ws.send(JSON.stringify({ error: 'Unknown command'}));
    }

    //console.log(`Received: ${message}`);
    // Отправить это сообщение всем подключенным клиентам
    // wss.clients.forEach((client) => {
    //   if (client.readyState === WebSocket.OPEN) {
    //     lient.send(message);
    //   }
    // });
  });

  ws.on('close', () => {
    const lobbyId = ws.lobbyId;
    if (lobbyId && lobbies[lobbyId]) {
      lobbies[lobbyId].clients.delete(ws);
      broadcastToLobby(lobbyId, {
        command: 'player_left',
        playersCount: lobbies[lobbyId].clients.size
      });

      if (lobbies[lobbyId].clients.size === 0) {
        delete lobbies[lobbyId];
        console.log(`Lobby ${lobbyId} deleted (empty)`);
      }
    }
  });
});

console.log(`WebSocket server is running on:
  Local: ws://localhost:${PORT}
  Network: ws://${LOCAL_IP}:${PORT}`);