#javascript #node.js #webrtc #peerjs
Вопрос:
я пытаюсь написать случайное приложение для видеочата p2p , случайным образом выбираются 2 онлайн-пользователя, и они начинают общаться (с возможностью пригласить друга, чтобы в общей сложности в чате было 3 человека ) … я хочу, чтобы они могли пропустить своего партнера и вместо этого пообщаться с другим случайным пользователем, если захотят
вот упрощенная версия моего кода
var OURSTRAM ; const CurrentPeers = [] ; var peer ; io = io.connect(); // chat starts when users clicks the #start-chat button we add our stream and get our peer connection $(document).on('click' , '#start-chat' , function(){ navigator.mediaDevices.getUserMedia({ video : true , audio : true }) .then((stream) =gt; { var ourVideArea = $('#our-video')[0]; ourVideArea.srcObject = stream ; ourVideArea.play(); OURSTRAM = stream ; init_peer(); }) .catch( (e)=gt;{ console.log('error2' , e ); }); }) // starting peer connection and sending our peer id to signaling server function init_peer(){ peer = new Peer({ config: {'iceServers': 'iceServersList' } }); peer.on('open', function(id) { io.emit('ready' , { peer_id : id }); }); peer.on('call' , function (call) { call.answer(OURSTRAM); call.on('stream' , function(remoteStream){ addRemoteVideo(remoteStream , call.peer , 'oncall'); }) }) } // reciving peer_id of remote user from signaling server io.on('incoming_chat' , function(data){ callPeer(data.peer_id); }) function callPeer( id ) { let call = peer.call(id , OURSTRAM); call.on('stream' , function(remoteStream) { addRemoteVideo(remoteStream , id , 'callPeer'); }); } function addRemoteVideo(stream , peer_id , caller ){ if(CurrentPeers.includes(peer_id)) { return ; } CurrentPeers.push(peer_id); let remoteVideArea = $('#their-video')[0]; remoteVideArea.srcObject = stream ; remoteVideArea.play(); }
итак , вот в чем проблема, когда пользователи нажимают кнопку пропустить чат и в основном хотят пообщаться с другим онлайн-пользователем вместо текущего, я отправлю эту информацию на сервер
$(document).on('click' , '#skip-chat-btn' , function (){ io.emit('chat_skip'); })
сервер сообщит обеим сторонам , что чат окончен, оба пользователя получат remove_peer
с сервера идентификатор peer_id другого пользователя
io.on('remove_peer' , function(data){ console.log(`removing peer ${data.remote_peer_id}`); })
и они получат другой идентификатор пользователя peer_id (новое incoming_chat
событие )
я очень новичок в peerjs и webrtc в целом , но я предполагаю, что мне каким-то образом нужно закрыть одноранговое соединение между этими двумя пользователями … текущий код автоматически добавит нового входящего пользователя в чат, что не является проблемой … я не знаю, как удалить текущего однорангового
в документации есть peer.destroy()
метод
но , похоже , это разрушает одноранговое соединение все вместе, что нехорошо, потому что мне нужно одноранговое соединение для следующего входящего чата, также я не хочу терять соединение с третьим лицом (приглашенным гостем), мне просто нужно удалить определенный идентификатор peer_id из моего соединения, что-то вроде
peer.closeRemotePeer( remote_peer_id)
для того , чтобы текущее соединение не тратило впустую ресурсы и пропускную способность, или, может быть, это не важно, и просто удалить их поток и добавить новый поток пользователей было бы нормально (в чем я сомневаюсь ) … может быть, мне нужно создать новое одноранговое соединение все вместе после окончания каждого чата ?
я очень растерян, и любая помощь будет признательна
Комментарии:
1. завершение чата между 2 конкретными людьми, чтобы затем начать новый чат , будет отдельным подключением или.. отдельным
Peer
.. так что, возможно, сделайте что-то вродеio.on('remove_peer' , function(data){ /*some-code*/;init_peer(); })
того, чтобы переменнаяpeer
указывала на новое одноранговое соединение2. Вы можете предложить другим пользователям, чтобы один из партнеров закрыл соединение и ушел; но ничего не нужно делать, чтобы закрыть идентификатор peer_id, так как он не может быть использован повторно. Просто добавьте флаг, указывающий, что peer_id закрыт.