peerjs — закрытие соединения с определенным идентификатором однорангового узла без разрушения однорангового соединения

#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 закрыт.