123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- function switchTo(type, newStatus) {
- var unknown = document.querySelector('#status-' + type + ' .status-unknown');
- if (unknown) {
- unknown.classList.add('hidden');
- }
- var test = document.querySelector('#status-' + type + ' .status-test')
- if (test) {
- test.classList.add('hidden');
- }
- document.querySelector('#status-' + type + ' .status-no').classList.add('hidden');
- document.querySelector('#status-' + type + ' .status-yes').classList.add('hidden');
- document.querySelector('#status-' + type + ' .status-' + newStatus).classList.remove('hidden');
- }
- function setupChecks() {
- var start = document.querySelector('#start');
- var helpText = document.querySelector('#help-text');
- var checks = document.querySelector('#checks');
- start.addEventListener('click', function(e) {
- start.classList.add('hidden');
- helpText.classList.add('hidden');
- checks.classList.remove('hidden');
- doChecks();
- });
- }
- function doChecks() {
- // Check for JS
- switchTo('js', 'yes');
- // Check for RTCPeerConnection
- if (window.RTCPeerConnection) {
- switchTo('pc', 'yes');
- } else {
- switchTo('pc', 'no');
- }
- // Check for RTCDataChannel
- if (window.RTCPeerConnection && (new RTCPeerConnection()).createDataChannel) {
- switchTo('dc', 'yes');
- switchTo('turn', 'test');
- } else {
- switchTo('dc', 'no');
- switchTo('turn', 'no');
- }
- // Check for LocalStorage
- function localStorageAvailable(){
- var test = 'test';
- try {
- localStorage.setItem(test, test);
- localStorage.removeItem(test);
- return true;
- } catch(e) {
- return false;
- }
- }
- if (localStorageAvailable()) {
- switchTo('ls', 'yes');
- } else {
- switchTo('ls', 'no');
- }
- // Check for desktop notifications
- if ('Notification' in window) {
- switchTo('dn', 'yes');
- } else {
- switchTo('dn', 'no');
- }
- // Check for TURN connectivity
- var timeout = null;
- function turnSuccess() {
- switchTo('turn', 'yes');
- clearTimeout(timeout);
- }
- function turnFail() {
- switchTo('turn', 'no');
- document.querySelector('#status-turn .results').classList.add('hidden');
- document.querySelector('#status-turn .status-no .small').classList.remove('hidden');
- }
- function testTurn() {
- timeout = setTimeout(function() {
- turnFail();
- }, 10000);
- var noop = function() {};
- var pc = new RTCPeerConnection({iceServers: [{
- urls: [
- 'turn:ds-turn.threema.ch:443?transport=udp',
- 'turn:ds-turn.threema.ch:443?transport=tcp',
- 'turns:ds-turn.threema.ch:443',
- ],
- username: 'threema-angular-test',
- credential: 'VaoVnhxKGt2wD20F9bTOgiew6yHQmj4P7y7SE4lrahAjTQC0dpnG32FR4fnrlpKa',
- }]});
- document.querySelector('#status-turn .results').classList.remove('hidden');
- var resultData = document.querySelector('#status-turn .result-data');
- pc.createDataChannel('test');
- console.info('Creating offer...');
- pc.createOffer(function(sdp) { pc.setLocalDescription(sdp, noop, noop) }, noop);
- pc.onicecandidate = function(ice) {
- if (ice.candidate === null) {
- console.info('Done collecting candidates.');
- } else if (ice.candidate.candidate) {
- var candidate = SDPUtils.parseCandidate(ice.candidate.candidate);
- console.debug(candidate);
- if (candidate.type === 'relay') {
- var info = '[' + candidate.type + '] ' + candidate.ip + ':' + candidate.port + ' (' + candidate.protocol + ')';
- if (candidate.relatedAddress.indexOf(':') !== -1) {
- info += ' (ipv6)';
- } else if (candidate.relatedAddress.indexOf('.') !== -1) {
- info += ' (ipv4)';
- } else {
- info += ' (?)';
- }
- resultData.innerHTML += info + '<br>';
- turnSuccess();
- }
- } else {
- console.warn('Invalid candidate:', ice.candidate.candidate);
- }
- }
- }
- testTurn();
- }
- if (document.readyState != 'loading') {
- setupChecks();
- } else {
- document.addEventListener('DOMContentLoaded', setupChecks);
- }
|