webrtc底層一對一鏈接過程探索(三)

1、鏈接過程繼續解讀-----fun33-fun37解讀web

完整代碼以下:瀏覽器

    //fun33-37
    console.error('fun35-37==>2332==>2332');
    var q = window.MediaStream;
    void 0 === q && 
    "undefined" != typeof webkitMediaStream && 
    (q = webkitMediaStream), 
    void 0 !== q &&
    (   "getVideoTracks" in q.prototype 
        || (q.prototype.getVideoTracks = function() {
                console.info('fun3537.03b==>2348==>2348');
                if (!this.getTracks) return [];
                var e = [];
                return this.getTracks.forEach(function(n) {
                    -1 !== ("" + n.kind).indexOf("video") && e.push(n)
                }), e
           }, 
        console.info('fun3537.04==>2357==>2357'),
        q.prototype.getAudioTracks = function() {
            console.info('fun3537.04==>2356==>2356');
            if (!this.getTracks) return [];
            var e = [];
            return this.getTracks.forEach(function(n) {
                -1 !== ("" + n.kind).indexOf("audio") && e.push(n)
            }), e
        }), 
    console.info('fun3537.05==>2367==>2367'),
    "stop" in q.prototype || (q.prototype.stop = function() {
        console.info('fun3537.05==>2367==>2367');
            this.getAudioTracks().forEach(function(e) {
                e.stop && e.stop()
            }), 
            this.getVideoTracks().forEach(function(e) {
                e.stop && e.stop()
            })
        })
),

1.1 代碼段一app

var q = window.MediaStream;

 q是個函數,用於獲取媒體數據。ide

1.2 代碼段二函數

void 0 === q &&

"undefined" != typeof webkitMediaStream &&

(q = webkitMediaStream),

注:經測試,void ===q爲false,因此就不必向後執行了,實際上,webkitMediaStream也是個函數,不是undefined.測試

1.3 代碼段三this

    void 0 !== q &&

    (   console.info('fun3537.03a==>2345==>2345')&&

        "getVideoTracks" in q.prototype

        || (q.prototype.getVideoTracks = function() {

                console.info('fun3537.03b==>2348==>2348');

                if (!this.getTracks) return [];

                var e = [];

                return this.getTracks.forEach(function(n) {

                    -1 !== ("" + n.kind).indexOf("video") && e.push(n)

                }), e

           },

注:q.prototype是向對象裏面添加屬性的方法,以下:spa

由於"getVideoTracks" in q.prototype是成立的,因此,後面的函數沒有走。prototype

1.4 代碼段四      日誌

console.info('fun3537.04==>2357==>2357'),

        q.prototype.getAudioTracks = function() {

            console.info('fun3537.04==>2356==>2356');

            if (!this.getTracks) return [];

            var e = [];

            return this.getTracks.forEach(function(n) {

                -1 !== ("" + n.kind).indexOf("audio") && e.push(n)

            }), e

        })

注:這個函數是緊接着上面那個函數,逗號表達式裏面的。 由於"getVideoTracks" in q.prototype成立,就不走這個函數了。

1.5 代碼段五

console.info('fun3537.05a==>2367==>2367'),

    "stop" in q.prototype || (q.prototype.stop = function() {

        console.info('fun3537.05b==>2367==>2367');

            this.getAudioTracks().forEach(function(e) {

                e.stop && e.stop()

            }),

            this.getVideoTracks().forEach(function(e) {

                e.stop && e.stop()

            })

        })

),

注:若是成立,就是說若是stop在q.prototype中,就無論了,若是不在就定義個函數過去。

 

2、鏈接過程繼續解讀-----fun38嘗試理解

2.1 fun38代碼總體

 總體代碼太多,再也不展現,只能分段展現。

2.2 fun38.01

            //fun38.01

            function e() {

                var e, n, t, o = (c.appVersion, c.userAgent),

                    i = c.appName,

                    r = "" + parseFloat(c.appVersion),

                    s = parseInt(c.appVersion, 10);

                if (f) {

                    i = "Opera";

                    try {

                        r = c.userAgent.split("OPR/")[1].split(" ")[0], s = r.split(".")[0]

                    } catch (a) {

                        r = "0.0.0.0", s = 0

                    }

                } else g ? (n = o.indexOf("MSIE"), i = "IE", r = o.substring(n + 5))

                : v ? (n = o.indexOf("Chrome"), i = "Chrome", r = o.substring(n + 7))

                : p ? (n = o.indexOf("Safari"), i = "Safari", r = o.substring(n + 7),

                -1 !== (n = o.indexOf("Version")) && (r = o.substring(n + 8))) : m

                ? (n = o.indexOf("Firefox"), i = "Firefox", r = o.substring(n + 8))

                : (e = o.lastIndexOf(" ") + 1) < (n = o.lastIndexOf("/"))

                && (i = o.substring(e, n),

                    r = o.substring(n + 1),

                    i.toLowerCase() === i.toUpperCase() && (i = c.appName));

                return l && (i = "Edge", r = "" +

                parseInt(c.userAgent.match(/Edge\/(\d+).(\d+)$/)[2], 10)),

                -1 !== (t = r.indexOf(";")) && (r = r.substring(0, t)),

                -1 !== (t = r.indexOf(" ")) && (r = r.substring(0, t)),

                s = parseInt("" + r, 10),

                isNaN(s) && (r = "" + parseFloat(c.appVersion),

                s = parseInt(c.appVersion, 10)),

                {

                    fullVersion: r,

                    version: s,

                    name: i,

                    isPrivateBrowsing: !1

                }

            }

分析以下:

1)定義幾個變量以下:

 var e, n, t,

o = (c.appVersion, c.userAgent),

    i = c.appName,

    r = "" + parseFloat(c.appVersion),

s = parseInt(c.appVersion, 10);

a.) e,n,t定義的值是同樣的,都是未定義。以下:

b.) o = (c.appVersion, c.userAgent),

對於o來講,c.userAgent是o的最終值,哪怕爲空。

注:如今的關鍵問題是o = (c.appVersion, c.userAgent)中c從哪裏來的。

c.) i,r,s

注:i,r,s的值上面截圖中已給出,再也不詳述。

2)代碼段二

  if (f) {

    i = "Opera";

    try {

       r = c.userAgent.split("OPR/")[1].split(" ")[0], s = r.split(".")[0]

    } catch (a) {

     r = "0.0.0.0", s = 0

    }

 }

注:經打日誌,f爲false,從代碼可知,f用於判斷是否是Opera瀏覽器,false表示不是,true表示是。不是的話,就不走下面裏的代碼,直接看else便可。

3)代碼段三

else g ? (n = o.indexOf("MSIE"), i = "IE", r = o.substring(n + 5))

     : v ? (n = o.indexOf("Chrome"), i = "Chrome", r = o.substring(n + 7))

       : p ? (n = o.indexOf("Safari"), i = "Safari", r = o.substring(n + 7),

1g

  看g成立不成立,g爲false,說明不是IE瀏覽器。

2g不成立

走以下:

v ? (n = o.indexOf("Chrome"), i = "Chrome", r = o.substring(n + 7))

       : p ? (n = o.indexOf("Safari"), i = "Safari", r = o.substring(n + 7)

注:v成立不成立,v成立,說明是Chrome瀏覽器。

 

相關文章
相關標籤/搜索