Как правильно уничтожить RTCPeerConnection в JavaScript? - PullRequest
0 голосов
/ 28 августа 2018

Когда я создаю new RTCPeerConnection(), я не могу уничтожить его с помощью peer.close (), насколько я вижу, и через некоторое время у меня заканчиваются ресурсы. Когда веб-страница создает много RTCPeerConnection с, она перестает работать после примерно 600 попыток и выдает следующую ошибку в Chrome:

Uncaught DOMException: Не удалось создать 'RTCPeerConnection': Невозможно создать столько PeerConnections

Вот тестовый скрипт, который поможет вам получить ошибку. Это только для иллюстрации, проблема возникает, даже если пиры создаются гораздо медленнее:

var i = 1;

function peer() {
  var peer = new RTCPeerConnection();
  setTimeout(() => {
    peer.close();
    peer=null;
  }, 10);
  console.log(i++);
}

setInterval(peer, 20);
// run the script and wait on console to see the error

Я ожидаю, что он освободит все ресурсы при вызове peer.close () или, по крайней мере, когда для peer установлено значение null, поэтому я не вижу причин, по которым браузер выдает ошибку, что существует так много PeerConnections. Я что-то делаю неправильно? Как правильно уничтожить пира? Спасибо

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

ОК, это была загадочная загадка, к счастью, она решена, я постараюсь привести вам пример, чтобы любой, кто читает этот пост, мог понять, что именно происходит.

Предположим, что вы создали собственную программу, которая может считать файлы в одной папке, и вы приказали программе считать файлы в папке C: \ Files

этот путь к папке содержит 500 файлов. программа будет читать максимум 500 часов, это его максимальная способность, поэтому вы отдаете ему приказ и нажимаете ввод.

через час вы вернулись, увидели, что программа (Dead), вы исследуете, в чем проблема? затем вы обнаружите, что, поскольку его максимальная способность читать 500 файлов в час и в папке, содержащей 500 файлов, он никак не может сделать ошибку, но ошибка появилась, потому что есть кто-то, кто продолжает бросать файлы в эту папку с бесконечным циклом, его как будто ему требуется 1 секунда, чтобы прочитать файл, и в течение той же одной секунды еще 5 файлов поступают накапливающимся способом он начинает считать, а новые файлы подсчитываются кумулятивно.

это именно то, что происходит в вашем случае, браузер chrome закрывает одноранговое соединение через одну секунду, и в течение этой одной секунды вы запускаете ему 3-4 новых одноранговых соединения, что делает браузер chrome через некоторое время, отмечая ошибку на консоли, потому что вычисление на фоне консоли указывает, что это бесконечность, и это покажет ошибку стека рано или поздно. часть того, что вы заполняете кеш вашего браузера, устанавливая интервал времени с этими значениями.

Я отслеживал это почти три часа, и это результат, с которым я в конечном итоге. я скоро отредактирую этот пост и добавлю решение о том, как его решить.

ОК, я только что закончил настройку кода, вот что я получаю в результате выполнения снип-кода и скажите мне, если вы видите ошибки на вашей консоли Chrome примечание: вы можете удалить sip java-скрипт, я использовал его для отслеживания вашей ошибки.

надеюсь, мой пост поможет кому-нибудь в будущем.

удачи

 <script src="http://sipjs.com/download/sip-0.7.2.min.js"></script>

 <meta http-equiv="Expires" content="0">
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Cache-control" content="no-cache">
 <meta http-equiv="Cache" content="no-cache">
 <script>



  var i = 1;

  function peer() {

  var peer = new RTCPeerConnection();
   
  peer.mediaHandler = null;
  peer.onicecandidate = null; 
  peer.onaddstream = null; 

  peer.close(i);

  setTimeout(() => {

  console.log('Ending Call');

  }, 3500);
  console.log(i++);



  }

 setInterval(peer, 500);


  hangUp = () => {
    let { peer} = this.state;
 
    peer.close();

 
    this.setState({
        peer: null,
      
   
    });
};




</script>
0 голосов
/ 28 августа 2018

Попробуйте установить равным нулю peer, чтобы он собирал мусор. См. эти заметки от лица, которое ввело ограничение. Если это не работает, спросите в этой ветке списка рассылки

...