P2P mesh: браузер ↔ браузер

Медиа идёт напрямую между участниками (mesh). Сигналинг — ваш локальный node server.mjs (не тарифицируется как звонок Voximplant). Voximplant ниже — только вход в приложение (опционально), без sdk.call() в PSTN. Запуск: в папке p2p выполнить npm install и npm start, открыть http://127.0.0.1:3333. Коллега в той же LAN: тот же URL с IP вашего ПК, порт 3333. Через интернет — VPN, SSH-туннель или вынести сервер на VPS. На прод-сервере nginx должен проксировать WebSocket на путь /signal к процессу node server.mjs (см. пример ниже). Иначе в логе будет WS error / WS closed сразу после подключения. Другой хост/порт сигналинга: параметр в URL ?signal=wss://другой.хост:3333/signal&room=... Если нет веб-камеры, после ошибки на «видео+аудио» запрашивается только микрофон (раньше весь вход в mesh блокировался). Если в логе у собеседника pc state … failed при рабочем WebSocket — это почти всегда сеть/NAT: поднимите свой TURN (например coturn на том же VPS) и задайте серверы в window.P2P_TURN_SERVERS (см. скрипт ниже).

location /signal {
  proxy_pass http://127.0.0.1:3333;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header Host $host;
  proxy_read_timeout 86400;
}
Комната
Voximplant (опционально, только логин в приложение)
не авторизован
Локально (после входа в mesh)