69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
const Ice = document.getElementById('ice');
|
|
const IP = document.getElementById('ip');
|
|
const Stun = document.getElementById('stun');
|
|
const Turn = document.getElementById('turn');
|
|
const Err = document.getElementById('err');
|
|
|
|
const qs = new URLSearchParams(window.location.search);
|
|
|
|
let iceServers = filterXSS(qs.get('iceServers'));
|
|
|
|
if (iceServers) {
|
|
iceServers = JSON.parse(iceServers);
|
|
} else {
|
|
// http://localhost:3000/icetest
|
|
iceServers = [
|
|
// Test some STUN server
|
|
{
|
|
urls: 'stun:stun.l.google.com:19302',
|
|
},
|
|
// Test some TURN server
|
|
// https://www.metered.ca/tools/openrelay/
|
|
{
|
|
urls: 'turn:a.relay.metered.ca:443',
|
|
username: 'e8dd65b92c62d3e36cafb807',
|
|
credential: 'uWdWNmkhvyqTEswO',
|
|
},
|
|
];
|
|
}
|
|
|
|
console.log('Check Ice Servers', iceServers);
|
|
|
|
// Print iceServers config
|
|
Ice.innerText = JSON.stringify(iceServers, null, 4);
|
|
|
|
// Test the connections
|
|
const pc = new RTCPeerConnection({
|
|
iceServers,
|
|
});
|
|
|
|
pc.onicecandidate = (e) => {
|
|
if (!e.candidate) return;
|
|
|
|
console.log(e.candidate.candidate);
|
|
|
|
// If a srflx candidate was found, notify that the STUN server works!
|
|
if (e.candidate.type == 'srflx' || e.candidate.candidate.includes('srflx')) {
|
|
let ip = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/;
|
|
let address = e.candidate.address ? e.candidate.address : e.candidate.candidate.match(ip);
|
|
IP.innerText = '🟢 Your Public IP Address is ' + address;
|
|
Stun.innerText = '🟢 The STUN server is reachable!';
|
|
}
|
|
|
|
// If a relay candidate was found, notify that the TURN server works!
|
|
if (e.candidate.type == 'relay' || e.candidate.candidate.includes('relay')) {
|
|
Turn.innerText = '🟢 The TURN server is reachable!';
|
|
}
|
|
};
|
|
|
|
// handle error
|
|
pc.onicecandidateerror = (e) => {
|
|
console.error(e);
|
|
Err.innerText = '⚠️ ' + e.errorText;
|
|
};
|
|
|
|
pc.createDataChannel('test');
|
|
pc.createOffer().then((offer) => pc.setLocalDescription(offer));
|