Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Mahmoudz opened this issue May 25, 2018 · 0 comments
Open

Comments

@Mahmoudz
Copy link

Mahmoudz commented May 25, 2018

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) {...}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant