I am trying to implement a simple messaging mechanism between my browser (peer 1) and another browser (peer 2) on a different network. I am using Google's public STUN servers for learning.
Peer 1 does the following first:
const iceConfiguration = {
iceServers: [
{
urls: [
'stun:stunserver.stunprotocol.org',
'stun:stun.sipgate.net:10000',
],
},
]
}
const lc = new RTCPeerConnection(iceConfiguration)
const dc = lc.createDataChannel("channel");
dc.onmessage = e => console.log("Just got a message: " + e.data);
dc.onopen = e => console.log("Connection opened.")
lc.onicecandidate = e => console.log("New Ice Candidate! Reprinting SDP" + JSON.stringify(lc.localDescription))
lc.createOffer().then(o => lc.setLocalDescription(o)).then(a => console.log("Set successfully."))
Then, I copy the generated SDP and send it to peer 2 which then does the following:
/*
REMOTE_OFFER_OBJECT is the SDP generated by peer 1
*/
const offer = REMOTE_OFFER_OBJECT
const iceConfiguration = {
iceServers: [
{
urls: [
'stun:stunserver.stunprotocol.org',
'stun:stun.sipgate.net:10000',
],
},
]
}
const rc = new RTCPeerConnection(iceConfiguration);
rc.onicecandidate = e => console.log("New Ice Candidate! Reprinting SDP" + JSON.stringify(rc.localDescription))
rc.ondatachannel = e => {
rc.dc = e.channel;
rc.dc.onmessage = e => console.log("New message: ", e.data)
rc.dc.onopen = e => console.log("Connection opened.")
}
rc.setRemoteDescription(offer).then(a => console.log("Offer set."))
rc.createAnswer().then(a => rc.setLocalDescription(a)).then(a => console.log("Answer created."))
Peer 2 copies its generated SDP and sends it to peer 1 which then attempts to set its remote description:
const answer = REMOTE_ANSWER_OBJECT
lc.setRemoteDescription(answer)
The last statement keeps pending for too long and doesn't stop. It works properly if peer 2 is on my same network. I might be setting the STUN servers wrong or maybe the public Google STUN servers are a bad idea. Also, the createOffer() and createAnswer() calls generate several SDPs but I only copy and send the last ones. How can I properly set up the peer 2 peer connection with somebody on a different network in WebRTC? I hope there is a solution with free STUN servers as I am doing it for learning only at the moment.
In my case, a TURN server is required. That is why the answer cannot be set as the remote description as the offerrer cannot find a path to the answerer. TURN servers will most likely cost money unless I configure my own using a Coturn image on Docker.