Test TURN Server
Test TURN Server - WebRTC tool
by Chris Vitalos
HTML
<h1>
Test TURN server
</h1>
<div>
TURN URL: <input id='url' placeholder='example.com or xxx.yyy.rrr.ddd' /> Port: <input type='number' value='3478' id='port' placeholder='enter a port number' />
</div>
<div>
Transport: <input type="radio" name="transport" id="tcp" value="tcp" /> TCP
<input type="radio" name="transport" id="udp" value="udp" checked/>UDP
</div>
<div>
Username: <input id="name" placeholder="turn username" />
</div>
<div>
password: <input id="pass" placeholder="turn password" />
</div>
<div>
checking Timeout: <input type='number' id="time" placeholder="wait time before checking timeout" value=5000 />
</div>
<div>
<button id='button'>
Check TURN Server
</button>
</div>
<h4 id='result'></h4>
CSS
#url {
width: 250px;
}
#port {
width: 70px;
}
JavaScript
var res = id('result');
id('button').onclick = function() {
res.innerHTML = 'Checking TURN Server...';
var url = 'turn:' + id('url').value + ':' + id('port').value,
useUDP = id('udp').checked;
url += '?transport=' + (useUDP ? 'udp' : 'tcp');
checkTURNServer({
urls: url,
username: id('name').value,
credential: id('pass').value
}, id('time').value).then(function(bool) {
if (bool)
res.innerHTML = 'Yep, the TURN server works...';
else
throw new Error('Doesn\'t work');
}).catch(function(e) {
console.log(e);
res.innerHTML = 'TURN server does not work.';
});
};
function checkTURNServer(turnConfig, timeout) {
console.log('turnConfig: ', turnConfig);
return new Promise(function(resolve, reject) {
setTimeout(function() {
if (promiseResolved) return;
resolve(false);
promiseResolved = true;
}, timeout || 5000);
var promiseResolved = false,
myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection //compatibility for firefox and chrome
,
pc = new myPeerConnection({
iceServers: [turnConfig]
}),
noop = function() {};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(function(sdp) {
if (sdp.sdp.indexOf('typ relay') > -1) { // sometimes sdp contains the ice candidates...
promiseResolved = true;
resolve(true);
}
pc.setLocalDescription(sdp, noop, noop);
}, noop); // create offer and set local description
pc.onicecandidate = function(ice) { //listen for candidate events
if (promiseResolved || !ice || !ice.candidate || !ice.candidate.candidate || !(ice.candidate.candidate.indexOf('typ relay') > -1)) return;
promiseResolved = true;
resolve(true);
};
});
}
function id(val) {
return document.getElementById(val);
}