Очень простой Voice Room

Работает автоматически через WebSocket-сигналинг. Нужен маленький Node.js-сервер (ниже). Если хочешь полностью без сервера — предыдущая копи‑паст версия осталась в истории.

Логи (для отладки):

Как пользоваться

  1. Склонируй и запусти Node-сервер (ниже) на своём сервере или локально: node signaling-server.js.
  2. Открой HTML у двоих (на разных устройствах/вкладках), введите одинаковый room id и нажмите «Подключиться». Всё: звук должен автоматически пойти.

Код Node.js signaling-сервера (сохранить как signaling-server.js)

// Очень минимальный WebSocket signaling для двух участников
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3001 });
const rooms = new Map();

wss.on('connection', ws => {
  ws.on('message', msg => {
    try {
      const m = JSON.parse(msg);
      if (m.cmd === 'join') {
        const { room } = m;
        ws.room = room;
        if (!rooms.has(room)) rooms.set(room, []);
        rooms.get(room).push(ws);
        // keep only last two
        rooms.set(room, rooms.get(room).slice(-2));
        ws.send(JSON.stringify({ cmd:'joined' }));
      } else if (m.cmd === 'signal') {
        const peers = rooms.get(ws.room) || [];
        for (const p of peers) {
          if (p !== ws && p.readyState === WebSocket.OPEN) p.send(JSON.stringify({ cmd:'signal', data: m.data }));
        }
      }
    } catch (e) { console.error('parse err', e); }
  });
  ws.on('close', () => {
    if (!ws.room) return;
    const peers = (rooms.get(ws.room) || []).filter(p => p !== ws);
    if (peers.length) rooms.set(ws.room, peers); else rooms.delete(ws.room);
  });
});

console.log('Signaling server on ws://localhost:3001');

Клиент (этот HTML уже делает всё автоматически)

Коротко: HTML подключается к ws://тот_же_сервер:3001, шлёт join, и пересылает сигналы. Ничего руками не копировать.