diafygi/webrtc-ips

Feature Request: Return default IP when browser doesn't support it.

Mahmoudz opened this issue · 0 comments

The code doesn't work on Mobile, or at least it doesn't return anything. It would be better if there's a way to return a default value, whenever no IP should be returned.

Example (I marked my changed lines):

        function getIPs(defaultIp, callback) {        // <<<<<<<<<<<<<<
            var callbackCalled = false;               // <<<<<<<<<<<<<<
            var ip_dups = {};
            //compatibility for firefox and chrome
            var RTCPeerConnection = window.RTCPeerConnection
                || window.mozRTCPeerConnection
                || window.webkitRTCPeerConnection;
            var useWebKit = !!window.webkitRTCPeerConnection;
            
            //bypass naive webrtc blocking using an iframe
            if (!RTCPeerConnection) {
            
                //NOTE: you need to have an iframe in the page right above the script tag
                //
                //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
                //<script>...getIPs called in here...
                //
                var win = iframe.contentWindow;
                RTCPeerConnection = win.RTCPeerConnection
                    || win.mozRTCPeerConnection
                    || win.webkitRTCPeerConnection;
                useWebKit = !!win.webkitRTCPeerConnection;
            }
            
            //minimal requirements for data connection
            var mediaConstraints = {
                optional: [{RtpDataChannels: true}]
            };
            var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
            //construct a new RTCPeerConnection
            var pc = new RTCPeerConnection(servers, mediaConstraints);
            
            function handleCandidate(candidate) {
                //match just the IP address
                var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
                var ip_addr = ip_regex.exec(candidate)[1];
                //remove duplicates
                if (ip_dups[ip_addr] === undefined) {
                    callbackCalled = true;       // <<<<<<<<<<<<<<
                    callback(ip_addr);
                }
                ip_dups[ip_addr] = true;
            }
            //listen for candidate events
            pc.onicecandidate = function (ice) {
                //skip non-candidate events
                if (ice.candidate){
                    handleCandidate(ice.candidate.candidate);
                }
            };
            
            //create a bogus data channel
            pc.createDataChannel("");
            //create an offer sdp
            pc.createOffer(function (result) {
                //trigger the stun server request
                pc.setLocalDescription(result, function () {
                }, function () {
                });
            }, function () {
            });
            //wait for a while to let everything done
            setTimeout(function (defaultIp) {      // <<<<<<<<<<<<<<
                //read candidate info from local description
                var lines = pc.localDescription.sdp.split('\n');
                lines.forEach(function (line) {
                    if (line.indexOf('a=candidate:') === 0){
                        handleCandidate(line);
                    }
                });
                // if no callback was sent
                if(callbackCalled === false){  // <<<<<<<<<<<<<<
                    callback(defaultIp);       // <<<<<<<<<<<<<<
                }
            }, 1000);

        }

// usage:
getIPs('0.0.0.0', function (ip) {...}