I am writing my first peer-to-peer application to connect via WebRTC, and my code, to request an ice peer candidate that I send through socket.io, runs 6 times, not once.
This is really confusing, because if I mistakenly designed a large query loop, I would expect endless recursions, not just 6 (8 onicecandidate events). So can someone tell me why the following code created 6 recursions?
Here, the message handler, it simply sends a socket.io message driven by the syntax: Muveoo.Messenger.input('ice candidate request', data);
'ice candidate request' : function(data) { console.log('Debug 10: Requesting Ice Candidate'); socket.emit('ice candidate request', data); },
And here is the code that processes the Ice Candidate request, do not confuse the if logic at the top, the UID is just a unique identifier assigned to each client to decide who should make the proposal initially.
if (Muveoo.RTC.connectedPeers[id].dataChannels[name].UID < Muveoo.RTC.connectedPeers[id].dataChannels[name].peerUID) { Muveoo.RTC.connectedPeers[id].dataChannels[name].offerConnection(function() { console.log('[Debug A]: Offering Connection'); Muveoo.RTC.connectedPeers[id].dataChannels[name].pc.onicecandidate = function(evt) { console.log('[Debug A]: onicecandidate Event Triggered.'); if (evt.candidate) { console.log('[Debug A]: Sending Ice Candidate Request.'); Muveoo.Messenger.input('ice candidate request', { target : id, candidate : evt.candidate, channel : name }); } }; Muveoo.RTC.connectedPeers[id].dataChannels[name].pc.ondatachannel = function(evt) { console.log('got data channel'); Muveoo.RTC.connectedPeers[id].dataChannels[name] = evt.channel; Muveoo.RTC.connectedPeers[id].dataChannels[name].channel.onmessage = function(evt1) { handleMessage(evt1.data); }; Muveoo.RTC.connectedPeers[id].dataChannels[name].channel.message = function(msg) { Muveoo.RTC.connectedPeers[id].dataChannels[name].channel.send(JSON.stringify(msg)); }; }; socket.on('session description', function(data) { console.log('Debug 12: Session Description Received'); Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].desc = new Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].sessionDescription(msg.desc); Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].pc.setRemoteDescription(Muveoo.RTC.connectedPeers[data.target].dataChannels[data.name].desc); if (Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].UID > Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].peerUID) { Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].pc.createAnswer(function(answer) { Muveoo.RTC.connectedPeers[data.target].dataChannels[data.channel].pc.setLocalDescription(answer); var data = { target : data.target, description : answer, channel : data.channel }; socket.emit('session description', data); }); } }); }); }
And here are the resulting logs to show what is happening:
[Debug A]: Offering Connection rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:101 [Debug A]: Sending Ice Candidate Request. messenger.js:91 Debug 10: Requesting Ice Candidate rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:101 [Debug A]: Sending Ice Candidate Request. messenger.js:91 Debug 10: Requesting Ice Candidate rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:101 [Debug A]: Sending Ice Candidate Request. messenger.js:91 Debug 10: Requesting Ice Candidate rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:101 [Debug A]: Sending Ice Candidate Request. messenger.js:91 Debug 10: Requesting Ice Candidate rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:101 [Debug A]: Sending Ice Candidate Request. messenger.js:91 Debug 10: Requesting Ice Candidate rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:94 [Debug A]: onicecandidate Event Triggered. rtc.js:101 [Debug A]: Sending Ice Candidate Request. messenger.js:91 Debug 10: Requesting Ice Candidate rtc.js:94 [Debug A]: onicecandidate Event Triggered.
Why does my Ice Candidate request fire 6 times instead of 1?