There is a Chrome extension, WebRTC Network Limiter, that Configures how WebRTC's network traffic is routed by changing Chrome's privacy settings. You can force traffic to go through TURN without having to do any SDP mangling.
EDIT 1
The point of making this available in extensions, is for users that are worried about their security. You can check this excellent post about WebRTC security. The same as this extension does, can also be done in FF, by changing the flag media.peerconnection.ice.relay_only
. This can be found in about:config
. Don't know about the other two, but I'd wager they do have something similar.
On the other hand, if you are distributing an app and want all your clients to go through TURN, you won't have access to their browsers, and can't expect them to change those flags or install any extension. In that case, you'll have to mangle your SDP. You can use this code
function onIceCandidate(event) {
if (event.candidate) {
var type = event.candidate.candidate.split(" ")[7];
if (type != "relay") {
trace("ICE - Created " + type + " candidate ignored: TURN only mode.");
return;
} else {
sendCandidateMessage(candidate);
trace("ICE - Sending " + type + " candidate.");
}
} else {
trace("ICE - End of candidate generation.");
}
}
That code is taken from the discuss-webrtc list.
If you never get those candidates, it might very well be that your TURN server is not correctly configured. You can check your TURN server in this page. Don't forget to remove the existing STUN server configured in that demo.
EDIT 2
Even simpler: set iceTransportPolicy: "relay"
in your WebRtcPeer config to force TURN:
var options = {
localVideo: videoInput, //if you want to see what you are sharing
onicecandidate: onIceCandidate,
mediaConstraints: constraints,
sendSource: 'screen',
iceTransportPolicy: 'relay',
iceServers: [{ urls: 'turn:XX.XX.XX.XX', username:'user', credential:'pass' }]
}
webRtcPeerScreencast = kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error) {
if (error) return onError(error) //use whatever you use for handling errors
this.generateOffer(onOffer)
});