{"version":3,"file":"uproxy-core-env.js","sources":["../arraybuffers/arraybuffers.js","../handler/queue.js","../crypto/random.js","../logging/logging.js","../webrtc/third_party/adapter.js","../webrtc/datachannel.js","../webrtc/peerconnection.js"],"names":["ArrayBuffers","byteEquality","b1","b2","a1","Uint8Array","a2","byteLength","i","concat","buffers","size","forEach","a","accumulatorBuffer","location","set","buffer","chunk","endByte","startByte","chunks","Math","min","push","slice","arrayBufferToString","bytes","length","String","fromCharCode","join","stringToArrayBuffer","s","ArrayBuffer","charCodeAt","arrayBufferToHexString","toString","hexStringToArrayBuffer","hexString","hexChars","split","parseInt","arrayBufferDecodedAsUtf8String","decodeURIComponent","escape","stringToUtf8EncodedArrayBuffer","str","strUtf8","unescape","encodeURIComponent","ab","Handler","PendingPromiseHandler","thing","_this","this","reject","e","completed_","console","error","reject_","handleWith","handler","then","fulfill_","promise","Promise","F","R","Queue","queue_","handler_","rejectFn_","getLength","isHandling","handle","x","pendingThing","processQueue_","shift","clear","Error","setHandler","setSyncHandler","resolve","stopHandling","setNextHandler","resultPromise","setSyncNextHandler","crypto","randomUint32","randomArray","Uint32Array","getRandomValues","Logging","dateToString_","d","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","isLevelAllowed_","request","permitted","LEVEL_CHARS","indexOf","formatStringMessageWithArgs_","msg","args","formatted_msg","replace","formatMessage","l","tag","timestamp","level","message","makeMessage","Date","doRealLog","enabled","Message","consoleFilter","log","warn","logBuffer","getEncrypedLogBuffer","getLogs","tags","filter","m","map","clearLogs","enable","disable","setConsoleFilter","parts","*","Log","tag_","debug","info","RTCPeerConnection","getUserMedia","attachMediaStream","reattachMediaStream","webrtcDetectedBrowser","webrtcDetectedVersion","createIceServer","getPeerConnectionEndpoints","candidateTypeMapping","host","serverreflexive","peerreflexive","relayed","navigator","mozGetUserMedia","userAgent","match","mozRTCPeerConnection","RTCSessionDescription","mozRTCSessionDescription","RTCIceCandidate","mozRTCIceCandidate","bind","url","username","password","iceServer","url_parts","turn_url_parts","credential","element","stream","mozSrcObject","play","to","from","MediaStream","prototype","getVideoTracks","getAudioTracks","pc","tryGetStats","getStats","report","result","key","res","type","selected","localCandidate","localCandidateId","local","address","ipAddress","port","portNumber","localType","candidateType","remoteCandidate","remoteCandidateId","remote","remoteType","window","setTimeout","webkitGetUserMedia","webkitRTCPeerConnection","srcObject","src","URL","createObjectURL","results","stat","localFields","remoteFields","WebRtc","CHUNK_SIZE","PC_QUEUE_LIMIT","MAX_MESSAGE_SIZE","pow","DataChannel","rtcDataChannel_","getLabel","label_","getState","readyState","onDataFromPeer_","messageEvent","data","dataFromPeerQueue","JSON","stringify","send","chunkStringOntoQueue_","chunkBufferOntoQueue_","toPeerDataQueue_","promises","all","handleSendDataToPeer_","conjestionControlSendHandler","bufferedAmount","close","opennedSuccessfully_","label","onceOpened","rejectOpened_","onopen","onceClosed","onclose","onmessage","onerror","SignalType","State","stringHash","hash","peerConnections","PeerConnection","config_","closeWorkaroundIndex_","createOffer_","pc_","createOffer","createAnswer_","createAnswer","setLocalDescription_","setLocalDescription","peerName","setRemoteDescription_","setRemoteDescription","addIceCandidate_","c","addIceCandidate","pcState","rejectConnected_","fulfillDisconnected_","signalingState","closeWithError_","onSignallingStateChange_","completeConnection_","addresses","fulfillConnected_","catch","negotiateConnection","openDataChannel","onceConnected","negotiateConnection_","localDescription","remoteDescription","fulfillConnecting_","signalForPeerQueue","description","sdp","handleSignalMessage","signal","fromPeerCandidateQueue","candidate","channelLabel","options","undefined","id","rtcDataChannel","createDataChannel","dataChannel","addRtcDataChannel_","onPeerStartedDataChannel_","rtcDataChannelEvent","channel","peerOpenedChannelQueue","dataChannels","webrtcPcConfig","webrtcMediaConstraints","onceConnecting","onceDisconnected","onicecandidate","event","sdpMid","sdpMLineIndex","onnegotiationneeded","ondatachannel","onsignalingstatechange","initiateConnection"],"mappings":"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","sourcesContent":["var ArrayBuffers;\n(function (ArrayBuffers) {\n    function byteEquality(b1, b2) {\n        var a1 = new Uint8Array(b1);\n        var a2 = new Uint8Array(b2);\n        if (a1.byteLength !== a2.byteLength)\n            return false;\n        for (var i = 0; i < a1.byteLength; ++i) {\n            if (a1[i] !== a2[i])\n                return false;\n        }\n        return true;\n    }\n    ArrayBuffers.byteEquality = byteEquality;\n    function concat(buffers, size) {\n        if (!size) {\n            size = 0;\n            buffers.forEach(function (a) {\n                size += a.byteLength;\n            });\n        }\n        var accumulatorBuffer = new Uint8Array(size);\n        var location = 0;\n        buffers.forEach(function (a) {\n            accumulatorBuffer.set(new Uint8Array(a), location);\n            location += a.byteLength;\n        });\n        return accumulatorBuffer.buffer;\n    }\n    ArrayBuffers.concat = concat;\n    function chunk(buffer, size) {\n        var startByte = 0;\n        var endByte;\n        var chunks = [];\n        while (startByte < buffer.byteLength) {\n            endByte = Math.min(startByte + size, buffer.byteLength);\n            if (startByte === 0 && endByte === buffer.byteLength) {\n                chunks.push(buffer);\n            }\n            else {\n                chunks.push(buffer.slice(startByte, endByte));\n            }\n            startByte += size;\n        }\n        return chunks;\n    }\n    ArrayBuffers.chunk = chunk;\n    function arrayBufferToString(buffer) {\n        var bytes = new Uint8Array(buffer);\n        var a = [];\n        for (var i = 0; i < bytes.length; ++i) {\n            a.push(String.fromCharCode(bytes[i]));\n        }\n        return a.join('');\n    }\n    ArrayBuffers.arrayBufferToString = arrayBufferToString;\n    function stringToArrayBuffer(s) {\n        var buffer = new ArrayBuffer(s.length);\n        var bytes = new Uint8Array(buffer);\n        for (var i = 0; i < s.length; ++i) {\n            bytes[i] = s.charCodeAt(i);\n        }\n        return buffer;\n    }\n    ArrayBuffers.stringToArrayBuffer = stringToArrayBuffer;\n    function arrayBufferToHexString(buffer) {\n        var bytes = new Uint8Array(buffer);\n        var a = [];\n        for (var i = 0; i < buffer.byteLength; ++i) {\n            a.push(bytes[i].toString(16));\n        }\n        return a.join('.');\n    }\n    ArrayBuffers.arrayBufferToHexString = arrayBufferToHexString;\n    function hexStringToArrayBuffer(hexString) {\n        if (hexString === '') {\n            return new ArrayBuffer(0);\n        }\n        var hexChars = hexString.split('.');\n        var buffer = new ArrayBuffer(hexChars.length);\n        var bytes = new Uint8Array(buffer);\n        for (var i = 0; i < hexChars.length; ++i) {\n            bytes[i] = parseInt('0x' + hexChars[i]);\n        }\n        return buffer;\n    }\n    ArrayBuffers.hexStringToArrayBuffer = hexStringToArrayBuffer;\n    function arrayBufferDecodedAsUtf8String(buffer) {\n        var bytes = new Uint8Array(buffer);\n        var a = [];\n        for (var i = 0; i < bytes.length; ++i) {\n            a.push(String.fromCharCode(bytes[i]));\n        }\n        return decodeURIComponent(escape(a.join('')));\n    }\n    ArrayBuffers.arrayBufferDecodedAsUtf8String = arrayBufferDecodedAsUtf8String;\n    function stringToUtf8EncodedArrayBuffer(str) {\n        var strUtf8 = unescape(encodeURIComponent(str));\n        var ab = new Uint8Array(strUtf8.length);\n        for (var i = 0; i < strUtf8.length; i++) {\n            ab[i] = strUtf8.charCodeAt(i);\n        }\n        return ab.buffer;\n    }\n    ArrayBuffers.stringToUtf8EncodedArrayBuffer = stringToUtf8EncodedArrayBuffer;\n})(ArrayBuffers || (ArrayBuffers = {}));\n//# sourceMappingURL=arraybuffers.js.map","var Handler;\n(function (Handler) {\n    var PendingPromiseHandler = (function () {\n        function PendingPromiseHandler(thing) {\n            var _this = this;\n            this.thing = thing;\n            this.reject = function (e) {\n                if (_this.completed_) {\n                    console.error('handleWith must not be called on a completed promise.');\n                    return;\n                }\n                _this.completed_ = true;\n                _this.reject_(e);\n            };\n            this.handleWith = function (handler) {\n                if (_this.completed_) {\n                    console.error('handleWith must not be called on a completed promise.');\n                    return;\n                }\n                _this.completed_ = true;\n                handler(_this.thing).then(_this.fulfill_);\n            };\n            this.promise = new Promise(function (F, R) {\n                _this.fulfill_ = F;\n                _this.reject_ = R;\n            });\n            this.completed_ = false;\n        }\n        return PendingPromiseHandler;\n    })();\n    var Queue = (function () {\n        function Queue() {\n            var _this = this;\n            this.queue_ = [];\n            this.handler_ = null;\n            this.rejectFn_ = null;\n            this.getLength = function () {\n                return _this.queue_.length;\n            };\n            this.isHandling = function () {\n                return _this.handler_ !== null;\n            };\n            this.handle = function (x) {\n                if (_this.handler_) {\n                    return _this.handler_(x);\n                }\n                var pendingThing = new PendingPromiseHandler(x);\n                _this.queue_.push(pendingThing);\n                return pendingThing.promise;\n            };\n            this.processQueue_ = function () {\n                while (_this.handler_ && _this.queue_.length > 0) {\n                    _this.queue_.shift().handleWith(_this.handler_);\n                }\n            };\n            this.clear = function () {\n                while (_this.queue_.length > 0) {\n                    var pendingThing = _this.queue_.shift();\n                    pendingThing.reject(new Error('Cleared by Handler'));\n                }\n            };\n            this.setHandler = function (handler) {\n                if (_this.rejectFn_) {\n                    _this.rejectFn_(new Error('Cancelled by a call to setHandler'));\n                    _this.rejectFn_ = null;\n                }\n                _this.handler_ = handler;\n                _this.processQueue_();\n            };\n            this.setSyncHandler = function (handler) {\n                _this.setHandler(function (x) {\n                    return Promise.resolve(handler(x));\n                });\n            };\n            this.stopHandling = function () {\n                if (_this.rejectFn_) {\n                    _this.rejectFn_(new Error('Cancelled by a call to setHandler'));\n                    _this.rejectFn_ = null;\n                }\n                _this.handler_ = null;\n            };\n            this.setNextHandler = function (handler) {\n                return new Promise(function (F, R) {\n                    _this.setHandler(function (x) {\n                        _this.handler_ = null;\n                        _this.rejectFn_ = null;\n                        var resultPromise = handler(x);\n                        resultPromise.then(F);\n                        return resultPromise;\n                    });\n                    _this.rejectFn_ = R;\n                });\n            };\n            this.setSyncNextHandler = function (handler) {\n                return _this.setNextHandler(function (x) {\n                    return Promise.resolve(handler(x));\n                });\n            };\n        }\n        return Queue;\n    })();\n    Handler.Queue = Queue;\n})(Handler || (Handler = {}));\n//# sourceMappingURL=queue.js.map","var crypto;\n(function (crypto) {\n    function randomUint32() {\n        var randomArray = new Uint32Array(1);\n        crypto.getRandomValues(randomArray);\n        return randomArray[0];\n    }\n    crypto.randomUint32 = randomUint32;\n})(crypto || (crypto = {}));\n//# sourceMappingURL=random.js.map","var Logging;\n(function (Logging) {\n    var logBuffer = [];\n    var enabled = true;\n    var consoleFilter = { '*': 'D' };\n    var LEVEL_CHARS = 'DIWE';\n    function dateToString_(d) {\n        return d.getMonth() + '/' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() + '.' + d.getMilliseconds();\n    }\n    function isLevelAllowed_(request, permitted) {\n        return LEVEL_CHARS.indexOf(request) >= LEVEL_CHARS.indexOf(permitted);\n    }\n    function formatStringMessageWithArgs_(msg, args) {\n        var formatted_msg = msg;\n        if (args && args.length) {\n            for (var i = 0; i < args.length; i++) {\n                formatted_msg = formatted_msg.replace('%' + (i + 1), args[i]);\n            }\n        }\n        return formatted_msg;\n    }\n    function formatMessage(l) {\n        return '*[' + l.tag + ']' + '(' + dateToString_(l.timestamp) + ') ' + l.level + ': ' + l.message;\n    }\n    Logging.formatMessage = formatMessage;\n    function makeMessage(level, tag, msg, args) {\n        return { timestamp: new Date(), level: level, tag: tag, message: formatStringMessageWithArgs_(msg, args) };\n    }\n    Logging.makeMessage = makeMessage;\n    function doRealLog(level, tag, msg, args) {\n        if (!enabled) {\n            return;\n        }\n        var Message = makeMessage(level, tag, msg, args);\n        if ('*' in consoleFilter && isLevelAllowed_(level, consoleFilter['*']) || tag in consoleFilter && isLevelAllowed_(level, consoleFilter[tag])) {\n            if (level === 'D' || level === 'I') {\n                console.log(formatMessage(Message));\n            }\n            else if (level === 'W') {\n                console.warn(formatMessage(Message));\n            }\n            else {\n                console.error(formatMessage(Message));\n            }\n        }\n        logBuffer.push(Message);\n    }\n    Logging.doRealLog = doRealLog;\n    function getEncrypedLogBuffer(tags) {\n        return new ArrayBuffer(0);\n    }\n    Logging.getEncrypedLogBuffer = getEncrypedLogBuffer;\n    function getLogs(tags) {\n        if (!tags || tags.length === 0) {\n            return logBuffer.map(formatMessage);\n        }\n        else {\n            return logBuffer.filter(function (m) {\n                return tags.indexOf(m.tag) >= 0;\n            }).map(formatMessage);\n        }\n    }\n    Logging.getLogs = getLogs;\n    function clearLogs() {\n        logBuffer = [];\n    }\n    Logging.clearLogs = clearLogs;\n    function enable() {\n        enabled = true;\n    }\n    Logging.enable = enable;\n    function disable() {\n        enabled = false;\n    }\n    Logging.disable = disable;\n    function setConsoleFilter(args) {\n        consoleFilter = {};\n        for (var i = 0; i < args.length; i++) {\n            var parts = args[i].split(':');\n            consoleFilter[parts[0]] = parts[1];\n        }\n    }\n    Logging.setConsoleFilter = setConsoleFilter;\n    var Log = (function () {\n        function Log(tag_) {\n            var _this = this;\n            this.tag_ = tag_;\n            this.debug = function (msg, args) {\n                doRealLog('D', _this.tag_, msg, args);\n            };\n            this.info = function (msg, args) {\n                doRealLog('I', _this.tag_, msg, args);\n            };\n            this.warn = function (msg, args) {\n                doRealLog('W', _this.tag_, msg, args);\n            };\n            this.error = function (msg, args) {\n                doRealLog('E', _this.tag_, msg, args);\n            };\n        }\n        return Log;\n    })();\n    Logging.Log = Log;\n})(Logging || (Logging = {}));\n//# sourceMappingURL=logging.js.map","var RTCPeerConnection = null;\nvar getUserMedia = null;\nvar attachMediaStream = null;\nvar reattachMediaStream = null;\nvar webrtcDetectedBrowser = null;\nvar webrtcDetectedVersion = null;\nvar createIceServer = null;\nvar getPeerConnectionEndpoints = null;\n\nvar candidateTypeMapping = {\n    'host': 'local',\n    'serverreflexive': 'stun',\n    'peerreflexive': 'prflx',\n    'relayed': 'relay'\n}\n\nif (navigator.mozGetUserMedia) {\n  console.log(\"This appears to be Firefox\");\n\n  webrtcDetectedBrowser = \"firefox\";\n\n  webrtcDetectedVersion =\n           parseInt(navigator.userAgent.match(/Firefox\\/([0-9]+)\\./)[1], 10);\n\n  // The RTCPeerConnection object.\n  RTCPeerConnection = mozRTCPeerConnection;\n\n  // The RTCSessionDescription object.\n  RTCSessionDescription = mozRTCSessionDescription;\n\n  // The RTCIceCandidate object.\n  RTCIceCandidate = mozRTCIceCandidate;\n\n  // Get UserMedia (only difference is the prefix).\n  // Code from Adam Barth.\n  getUserMedia = navigator.mozGetUserMedia.bind(navigator);\n\n  // Creates iceServer from the url for FF.\n  createIceServer = function(url, username, password) {\n    var iceServer = null;\n    var url_parts = url.split(':');\n    if (url_parts[0].indexOf('stun') === 0) {\n      // Create iceServer with stun url.\n      iceServer = { 'url': url };\n    } else if (url_parts[0].indexOf('turn') === 0) {\n      if (webrtcDetectedVersion < 27) {\n        // Create iceServer with turn url.\n        // Ignore the transport parameter from TURN url for FF version <=27.\n        var turn_url_parts = url.split(\"?\");\n        // Return null for createIceServer if transport=tcp.\n        if (turn_url_parts[1].indexOf('transport=udp') === 0) {\n          iceServer = { 'url': turn_url_parts[0],\n                        'credential': password,\n                        'username': username };\n        }\n      } else {\n        // FF 27 and above supports transport parameters in TURN url,\n        // So passing in the full url to create iceServer.\n        iceServer = { 'url': url,\n                      'credential': password,\n                      'username': username };\n      }\n    }\n    return iceServer;\n  };\n\n  // Attach a media stream to an element.\n  attachMediaStream = function(element, stream) {\n    console.log(\"Attaching media stream\");\n    element.mozSrcObject = stream;\n    element.play();\n  };\n\n  reattachMediaStream = function(to, from) {\n    console.log(\"Reattaching media stream\");\n    to.mozSrcObject = from.mozSrcObject;\n    to.play();\n  };\n\n  // Fake get{Video,Audio}Tracks\n  if (!MediaStream.prototype.getVideoTracks) {\n    MediaStream.prototype.getVideoTracks = function() {\n      return [];\n    };\n  }\n\n  if (!MediaStream.prototype.getAudioTracks) {\n    MediaStream.prototype.getAudioTracks = function() {\n      return [];\n    };\n  }\n  getPeerConnectionEndpoints = function(pc) {\n    return new Promise(function(F, R) {\n      function tryGetStats() {\n        pc.getStats(null,\n          function(report) {\n            var result = {};\n            for(key in report) {\n              res = report[key];\n              if (res.type === 'candidatepair' && res.selected) {\n                var localCandidate = report[res.localCandidateId];\n                result.local = {\n                  address: localCandidate.ipAddress,\n                  port: localCandidate.portNumber\n                };\n                result.localType =\n                    candidateTypeMapping[localCandidate.candidateType] || 'unknown';\n                var remoteCandidate = report[res.remoteCandidateId];\n                result.remote = {\n                  address: remoteCandidate.ipAddress,\n                  port: remoteCandidate.portNumber\n                };\n                result.remoteType =\n                    candidateTypeMapping[remoteCandidate.candidateType] || 'unknown';\n                F(result);\n                return;\n              }\n            }\n            window.setTimeout(tryGetStats, 200);\n          }, R);\n      }\n      tryGetStats();\n    });\n  }\n} else if (navigator.webkitGetUserMedia) {\n  console.log(\"This appears to be Chrome\");\n\n  webrtcDetectedBrowser = \"chrome\";\n  webrtcDetectedVersion =\n         parseInt(navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./)[2], 10);\n\n  // Creates iceServer from the url for Chrome.\n  createIceServer = function(url, username, password) {\n    var iceServer = null;\n    var url_parts = url.split(':');\n    if (url_parts[0].indexOf('stun') === 0) {\n      // Create iceServer with stun url.\n      iceServer = { 'url': url };\n    } else if (url_parts[0].indexOf('turn') === 0) {\n      // Chrome M28 & above uses below TURN format.\n      iceServer = { 'url': url,\n                    'credential': password,\n                    'username': username };\n    }\n    return iceServer;\n  };\n\n  // The RTCPeerConnection object.\n  RTCPeerConnection = webkitRTCPeerConnection;\n\n  // Get UserMedia (only difference is the prefix).\n  // Code from Adam Barth.\n  getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n\n  // Attach a media stream to an element.\n  attachMediaStream = function(element, stream) {\n    if (typeof element.srcObject !== 'undefined') {\n      element.srcObject = stream;\n    } else if (typeof element.mozSrcObject !== 'undefined') {\n      element.mozSrcObject = stream;\n    } else if (typeof element.src !== 'undefined') {\n      element.src = URL.createObjectURL(stream);\n    } else {\n      console.log('Error attaching stream to element.');\n    }\n  };\n\n  reattachMediaStream = function(to, from) {\n    to.src = from.src;\n  };\n\n  getPeerConnectionEndpoints = function(pc) {\n    return new Promise(function(F, R) {\n      function tryGetStats() {\n        pc.getStats(\n          // Success.\n          // TODO: when Chrome meets the spec, update to match.\n          function(report) {\n            var results = report.result();\n            for (var i = 0; i < results.length; i++) {\n              var result = results[i];\n              // Search for the endpoints in use.\n              // There's a bug in Chrome whereby RTCPeerConnection.getStats(),\n              // when that RTCPeerConnection is configured to use a TURN server,\n              // reports multiple channels, *some of which have the non-relay\n              // candidates and are reported as active*. Fortunately, the report\n              // quickly fixes itself and a workaround seems to be to wait until\n              // some bytes are sent over the channel -- fortunately, again,\n              // this happens automatically as part of keeping the channel alive.\n              //\n              // Tracking here:\n              //   https://code.google.com/p/webrtc/issues/detail?id=3665\n              //\n              // Note that the inactive/failed channel remains visible at\n              // chrome://webrtc-internals/.\n              if (result.stat('googActiveConnection') === 'true' &&\n                  parseInt(result.stat('bytesSent')) > 0) {\n                var localFields = result.stat('googLocalAddress').split(':');\n                var remoteFields = result.stat('googRemoteAddress').split(':');\n                F({\n                    local: {\n                      address: localFields[0],\n                      port: parseInt(localFields[1])\n                    },\n                    remote: {\n                      address: remoteFields[0],\n                      port: parseInt(remoteFields[1])\n                    },\n                    localType: result.stat('googLocalCandidateType'),\n                    remoteType: result.stat('googRemoteCandidateType')\n                  });\n                return;\n              }\n            }\n            // Get stats doesn't reliably work, so we have to pull it\n            // TODO: bug request?\n            window.setTimeout(tryGetStats, 200);\n          }, R);\n      }\n      tryGetStats();\n    });\n  }\n} else {\n  console.log(\"Browser does not appear to be WebRTC-capable\");\n}\n","var WebRtc;\n(function (WebRtc) {\n    var CHUNK_SIZE = 1024 * 15;\n    var PC_QUEUE_LIMIT = 1024 * 250;\n    var MAX_MESSAGE_SIZE = Math.pow(2, 53);\n    var log = new Logging.Log('DataChannel');\n    var DataChannel = (function () {\n        function DataChannel(rtcDataChannel_) {\n            var _this = this;\n            this.rtcDataChannel_ = rtcDataChannel_;\n            this.getLabel = function () {\n                return _this.label_;\n            };\n            this.getState = function () {\n                return _this.rtcDataChannel_.readyState;\n            };\n            this.onDataFromPeer_ = function (messageEvent) {\n                if (typeof messageEvent.data === 'string') {\n                    _this.dataFromPeerQueue.handle({ str: messageEvent.data });\n                }\n                else if (messageEvent.data instanceof ArrayBuffer) {\n                    _this.dataFromPeerQueue.handle({ buffer: messageEvent.data });\n                }\n                else {\n                    log.error('Unexpected data from peer that has type: ' + typeof messageEvent.data + '; event: ' + JSON.stringify(messageEvent));\n                }\n            };\n            this.send = function (data) {\n                if (!(typeof data.str === 'string' || (typeof data.buffer === 'object') && (data.buffer instanceof ArrayBuffer))) {\n                    return Promise.reject(new Error('data to send must have at least `str:string` or ' + '`buffer:ArrayBuffer` defined (typeof data.str === ' + typeof data.str + '; typeof data.buffer === ' + typeof data.buffer + '; data.buffer instanceof ArrayBuffer === ' + (data.buffer instanceof ArrayBuffer) + ')'));\n                }\n                var byteLength;\n                if (typeof data.str === 'string') {\n                    byteLength = data.str.length * 2;\n                }\n                else if (data.buffer) {\n                    byteLength = data.buffer.byteLength;\n                }\n                if (byteLength > MAX_MESSAGE_SIZE) {\n                    return Promise.reject(new Error('Data was too big to send, sorry. ' + 'Need to wait for real Blob support.'));\n                }\n                if (typeof data.str === 'string') {\n                    return _this.chunkStringOntoQueue_({ str: data.str });\n                }\n                else if (data.buffer) {\n                    return _this.chunkBufferOntoQueue_({ buffer: data.buffer });\n                }\n            };\n            this.chunkStringOntoQueue_ = function (data) {\n                return _this.toPeerDataQueue_.handle(data);\n            };\n            this.chunkBufferOntoQueue_ = function (data) {\n                var chunks = ArrayBuffers.chunk(data.buffer, CHUNK_SIZE);\n                var promises = [];\n                chunks.forEach(function (chunk) {\n                    promises.push(_this.toPeerDataQueue_.handle({ buffer: chunk }));\n                });\n                return Promise.all(promises).then(function () {\n                    return;\n                });\n            };\n            this.handleSendDataToPeer_ = function (data) {\n                try {\n                    if (typeof data.str === 'string') {\n                        _this.rtcDataChannel_.send(data.str);\n                    }\n                    else if (data.buffer) {\n                        _this.rtcDataChannel_.send(data.buffer);\n                    }\n                    else {\n                        return Promise.reject(new Error('Bad data: ' + JSON.stringify(data)));\n                    }\n                }\n                catch (e) {\n                    log.debug('Error in send' + e.toString());\n                    return Promise.reject(new Error('Error in send: ' + JSON.stringify(e)));\n                }\n                _this.conjestionControlSendHandler();\n                return Promise.resolve();\n            };\n            this.conjestionControlSendHandler = function () {\n                if (_this.rtcDataChannel_.bufferedAmount + CHUNK_SIZE > PC_QUEUE_LIMIT) {\n                    if (_this.toPeerDataQueue_.isHandling()) {\n                        _this.toPeerDataQueue_.stopHandling();\n                    }\n                    setTimeout(_this.conjestionControlSendHandler, 20);\n                }\n                else {\n                    if (!_this.toPeerDataQueue_.isHandling()) {\n                        _this.toPeerDataQueue_.setHandler(_this.handleSendDataToPeer_);\n                    }\n                }\n            };\n            this.close = function () {\n                _this.rtcDataChannel_.close();\n            };\n            this.toString = function () {\n                var s = _this.getLabel() + ': opennedSuccessfully_=' + _this.opennedSuccessfully_ + '; state=' + _this.getState();\n                return s;\n            };\n            this.label_ = this.rtcDataChannel_.label;\n            this.dataFromPeerQueue = new Handler.Queue();\n            this.toPeerDataQueue_ = new Handler.Queue();\n            this.onceOpened = new Promise(function (F, R) {\n                _this.rejectOpened_ = R;\n                if (rtcDataChannel_.readyState === 'open') {\n                    F();\n                }\n                if (rtcDataChannel_.readyState === 'connecting') {\n                    rtcDataChannel_.onopen = function (e) {\n                        F();\n                    };\n                }\n            });\n            this.onceClosed = new Promise(function (F, R) {\n                _this.rtcDataChannel_.onclose = function (e) {\n                    F();\n                };\n            });\n            this.rtcDataChannel_.onmessage = this.onDataFromPeer_;\n            this.rtcDataChannel_.onerror = function (e) {\n                log.error('rtcDataChannel_.onerror: ' + _this.label_ + ': ' + e.toString);\n            };\n            this.onceOpened.then(function () {\n                _this.opennedSuccessfully_ = true;\n                _this.toPeerDataQueue_.setHandler(_this.handleSendDataToPeer_);\n            });\n            this.onceClosed.then(function () {\n                if (!_this.opennedSuccessfully_) {\n                    _this.rejectOpened_(new Error('Failed to open; closed while trying to open.'));\n                }\n                _this.opennedSuccessfully_ = false;\n            });\n        }\n        return DataChannel;\n    })();\n    WebRtc.DataChannel = DataChannel;\n})(WebRtc || (WebRtc = {}));\n//# sourceMappingURL=datachannel.js.map","var WebRtc;\n(function (WebRtc) {\n    (function (SignalType) {\n        SignalType[SignalType[\"OFFER\"] = 0] = \"OFFER\";\n        SignalType[SignalType[\"ANSWER\"] = 1] = \"ANSWER\";\n        SignalType[SignalType[\"CANDIDATE\"] = 2] = \"CANDIDATE\";\n        SignalType[SignalType[\"NO_MORE_CANDIDATES\"] = 3] = \"NO_MORE_CANDIDATES\";\n    })(WebRtc.SignalType || (WebRtc.SignalType = {}));\n    var SignalType = WebRtc.SignalType;\n    (function (State) {\n        State[State[\"WAITING\"] = 0] = \"WAITING\";\n        State[State[\"CONNECTING\"] = 1] = \"CONNECTING\";\n        State[State[\"CONNECTED\"] = 2] = \"CONNECTED\";\n        State[State[\"DISCONNECTED\"] = 3] = \"DISCONNECTED\";\n    })(WebRtc.State || (WebRtc.State = {}));\n    var State = WebRtc.State;\n    ;\n    WebRtc.stringHash = function (s) {\n        var hash = 5381;\n        for (var i = 0; i < s.length; i++) {\n            hash = ((hash << 5) + hash) + s.charCodeAt(i);\n        }\n        return hash;\n    };\n    var log = new Logging.Log('PeerConnection');\n    WebRtc.peerConnections = {};\n    var PeerConnection = (function () {\n        function PeerConnection(config_) {\n            var _this = this;\n            this.config_ = config_;\n            this.closeWorkaroundIndex_ = 0;\n            this.createOffer_ = function () {\n                return new Promise(function (F, R) {\n                    _this.pc_.createOffer(F, R);\n                });\n            };\n            this.createAnswer_ = function () {\n                return new Promise(function (F, R) {\n                    _this.pc_.createAnswer(F, R);\n                });\n            };\n            this.setLocalDescription_ = function (d) {\n                return new Promise(function (F, R) {\n                    _this.pc_.setLocalDescription(d, function () {\n                        F(d);\n                        log.debug(_this.peerName + ': ' + 'setLocalDescription');\n                    }, R);\n                });\n            };\n            this.setRemoteDescription_ = function (d) {\n                return new Promise(function (F, R) {\n                    _this.pc_.setRemoteDescription(d, function () {\n                        F();\n                        log.debug(_this.peerName + ': ' + 'setRemoteDescription');\n                    }, R);\n                });\n            };\n            this.addIceCandidate_ = function (c) {\n                return new Promise(function (F, R) {\n                    try {\n                        _this.pc_.addIceCandidate(c, F, R);\n                    }\n                    catch (e) {\n                        R(e);\n                    }\n                });\n            };\n            this.close = function () {\n                log.info(_this.peerName + ': ' + 'close');\n                if (_this.pcState === 3 /* DISCONNECTED */) {\n                    return;\n                }\n                if (_this.pcState === 1 /* CONNECTING */) {\n                    _this.rejectConnected_(new Error('close was called while connecting.'));\n                }\n                _this.pcState = 3 /* DISCONNECTED */;\n                _this.fulfillDisconnected_();\n                if (_this.pc_.signalingState !== 'closed') {\n                    _this.pc_.close();\n                }\n            };\n            this.closeWithError_ = function (s) {\n                log.error(_this.peerName + ': ' + s);\n                if (_this.pcState === 1 /* CONNECTING */) {\n                    _this.rejectConnected_(new Error(s));\n                }\n                _this.pcState = 3 /* DISCONNECTED */;\n                _this.fulfillDisconnected_();\n                if (_this.pc_.signalingState !== 'closed') {\n                    _this.pc_.close();\n                }\n            };\n            this.onSignallingStateChange_ = function () {\n                if (_this.pc_.signalingState === 'closed') {\n                    _this.close();\n                    return;\n                }\n                if (_this.pc_.signalingState === 'stable' && _this.pcState === 2 /* CONNECTED */) {\n                    return;\n                }\n                if (_this.pcState !== 1 /* CONNECTING */ && _this.pcState !== 2 /* CONNECTED */) {\n                    _this.closeWithError_(_this.peerName + ': ' + 'Unexpected onSignallingStateChange in state: ' + State[_this.pcState] + ' with pc_.signallingState: ' + _this.pc_.signalingState);\n                    return;\n                }\n                if (_this.pc_.signalingState === 'stable') {\n                    _this.completeConnection_();\n                }\n            };\n            this.completeConnection_ = function () {\n                getPeerConnectionEndpoints(_this.pc_).then(function (addresses) {\n                    _this.pcState = 2 /* CONNECTED */;\n                    _this.fulfillConnected_(addresses);\n                }).catch(function (e) {\n                    _this.closeWithError_(_this.peerName + ': ' + 'onSignallingStateChange getStats error: ' + e.toString());\n                });\n            };\n            this.negotiateConnection = function () {\n                var d = _this.openDataChannel('');\n                return d.onceOpened.then(function () {\n                    return _this.onceConnected;\n                });\n            };\n            this.negotiateConnection_ = function () {\n                log.debug(_this.peerName + ': ' + 'negotiateConnection_');\n                if (_this.pcState === 3 /* DISCONNECTED */) {\n                    return Promise.reject(new Error(_this.peerName + ': ' + 'negotiateConnection_ called on ' + 'DISCONNECTED state.'));\n                }\n                if (_this.pcState === 1 /* CONNECTING */) {\n                    return Promise.reject(new Error('Unexpected call to ' + 'negotiateConnection_: ' + _this.toString()));\n                }\n                if (_this.pc_.localDescription && _this.pc_.remoteDescription) {\n                    var localDescription = _this.pc_.localDescription;\n                    var remoteDescription = _this.pc_.localDescription;\n                    log.debug(_this.peerName + ': ' + 'negotiateConnection_: dodging.');\n                    return _this.onceConnected;\n                }\n                if (_this.pcState === 0 /* WAITING */ || _this.pcState == 2 /* CONNECTED */) {\n                    _this.pcState = 1 /* CONNECTING */;\n                    _this.fulfillConnecting_();\n                    _this.createOffer_().then(_this.setLocalDescription_).then(function (d) {\n                        _this.signalForPeerQueue.handle({ type: 0 /* OFFER */, description: { type: d.type, sdp: d.sdp } });\n                    }).catch(function (e) {\n                        _this.closeWithError_('Failed to set local description: ' + e.toString());\n                    });\n                    return _this.onceConnected;\n                }\n            };\n            this.handleSignalMessage = function (signal) {\n                log.debug(_this.peerName + ': ' + 'handleSignalMessage: \\n' + JSON.stringify(signal));\n                switch (signal.type) {\n                    case 0 /* OFFER */:\n                        if (_this.pc_.signalingState === 'have-local-offer' && WebRtc.stringHash(JSON.stringify(signal.description.sdp)) < WebRtc.stringHash(JSON.stringify(_this.pc_.localDescription.sdp))) {\n                            _this.closeWithError_('Simultainious offers not yet implemented.');\n                            return;\n                        }\n                        _this.pcState = 1 /* CONNECTING */;\n                        _this.fulfillConnecting_();\n                        var remoteDescription = new RTCSessionDescription(signal.description);\n                        _this.setRemoteDescription_(remoteDescription).then(_this.createAnswer_).then(_this.setLocalDescription_).then(function (d) {\n                            _this.signalForPeerQueue.handle({ type: 1 /* ANSWER */, description: { type: d.type, sdp: d.sdp } });\n                        }).then(function () {\n                            _this.fromPeerCandidateQueue.setHandler(_this.addIceCandidate_);\n                        }).catch(function (e) {\n                            _this.closeWithError_('Failed to connect to offer:' + e.toString());\n                        });\n                        break;\n                    case 1 /* ANSWER */:\n                        var remoteDescription = new RTCSessionDescription(signal.description);\n                        _this.setRemoteDescription_(remoteDescription).then(function () {\n                            _this.fromPeerCandidateQueue.setHandler(_this.addIceCandidate_);\n                        }).catch(function (e) {\n                            _this.closeWithError_('Failed to set remote description: ' + ': ' + JSON.stringify(remoteDescription) + ' (' + typeof (remoteDescription) + '); Error: ' + e.toString());\n                        });\n                        break;\n                    case 2 /* CANDIDATE */:\n                        try {\n                            _this.fromPeerCandidateQueue.handle(new RTCIceCandidate(signal.candidate));\n                        }\n                        catch (e) {\n                            log.error(_this.peerName + ': ' + 'addIceCandidate: ' + JSON.stringify(signal.candidate) + ' (' + typeof (signal.candidate) + '); Error: ' + e.toString());\n                        }\n                        break;\n                    case 3 /* NO_MORE_CANDIDATES */:\n                        log.debug(_this.peerName + ': handleSignalMessage: noMoreCandidates');\n                        break;\n                    default:\n                        log.error(_this.peerName + ': ' + 'handleSignalMessage got unexpected message: ' + JSON.stringify(signal) + ' (' + typeof (signal) + ')');\n                        break;\n                }\n            };\n            this.openDataChannel = function (channelLabel, options) {\n                log.debug(_this.peerName + ': ' + 'openDataChannel: ' + channelLabel + '; options=' + JSON.stringify(options));\n                if (options !== undefined) {\n                    if (!('id' in options)) {\n                        options.id = _this.closeWorkaroundIndex_++;\n                    }\n                }\n                else {\n                    options = { id: _this.closeWorkaroundIndex_++ };\n                }\n                var rtcDataChannel = _this.pc_.createDataChannel(channelLabel, options);\n                if (typeof mozRTCPeerConnection !== 'undefined' && _this.pcState === 0 /* WAITING */) {\n                    _this.negotiateConnection_();\n                }\n                var dataChannel = _this.addRtcDataChannel_(rtcDataChannel);\n                return dataChannel;\n            };\n            this.onPeerStartedDataChannel_ = function (rtcDataChannelEvent) {\n                log.debug(_this.peerName + ': ' + 'onPeerStartedDataChannel: ' + rtcDataChannelEvent.channel.label);\n                _this.peerOpenedChannelQueue.handle(_this.addRtcDataChannel_(rtcDataChannelEvent.channel));\n            };\n            this.addRtcDataChannel_ = function (rtcDataChannel) {\n                var dataChannel = new WebRtc.DataChannel(rtcDataChannel);\n                _this.dataChannels[dataChannel.getLabel()] = dataChannel;\n                dataChannel.onceClosed.then(function () {\n                    delete _this.dataChannels[dataChannel.getLabel()];\n                });\n                return dataChannel;\n            };\n            this.toString = function () {\n                var s = _this.peerName + ' (' + _this.pc_.signalingState + '): { \\n';\n                var channelLabel;\n                for (channelLabel in _this.dataChannels) {\n                    s += '  ' + channelLabel + ': ' + _this.dataChannels[channelLabel].toString() + '\\n';\n                }\n                s += '}';\n                return s;\n            };\n            if (config_.webrtcPcConfig === undefined || config_.webrtcMediaConstraints === undefined) {\n                throw new Error('must specify peerconnection config and constraints');\n            }\n            this.peerName = this.config_.peerName || 'unnamed-pc-' + crypto.randomUint32();\n            this.onceConnecting = new Promise(function (F, R) {\n                _this.fulfillConnecting_ = F;\n            });\n            this.onceConnected = new Promise(function (F, R) {\n                _this.fulfillConnected_ = function (addresses) {\n                    _this.onceConnecting.then(F.bind(null, addresses));\n                };\n                _this.rejectConnected_ = R;\n            });\n            this.onceDisconnected = new Promise(function (F, R) {\n                _this.fulfillDisconnected_ = F;\n            });\n            this.onceConnected.then(function () {\n                WebRtc.peerConnections[_this.peerName] = _this;\n            });\n            this.onceDisconnected.then(function () {\n                delete WebRtc.peerConnections[_this.peerName];\n            });\n            this.peerOpenedChannelQueue = new Handler.Queue();\n            this.signalForPeerQueue = new Handler.Queue();\n            this.fromPeerCandidateQueue = new Handler.Queue();\n            this.pcState = 0 /* WAITING */;\n            this.dataChannels = {};\n            this.pc_ = new RTCPeerConnection(this.config_.webrtcPcConfig, this.config_.webrtcMediaConstraints);\n            this.pc_.onicecandidate = (function (event) {\n                if (event.candidate) {\n                    _this.signalForPeerQueue.handle({\n                        type: 2 /* CANDIDATE */,\n                        candidate: { candidate: event.candidate.candidate, sdpMid: event.candidate.sdpMid, sdpMLineIndex: event.candidate.sdpMLineIndex }\n                    });\n                }\n                else {\n                    _this.signalForPeerQueue.handle({ type: 3 /* NO_MORE_CANDIDATES */ });\n                }\n            });\n            this.pc_.onnegotiationneeded = function () {\n                _this.negotiateConnection_().catch(function (e) {\n                    log.error(_this.peerName + ': negotiateConnection: ' + e.toString() + '; this.toString()= ' + _this.toString());\n                });\n            };\n            this.pc_.ondatachannel = this.onPeerStartedDataChannel_;\n            this.pc_.onsignalingstatechange = this.onSignallingStateChange_;\n            if (this.config_.initiateConnection) {\n                this.negotiateConnection().catch(function (e) {\n                    log.error(_this.peerName + ': negotiateConnection: ' + e.toString() + '; this.toString()= ' + _this.toString());\n                });\n            }\n        }\n        return PeerConnection;\n    })();\n    WebRtc.PeerConnection = PeerConnection;\n})(WebRtc || (WebRtc = {}));\n//# sourceMappingURL=peerconnection.js.map"]}