-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpeerjs.min.js.map
1 lines (1 loc) · 411 KB
/
peerjs.min.js.map
1
{"version":3,"sources":["../node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","../node_modules/peerjs-js-binarypack/lib/binarypack.js","../node_modules/webrtc-adapter/src/js/utils.js","../node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","../node_modules/sdp/sdp.js","../node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","../node_modules/webrtc-adapter/src/js/edge/getusermedia.js","../node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/edge/edge_shim.js","../node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/webrtc-adapter/src/js/adapter_core.js","adapter.ts","supports.ts","util.ts","../node_modules/eventemitter3/index.js","logger.ts","enums.ts","socket.ts","negotiator.ts","baseconnection.ts","mediaconnection.ts","encodingQueue.ts","dataconnection.ts","api.ts","peer.ts","exports.ts"],"names":["logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","length","parseInt","wrapPeerConnectionEvent","window","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","_eventMap","nativeRemoveEventListener","removeEventListener","unwrappedCb","Object","defineProperty","get","set","enumerable","configurable","disableLog","bool","Error","disableWarnings","log","console","deprecated","oldMethod","newMethod","warn","detectBrowser","navigator","result","browser","version","mozGetUserMedia","userAgent","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","RTCIceGatherer","mediaDevices","supportsUnifiedPlan","RTCRtpTransceiver","isObject","val","toString","call","compactObject","data","keys","reduce","accumulator","key","isObj","value","isEmptyObject","undefined","assign","walkStats","stats","base","resultSet","has","id","forEach","name","endsWith","filterStats","track","outbound","streamStatsType","filteredResult","Map","trackStats","type","trackIdentifier","push","trackStat","trackId","logging","utils","shimGetUserMedia","browserDetails","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","matches","getSupportedConstraints","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","transceiver","receiver","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","event","Event","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","resolve","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","alreadyExists","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","signalingState","t","oldStream","method","nativeMethod","methodObj","args","isLegacyCall","description","desc","replaceInternalStreamId","origSetLocalDescription","setLocalDescription","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","origLocalDescription","getOwnPropertyDescriptor","streamid","shimPeerConnection","RTCIceCandidate","nativeAddIceCandidate","addIceCandidate","candidate","fixNegotiationNeeded","target","filterIceServers","iceServers","edgeVersion","hasTurn","server","urls","url","isString","validTurn","startsWith","SDPUtils","require","fixStatsType","inboundrtp","outboundrtp","candidatepair","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","i","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","Math","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","code","NotSupportedError","InvalidAccessError","TypeError","OperationError","module","exports","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","config","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","getConfiguration","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","enabled","_createIceGatherer","sdpMLineIndex","shift","writable","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","isRejected","rejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","default","getCapabilities","codec","isNewTrack","nativeTrack","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjectName","nativeGetstats","nativeStats","mapStats","methods","catch","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","shimReplaceTrack","replaceTrack","setTrack","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","setParameters","shimCreateOffer","origCreateOffer","finally","shimCreateAnswer","origCreateAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","index","tracks","shimRemoteStreamsAPI","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","successCallback","failureCallback","options","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","hasOwnProperty","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","audioTransceiver","getTransceivers","setDirection","videoTransceiver","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","shimMaxMessageSize","_sctp","sctpInDescription","sdpSemantics","mLine","parseMLine","isFirefox","maxMessageSize","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","remoteMMS","getMaxMessageSize","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","size","byteLength","readyState","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeAllowExtmapMixed","nativeSRD","line","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":"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","file":"peerjs.min.js","sourceRoot":"../lib","sourcesContent":["var binaryFeatures = {};\r\nbinaryFeatures.useBlobBuilder = (function () {\r\n try {\r\n new Blob([]);\r\n return false;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nbinaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {\r\n try {\r\n return (new Blob([new Uint8Array([])])).size === 0;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nmodule.exports.binaryFeatures = binaryFeatures;\r\nvar BlobBuilder = module.exports.BlobBuilder;\r\nif (typeof window !== 'undefined') {\r\n BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||\r\n window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;\r\n}\r\n\r\nfunction BufferBuilder () {\r\n this._pieces = [];\r\n this._parts = [];\r\n}\r\n\r\nBufferBuilder.prototype.append = function (data) {\r\n if (typeof data === 'number') {\r\n this._pieces.push(data);\r\n } else {\r\n this.flush();\r\n this._parts.push(data);\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.flush = function () {\r\n if (this._pieces.length > 0) {\r\n var buf = new Uint8Array(this._pieces);\r\n if (!binaryFeatures.useArrayBufferView) {\r\n buf = buf.buffer;\r\n }\r\n this._parts.push(buf);\r\n this._pieces = [];\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.getBuffer = function () {\r\n this.flush();\r\n if (binaryFeatures.useBlobBuilder) {\r\n var builder = new BlobBuilder();\r\n for (var i = 0, ii = this._parts.length; i < ii; i++) {\r\n builder.append(this._parts[i]);\r\n }\r\n return builder.getBlob();\r\n } else {\r\n return new Blob(this._parts);\r\n }\r\n};\r\n\r\nmodule.exports.BufferBuilder = BufferBuilder;\r\n","var BufferBuilder = require('./bufferbuilder').BufferBuilder;\r\nvar binaryFeatures = require('./bufferbuilder').binaryFeatures;\r\n\r\nvar BinaryPack = {\r\n unpack: function (data) {\r\n var unpacker = new Unpacker(data);\r\n return unpacker.unpack();\r\n },\r\n pack: function (data) {\r\n var packer = new Packer();\r\n packer.pack(data);\r\n var buffer = packer.getBuffer();\r\n return buffer;\r\n }\r\n};\r\n\r\nmodule.exports = BinaryPack;\r\n\r\nfunction Unpacker (data) {\r\n // Data is ArrayBuffer\r\n this.index = 0;\r\n this.dataBuffer = data;\r\n this.dataView = new Uint8Array(this.dataBuffer);\r\n this.length = this.dataBuffer.byteLength;\r\n}\r\n\r\nUnpacker.prototype.unpack = function () {\r\n var type = this.unpack_uint8();\r\n if (type < 0x80) {\r\n return type;\r\n } else if ((type ^ 0xe0) < 0x20) {\r\n return (type ^ 0xe0) - 0x20;\r\n }\r\n\r\n var size;\r\n if ((size = type ^ 0xa0) <= 0x0f) {\r\n return this.unpack_raw(size);\r\n } else if ((size = type ^ 0xb0) <= 0x0f) {\r\n return this.unpack_string(size);\r\n } else if ((size = type ^ 0x90) <= 0x0f) {\r\n return this.unpack_array(size);\r\n } else if ((size = type ^ 0x80) <= 0x0f) {\r\n return this.unpack_map(size);\r\n }\r\n\r\n switch (type) {\r\n case 0xc0:\r\n return null;\r\n case 0xc1:\r\n return undefined;\r\n case 0xc2:\r\n return false;\r\n case 0xc3:\r\n return true;\r\n case 0xca:\r\n return this.unpack_float();\r\n case 0xcb:\r\n return this.unpack_double();\r\n case 0xcc:\r\n return this.unpack_uint8();\r\n case 0xcd:\r\n return this.unpack_uint16();\r\n case 0xce:\r\n return this.unpack_uint32();\r\n case 0xcf:\r\n return this.unpack_uint64();\r\n case 0xd0:\r\n return this.unpack_int8();\r\n case 0xd1:\r\n return this.unpack_int16();\r\n case 0xd2:\r\n return this.unpack_int32();\r\n case 0xd3:\r\n return this.unpack_int64();\r\n case 0xd4:\r\n return undefined;\r\n case 0xd5:\r\n return undefined;\r\n case 0xd6:\r\n return undefined;\r\n case 0xd7:\r\n return undefined;\r\n case 0xd8:\r\n size = this.unpack_uint16();\r\n return this.unpack_string(size);\r\n case 0xd9:\r\n size = this.unpack_uint32();\r\n return this.unpack_string(size);\r\n case 0xda:\r\n size = this.unpack_uint16();\r\n return this.unpack_raw(size);\r\n case 0xdb:\r\n size = this.unpack_uint32();\r\n return this.unpack_raw(size);\r\n case 0xdc:\r\n size = this.unpack_uint16();\r\n return this.unpack_array(size);\r\n case 0xdd:\r\n size = this.unpack_uint32();\r\n return this.unpack_array(size);\r\n case 0xde:\r\n size = this.unpack_uint16();\r\n return this.unpack_map(size);\r\n case 0xdf:\r\n size = this.unpack_uint32();\r\n return this.unpack_map(size);\r\n }\r\n};\r\n\r\nUnpacker.prototype.unpack_uint8 = function () {\r\n var byte = this.dataView[this.index] & 0xff;\r\n this.index++;\r\n return byte;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint16 = function () {\r\n var bytes = this.read(2);\r\n var uint16 =\r\n ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);\r\n this.index += 2;\r\n return uint16;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint32 = function () {\r\n var bytes = this.read(4);\r\n var uint32 =\r\n ((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3];\r\n this.index += 4;\r\n return uint32;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint64 = function () {\r\n var bytes = this.read(8);\r\n var uint64 =\r\n ((((((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3]) * 256 +\r\n bytes[4]) * 256 +\r\n bytes[5]) * 256 +\r\n bytes[6]) * 256 +\r\n bytes[7];\r\n this.index += 8;\r\n return uint64;\r\n};\r\n\r\nUnpacker.prototype.unpack_int8 = function () {\r\n var uint8 = this.unpack_uint8();\r\n return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);\r\n};\r\n\r\nUnpacker.prototype.unpack_int16 = function () {\r\n var uint16 = this.unpack_uint16();\r\n return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);\r\n};\r\n\r\nUnpacker.prototype.unpack_int32 = function () {\r\n var uint32 = this.unpack_uint32();\r\n return (uint32 < Math.pow(2, 31)) ? uint32\r\n : uint32 - Math.pow(2, 32);\r\n};\r\n\r\nUnpacker.prototype.unpack_int64 = function () {\r\n var uint64 = this.unpack_uint64();\r\n return (uint64 < Math.pow(2, 63)) ? uint64\r\n : uint64 - Math.pow(2, 64);\r\n};\r\n\r\nUnpacker.prototype.unpack_raw = function (size) {\r\n if (this.length < this.index + size) {\r\n throw new Error('BinaryPackFailure: index is out of range' +\r\n ' ' + this.index + ' ' + size + ' ' + this.length);\r\n }\r\n var buf = this.dataBuffer.slice(this.index, this.index + size);\r\n this.index += size;\r\n\r\n // buf = util.bufferToString(buf);\r\n\r\n return buf;\r\n};\r\n\r\nUnpacker.prototype.unpack_string = function (size) {\r\n var bytes = this.read(size);\r\n var i = 0;\r\n var str = '';\r\n var c;\r\n var code;\r\n\r\n while (i < size) {\r\n c = bytes[i];\r\n if (c < 128) {\r\n str += String.fromCharCode(c);\r\n i++;\r\n } else if ((c ^ 0xc0) < 32) {\r\n code = ((c ^ 0xc0) << 6) | (bytes[i + 1] & 63);\r\n str += String.fromCharCode(code);\r\n i += 2;\r\n } else {\r\n code = ((c & 15) << 12) | ((bytes[i + 1] & 63) << 6) |\r\n (bytes[i + 2] & 63);\r\n str += String.fromCharCode(code);\r\n i += 3;\r\n }\r\n }\r\n\r\n this.index += size;\r\n return str;\r\n};\r\n\r\nUnpacker.prototype.unpack_array = function (size) {\r\n var objects = new Array(size);\r\n for (var i = 0; i < size; i++) {\r\n objects[i] = this.unpack();\r\n }\r\n return objects;\r\n};\r\n\r\nUnpacker.prototype.unpack_map = function (size) {\r\n var map = {};\r\n for (var i = 0; i < size; i++) {\r\n var key = this.unpack();\r\n var value = this.unpack();\r\n map[key] = value;\r\n }\r\n return map;\r\n};\r\n\r\nUnpacker.prototype.unpack_float = function () {\r\n var uint32 = this.unpack_uint32();\r\n var sign = uint32 >> 31;\r\n var exp = ((uint32 >> 23) & 0xff) - 127;\r\n var fraction = (uint32 & 0x7fffff) | 0x800000;\r\n return (sign === 0 ? 1 : -1) *\r\n fraction * Math.pow(2, exp - 23);\r\n};\r\n\r\nUnpacker.prototype.unpack_double = function () {\r\n var h32 = this.unpack_uint32();\r\n var l32 = this.unpack_uint32();\r\n var sign = h32 >> 31;\r\n var exp = ((h32 >> 20) & 0x7ff) - 1023;\r\n var hfrac = (h32 & 0xfffff) | 0x100000;\r\n var frac = hfrac * Math.pow(2, exp - 20) +\r\n l32 * Math.pow(2, exp - 52);\r\n return (sign === 0 ? 1 : -1) * frac;\r\n};\r\n\r\nUnpacker.prototype.read = function (length) {\r\n var j = this.index;\r\n if (j + length <= this.length) {\r\n return this.dataView.subarray(j, j + length);\r\n } else {\r\n throw new Error('BinaryPackFailure: read index out of range');\r\n }\r\n};\r\n\r\nfunction Packer () {\r\n this.bufferBuilder = new BufferBuilder();\r\n}\r\n\r\nPacker.prototype.getBuffer = function () {\r\n return this.bufferBuilder.getBuffer();\r\n};\r\n\r\nPacker.prototype.pack = function (value) {\r\n var type = typeof (value);\r\n if (type === 'string') {\r\n this.pack_string(value);\r\n } else if (type === 'number') {\r\n if (Math.floor(value) === value) {\r\n this.pack_integer(value);\r\n } else {\r\n this.pack_double(value);\r\n }\r\n } else if (type === 'boolean') {\r\n if (value === true) {\r\n this.bufferBuilder.append(0xc3);\r\n } else if (value === false) {\r\n this.bufferBuilder.append(0xc2);\r\n }\r\n } else if (type === 'undefined') {\r\n this.bufferBuilder.append(0xc0);\r\n } else if (type === 'object') {\r\n if (value === null) {\r\n this.bufferBuilder.append(0xc0);\r\n } else {\r\n var constructor = value.constructor;\r\n if (constructor == Array) {\r\n this.pack_array(value);\r\n } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {\r\n this.pack_bin(value);\r\n } else if (constructor == ArrayBuffer) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value));\r\n } else {\r\n this.pack_bin(value);\r\n }\r\n } else if ('BYTES_PER_ELEMENT' in value) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value.buffer));\r\n } else {\r\n this.pack_bin(value.buffer);\r\n }\r\n } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {\r\n this.pack_object(value);\r\n } else if (constructor == Date) {\r\n this.pack_string(value.toString());\r\n } else if (typeof value.toBinaryPack === 'function') {\r\n this.bufferBuilder.append(value.toBinaryPack());\r\n } else {\r\n throw new Error('Type \"' + constructor.toString() + '\" not yet supported');\r\n }\r\n }\r\n } else {\r\n throw new Error('Type \"' + type + '\" not yet supported');\r\n }\r\n this.bufferBuilder.flush();\r\n};\r\n\r\nPacker.prototype.pack_bin = function (blob) {\r\n var length = blob.length || blob.byteLength || blob.size;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xa0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xda);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdb);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(blob);\r\n};\r\n\r\nPacker.prototype.pack_string = function (str) {\r\n var length = utf8Length(str);\r\n\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xb0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xd8);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xd9);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(str);\r\n};\r\n\r\nPacker.prototype.pack_array = function (ary) {\r\n var length = ary.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x90 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xdc);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdd);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var i = 0; i < length; i++) {\r\n this.pack(ary[i]);\r\n }\r\n};\r\n\r\nPacker.prototype.pack_integer = function (num) {\r\n if (num >= -0x20 && num <= 0x7f) {\r\n this.bufferBuilder.append(num & 0xff);\r\n } else if (num >= 0x00 && num <= 0xff) {\r\n this.bufferBuilder.append(0xcc);\r\n this.pack_uint8(num);\r\n } else if (num >= -0x80 && num <= 0x7f) {\r\n this.bufferBuilder.append(0xd0);\r\n this.pack_int8(num);\r\n } else if (num >= 0x0000 && num <= 0xffff) {\r\n this.bufferBuilder.append(0xcd);\r\n this.pack_uint16(num);\r\n } else if (num >= -0x8000 && num <= 0x7fff) {\r\n this.bufferBuilder.append(0xd1);\r\n this.pack_int16(num);\r\n } else if (num >= 0x00000000 && num <= 0xffffffff) {\r\n this.bufferBuilder.append(0xce);\r\n this.pack_uint32(num);\r\n } else if (num >= -0x80000000 && num <= 0x7fffffff) {\r\n this.bufferBuilder.append(0xd2);\r\n this.pack_int32(num);\r\n } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xd3);\r\n this.pack_int64(num);\r\n } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xcf);\r\n this.pack_uint64(num);\r\n } else {\r\n throw new Error('Invalid integer');\r\n }\r\n};\r\n\r\nPacker.prototype.pack_double = function (num) {\r\n var sign = 0;\r\n if (num < 0) {\r\n sign = 1;\r\n num = -num;\r\n }\r\n var exp = Math.floor(Math.log(num) / Math.LN2);\r\n var frac0 = num / Math.pow(2, exp) - 1;\r\n var frac1 = Math.floor(frac0 * Math.pow(2, 52));\r\n var b32 = Math.pow(2, 32);\r\n var h32 = (sign << 31) | ((exp + 1023) << 20) |\r\n (frac1 / b32) & 0x0fffff;\r\n var l32 = frac1 % b32;\r\n this.bufferBuilder.append(0xcb);\r\n this.pack_int32(h32);\r\n this.pack_int32(l32);\r\n};\r\n\r\nPacker.prototype.pack_object = function (obj) {\r\n var keys = Object.keys(obj);\r\n var length = keys.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x80 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xde);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdf);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n this.pack(prop);\r\n this.pack(obj[prop]);\r\n }\r\n }\r\n};\r\n\r\nPacker.prototype.pack_uint8 = function (num) {\r\n this.bufferBuilder.append(num);\r\n};\r\n\r\nPacker.prototype.pack_uint16 = function (num) {\r\n this.bufferBuilder.append(num >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_uint32 = function (num) {\r\n var n = num & 0xffffffff;\r\n this.bufferBuilder.append((n & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((n & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((n & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((n & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_uint64 = function (num) {\r\n var high = num / Math.pow(2, 32);\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int8 = function (num) {\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int16 = function (num) {\r\n this.bufferBuilder.append((num & 0xff00) >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int32 = function (num) {\r\n this.bufferBuilder.append((num >>> 24) & 0xff);\r\n this.bufferBuilder.append((num & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((num & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((num & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int64 = function (num) {\r\n var high = Math.floor(num / Math.pow(2, 32));\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nfunction _utf8Replace (m) {\r\n var code = m.charCodeAt(0);\r\n\r\n if (code <= 0x7ff) return '00';\r\n if (code <= 0xffff) return '000';\r\n if (code <= 0x1fffff) return '0000';\r\n if (code <= 0x3ffffff) return '00000';\r\n return '000000';\r\n}\r\n\r\nfunction utf8Length (str) {\r\n if (str.length > 600) {\r\n // Blob method faster for large strings\r\n return (new Blob([str])).size;\r\n } else {\r\n return str.replace(/[^\\u0000-\\u007F]/g, _utf8Replace).length;\r\n }\r\n}\r\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n cb(modifiedEvent);\n }\n };\n this._eventMap = this._eventMap || {};\n this._eventMap[cb] = wrappedCallback;\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[cb]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[cb];\n delete this._eventMap[cb];\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n const {navigator} = window;\n\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n !window.RTCIceGatherer)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const browserDetails = utils.detectBrowser(window);\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const browserDetails = utils.detectBrowser(window);\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window) {\n const browserDetails = utils.detectBrowser(window);\n\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n // support for addIceCandidate(null or undefined)\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions. Native support planned for Chrome M77.\n if (browserDetails.version < 78 &&\n arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\nexport function fixNegotiationNeeded(window) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (pc.signalingState !== 'stable') {\n return;\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n let hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(server => {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n const isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(url => {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n const validTurn = url.startsWith('turn') &&\n !url.startsWith('turn:[') &&\n url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.splitLines(mediaSection);\n // Search in session part, too.\n lines = lines.concat(SDPUtils.splitLines(sessionpart));\n var iceParameters = {\n usernameFragment: lines.filter(function(line) {\n return line.indexOf('a=ice-ufrag:') === 0;\n })[0].substr(12),\n password: lines.filter(function(line) {\n return line.indexOf('a=ice-pwd:') === 0;\n })[0].substr(10)\n };\n return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n const shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n };\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window) {\n const browserDetails = utils.detectBrowser(window);\n\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n const origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set(value) {\n origMSTEnabled.set.call(this, value);\n const ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = filterIceServers(config.iceServers,\n browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window) {\n const browserDetails = utils.detectBrowser(window);\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window) {\n const browserDetails = utils.detectBrowser(window);\n\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n // support for addIceCandidate(null or undefined)\n // as well as ignoring {sdpMid, candidate: \"\"}\n if (browserDetails.version < 68) {\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n if (arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n const initParameters = arguments[1];\n const shouldPerformCheck = initParameters &&\n 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params)) {\n params.encodings = initParameters.sendEncodings;\n this.setParametersPromises.push(\n sender.setParameters(params)\n .catch(() => {})\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track) {\n const stream = arguments[1];\n if (stream) {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in window.RTCPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const browserDetails = utils.detectBrowser(window);\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeAllowExtmapMixed(window) {\n /* remove a=extmap-allow-mixed for Chrome < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n const browserDetails = utils.detectBrowser(window);\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n desc.sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n chromeShim.shimGetUserMedia(window);\n chromeShim.shimMediaStream(window);\n chromeShim.shimPeerConnection(window);\n chromeShim.shimOnTrack(window);\n chromeShim.shimAddTrackRemoveTrack(window);\n chromeShim.shimGetSendersWithDtmf(window);\n chromeShim.shimGetStats(window);\n chromeShim.shimSenderReceiverGetStats(window);\n chromeShim.fixNegotiationNeeded(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimConnectionState(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n commonShim.removeAllowExtmapMixed(window);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n firefoxShim.shimGetUserMedia(window);\n firefoxShim.shimPeerConnection(window);\n firefoxShim.shimOnTrack(window);\n firefoxShim.shimRemoveStream(window);\n firefoxShim.shimSenderGetStats(window);\n firefoxShim.shimReceiverGetStats(window);\n firefoxShim.shimRTCDataChannel(window);\n firefoxShim.shimAddTransceiver(window);\n firefoxShim.shimCreateOffer(window);\n firefoxShim.shimCreateAnswer(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimConnectionState(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window);\n edgeShim.shimGetDisplayMedia(window);\n edgeShim.shimPeerConnection(window);\n edgeShim.shimReplaceTrack(window);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n safariShim.shimRTCIceServerUrls(window);\n safariShim.shimCreateOfferLegacy(window);\n safariShim.shimCallbacksAPI(window);\n safariShim.shimLocalStreamsAPI(window);\n safariShim.shimRemoteStreamsAPI(window);\n safariShim.shimTrackEventTransceiver(window);\n safariShim.shimGetUserMedia(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n commonShim.removeAllowExtmapMixed(window);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter = adapterFactory({window});\nexport default adapter;\n","import webRTCAdapter from \"webrtc-adapter\";\n\nexport { webRTCAdapter };\n","import { webRTCAdapter } from './adapter';\n\nexport const Supports = new class {\n readonly isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);\n readonly supportedBrowsers = ['firefox', 'chrome', 'safari'];\n\n readonly minFirefoxVersion = 59;\n readonly minChromeVersion = 72;\n readonly minSafariVersion = 605;\n\n isWebRTCSupported(): boolean {\n return typeof RTCPeerConnection !== 'undefined';\n };\n\n isBrowserSupported(): boolean {\n const browser = this.getBrowser();\n const version = this.getVersion();\n\n const validBrowser = this.supportedBrowsers.includes(browser);\n\n if (!validBrowser) return false;\n\n if (browser === 'chrome') return version >= this.minChromeVersion;\n if (browser === 'firefox') return version >= this.minFirefoxVersion;\n if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;\n\n return false;\n }\n\n getBrowser(): string {\n return webRTCAdapter.browserDetails.browser;\n }\n\n getVersion(): number {\n return webRTCAdapter.browserDetails.version || 0;\n }\n\n isUnifiedPlanSupported(): boolean {\n const browser = this.getBrowser();\n const version = webRTCAdapter.browserDetails.version || 0;\n\n if (browser === 'chrome' && version < 72) return false;\n if (browser === 'firefox' && version >= 59) return true;\n if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;\n\n let tempPc: RTCPeerConnection;\n let supported = false;\n\n try {\n tempPc = new RTCPeerConnection();\n tempPc.addTransceiver('audio');\n supported = true;\n } catch (e) { }\n finally {\n if (tempPc) {\n tempPc.close();\n }\n }\n\n return supported;\n }\n\n toString(): string {\n return `Supports: \n browser:${this.getBrowser()} \n version:${this.getVersion()} \n isIOS:${this.isIOS} \n isWebRTCSupported:${this.isWebRTCSupported()} \n isBrowserSupported:${this.isBrowserSupported()} \n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\n }\n}","import * as BinaryPack from \"peerjs-js-binarypack\";\nimport { Supports } from './supports';\nimport { UtilSupportsObj } from '..';\n\nconst DEFAULT_CONFIG = {\n iceServers: [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"turn:0.peerjs.com:3478\", username: \"peerjs\", credential: \"peerjsp\" }\n ],\n sdpSemantics: \"unified-plan\"\n};\n\nexport const util = new class {\n noop(): void { }\n\n readonly CLOUD_HOST = \"0.peerjs.com\";\n readonly CLOUD_PORT = 443;\n\n // Browsers that need chunking:\n readonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\n readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\n\n // Returns browser-agnostic default config\n readonly defaultConfig = DEFAULT_CONFIG;\n\n readonly browser = Supports.getBrowser();\n readonly browserVersion = Supports.getVersion();\n\n // Lists which features are supported\n readonly supports = (function () {\n const supported: UtilSupportsObj = {\n browser: Supports.isBrowserSupported(),\n webRTC: Supports.isWebRTCSupported(),\n audioVideo: false,\n data: false,\n binaryBlob: false,\n reliable: false,\n };\n\n if (!supported.webRTC) return supported;\n\n let pc: RTCPeerConnection;\n\n try {\n pc = new RTCPeerConnection(DEFAULT_CONFIG);\n\n supported.audioVideo = true;\n\n let dc: RTCDataChannel;\n\n try {\n dc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\n supported.data = true;\n supported.reliable = !!dc.ordered;\n\n // Binary test\n try {\n dc.binaryType = \"blob\";\n supported.binaryBlob = !Supports.isIOS;\n } catch (e) {\n }\n } catch (e) {\n } finally {\n if (dc) {\n dc.close();\n }\n }\n } catch (e) {\n } finally {\n if (pc) {\n pc.close();\n }\n }\n\n return supported;\n })();\n\n // Ensure alphanumeric ids\n validateId(id: string): boolean {\n // Allow empty ids\n return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\n }\n\n pack = BinaryPack.pack;\n unpack = BinaryPack.unpack;\n\n // Binary stuff\n\n private _dataCount: number = 1;\n\n chunk(blob: Blob): { __peerData: number, n: number, total: number, data: Blob }[] {\n const chunks = [];\n const size = blob.size;\n const total = Math.ceil(size / util.chunkedMTU);\n\n let index = 0;\n let start = 0;\n\n while (start < size) {\n const end = Math.min(size, start + util.chunkedMTU);\n const b = blob.slice(start, end);\n\n const chunk = {\n __peerData: this._dataCount,\n n: index,\n data: b,\n total,\n };\n\n chunks.push(chunk);\n\n start = end;\n index++;\n }\n\n this._dataCount++;\n\n return chunks;\n }\n\n blobToArrayBuffer(blob: Blob, cb: (arg: ArrayBuffer | null) => void): FileReader {\n const fr = new FileReader();\n\n fr.onload = function (evt) {\n if (evt.target) {\n cb(evt.target.result as ArrayBuffer);\n }\n };\n\n fr.readAsArrayBuffer(blob);\n\n return fr;\n }\n\n binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\n const byteArray = new Uint8Array(binary.length);\n\n for (let i = 0; i < binary.length; i++) {\n byteArray[i] = binary.charCodeAt(i) & 0xff;\n }\n\n return byteArray.buffer;\n }\n\n randomToken(): string {\n return Math.random()\n .toString(36)\n .substr(2);\n }\n\n isSecure(): boolean {\n return location.protocol === \"https:\";\n }\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = 'PeerJS: ';\n\n/*\nPrints log messages depending on the debug level passed in. Defaults to 0.\n0 Prints no logs.\n1 Prints only errors.\n2 Prints errors and warnings.\n3 Prints all logs.\n*/\nexport enum LogLevel {\n Disabled,\n Errors,\n Warnings,\n All\n}\n\nclass Logger {\n private _logLevel = LogLevel.Disabled;\n\n get logLevel(): LogLevel { return this._logLevel; }\n\n set logLevel(logLevel: LogLevel) { this._logLevel = logLevel; }\n\n log(...args: any[]) {\n if (this._logLevel >= LogLevel.All) {\n this._print(LogLevel.All, ...args);\n }\n }\n\n warn(...args: any[]) {\n if (this._logLevel >= LogLevel.Warnings) {\n this._print(LogLevel.Warnings, ...args);\n }\n }\n\n error(...args: any[]) {\n if (this._logLevel >= LogLevel.Errors) {\n this._print(LogLevel.Errors, ...args);\n }\n }\n\n setLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\n this._print = fn;\n }\n\n private _print(logLevel: LogLevel, ...rest: any[]): void {\n const copy = [LOG_PREFIX, ...rest];\n\n for (let i in copy) {\n if (copy[i] instanceof Error) {\n copy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\n\n }\n }\n\n if (logLevel >= LogLevel.All) {\n console.log(...copy);\n } else if (logLevel >= LogLevel.Warnings) {\n console.warn(\"WARNING\", ...copy);\n } else if (logLevel >= LogLevel.Errors) {\n console.error(\"ERROR\", ...copy);\n }\n }\n}\n\nexport default new Logger();","export enum ConnectionEventType {\n Open = \"open\",\n Stream = \"stream\",\n Data = \"data\",\n Close = \"close\",\n Error = \"error\",\n IceStateChanged = \"iceStateChanged\"\n}\n\nexport enum ConnectionType {\n Data = \"data\",\n Media = \"media\"\n}\n\nexport enum PeerEventType {\n Open = \"open\",\n Close = \"close\",\n Connection = \"connection\",\n Call = \"call\",\n Disconnected = \"disconnected\",\n Error = \"error\"\n}\n\nexport enum PeerErrorType {\n BrowserIncompatible = \"browser-incompatible\",\n Disconnected = \"disconnected\",\n InvalidID = \"invalid-id\",\n InvalidKey = \"invalid-key\",\n Network = \"network\",\n PeerUnavailable = \"peer-unavailable\",\n SslUnavailable = \"ssl-unavailable\",\n ServerError = \"server-error\",\n SocketError = \"socket-error\",\n SocketClosed = \"socket-closed\",\n UnavailableID = \"unavailable-id\",\n WebRTC = \"webrtc\"\n}\n\nexport enum SerializationType {\n Binary = \"binary\",\n BinaryUTF8 = \"binary-utf8\",\n JSON = \"json\"\n}\n\nexport enum SocketEventType {\n Message = \"message\",\n Disconnected = \"disconnected\",\n Error = \"error\",\n Close = \"close\"\n}\n\nexport enum ServerMessageType {\n Heartbeat = \"HEARTBEAT\",\n Candidate = \"CANDIDATE\",\n Offer = \"OFFER\",\n Answer = \"ANSWER\",\n Open = \"OPEN\", // The connection to the server is open.\n Error = \"ERROR\", // Server error.\n IdTaken = \"ID-TAKEN\", // The selected ID is taken.\n InvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\n Leave = \"LEAVE\", // Another peer has closed its connection to this peer.\n Expire = \"EXPIRE\" // The offer sent to a peer has expired without response.\n\n}","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\nimport { SocketEventType, ServerMessageType } from \"./enums\";\n\n/**\n * An abstraction on top of WebSockets to provide fastest\n * possible connection for peers.\n */\nexport class Socket extends EventEmitter {\n private _disconnected: boolean = true;\n private _id?: string;\n private _messagesQueue: Array<object> = [];\n private _socket?: WebSocket;\n private _wsPingTimer?: any;\n private readonly _baseUrl: string;\n\n constructor(\n secure: any,\n host: string,\n port: number,\n path: string,\n key: string,\n private readonly pingInterval: number = 5000,\n ) {\n super();\n\n const wsProtocol = secure ? \"wss://\" : \"ws://\";\n\n this._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\n }\n\n start(id: string, token: string): void {\n this._id = id;\n\n const wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\n\n if (!!this._socket || !this._disconnected) {\n return;\n }\n\n this._socket = new WebSocket(wsUrl);\n this._disconnected = false;\n\n this._socket.onmessage = (event) => {\n let data;\n\n try {\n data = JSON.parse(event.data);\n logger.log(\"Server message received:\", data);\n } catch (e) {\n logger.log(\"Invalid server message\", event.data);\n return;\n }\n\n this.emit(SocketEventType.Message, data);\n };\n\n this._socket.onclose = (event) => {\n if (this._disconnected) {\n return;\n }\n\n logger.log(\"Socket closed.\", event);\n\n this._cleanup();\n this._disconnected = true;\n\n this.emit(SocketEventType.Disconnected);\n };\n\n // Take care of the queue of connections if necessary and make sure Peer knows\n // socket is open.\n this._socket.onopen = () => {\n if (this._disconnected) {\n return;\n }\n\n this._sendQueuedMessages();\n\n logger.log(\"Socket open\");\n\n this._scheduleHeartbeat();\n };\n }\n\n private _scheduleHeartbeat(): void {\n this._wsPingTimer = setTimeout(() => {\n this._sendHeartbeat();\n }, this.pingInterval);\n }\n\n private _sendHeartbeat(): void {\n if (!this._wsOpen()) {\n logger.log(`Cannot send heartbeat, because socket closed`);\n return;\n }\n\n const message = JSON.stringify({ type: ServerMessageType.Heartbeat });\n\n this._socket!.send(message);\n\n this._scheduleHeartbeat();\n }\n\n /** Is the websocket currently open? */\n private _wsOpen(): boolean {\n return !!this._socket && this._socket.readyState === 1;\n }\n\n /** Send queued messages. */\n private _sendQueuedMessages(): void {\n //Create copy of queue and clear it,\n //because send method push the message back to queue if smth will go wrong\n const copiedQueue = [...this._messagesQueue];\n this._messagesQueue = [];\n\n for (const message of copiedQueue) {\n this.send(message);\n }\n }\n\n /** Exposed send for DC & Peer. */\n send(data: any): void {\n if (this._disconnected) {\n return;\n }\n\n // If we didn't get an ID yet, we can't yet send anything so we should queue\n // up these messages.\n if (!this._id) {\n this._messagesQueue.push(data);\n return;\n }\n\n if (!data.type) {\n this.emit(SocketEventType.Error, \"Invalid message\");\n return;\n }\n\n if (!this._wsOpen()) {\n return;\n }\n\n const message = JSON.stringify(data);\n\n this._socket!.send(message);\n }\n\n close(): void {\n if (this._disconnected) {\n return;\n }\n\n this._cleanup();\n\n this._disconnected = true;\n }\n\n private _cleanup(): void {\n if (!!this._socket) {\n this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;\n this._socket.close();\n this._socket = undefined;\n }\n\n clearTimeout(this._wsPingTimer!);\n }\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport { ConnectionType, PeerErrorType, ConnectionEventType, ServerMessageType } from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\n\n/**\n * Manages all negotiations between Peers.\n */\nexport class Negotiator {\n constructor(readonly connection: BaseConnection) { }\n\n /** Returns a PeerConnection object set up correctly (for data, media). */\n startConnection(options: any) {\n const peerConnection = this._startPeerConnection();\n\n // Set the connection's PC.\n this.connection.peerConnection = peerConnection;\n\n if (this.connection.type === ConnectionType.Media && options._stream) {\n this._addTracksToConnection(options._stream, peerConnection);\n }\n\n // What do we need to do now?\n if (options.originator) {\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = <DataConnection>this.connection;\n\n const config: RTCDataChannelInit = { ordered: !!options.reliable };\n\n const dataChannel = peerConnection.createDataChannel(\n dataConnection.label,\n config\n );\n dataConnection.initialize(dataChannel);\n }\n\n this._makeOffer();\n } else {\n this.handleSDP(\"OFFER\", options.sdp);\n }\n }\n\n /** Start a PC. */\n private _startPeerConnection(): RTCPeerConnection {\n logger.log(\"Creating RTCPeerConnection.\");\n\n const peerConnection = new RTCPeerConnection(this.connection.provider.options.config);\n\n this._setupListeners(peerConnection);\n\n return peerConnection;\n }\n\n /** Set up various WebRTC listeners. */\n private _setupListeners(\n peerConnection: RTCPeerConnection\n ) {\n const peerId = this.connection.peer;\n const connectionId = this.connection.connectionId;\n const connectionType = this.connection.type;\n const provider = this.connection.provider;\n\n // ICE CANDIDATES.\n logger.log(\"Listening for ICE candidates.\");\n\n peerConnection.onicecandidate = (evt) => {\n if (!evt.candidate || !evt.candidate.candidate) return;\n\n logger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\n\n provider.socket.send({\n type: ServerMessageType.Candidate,\n payload: {\n candidate: evt.candidate,\n type: connectionType,\n connectionId: connectionId\n },\n dst: peerId\n });\n };\n\n peerConnection.oniceconnectionstatechange = () => {\n switch (peerConnection.iceConnectionState) {\n case \"failed\":\n logger.log(\n \"iceConnectionState is failed, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Negotiation of connection to \" + peerId + \" failed.\")\n );\n this.connection.close();\n break;\n case \"closed\":\n logger.log(\n \"iceConnectionState is closed, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Connection to \" + peerId + \" closed.\")\n );\n this.connection.close();\n break;\n case \"disconnected\":\n logger.log(\n \"iceConnectionState is disconnected, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Connection to \" + peerId + \" disconnected.\")\n );\n this.connection.close();\n break;\n case \"completed\":\n peerConnection.onicecandidate = util.noop;\n break;\n }\n\n this.connection.emit(ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);\n };\n\n // DATACONNECTION.\n logger.log(\"Listening for data channel\");\n // Fired between offer and answer, so options should already be saved\n // in the options hash.\n peerConnection.ondatachannel = (evt) => {\n logger.log(\"Received data channel\");\n\n const dataChannel = evt.channel;\n const connection = <DataConnection>(\n provider.getConnection(peerId, connectionId)\n );\n\n connection.initialize(dataChannel);\n };\n\n // MEDIACONNECTION.\n logger.log(\"Listening for remote stream\");\n\n peerConnection.ontrack = (evt) => {\n logger.log(\"Received remote stream\");\n\n const stream = evt.streams[0];\n const connection = provider.getConnection(peerId, connectionId);\n\n if (connection.type === ConnectionType.Media) {\n const mediaConnection = <MediaConnection>connection;\n\n this._addStreamToMediaConnection(stream, mediaConnection);\n }\n };\n }\n\n cleanup(): void {\n logger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\n\n const peerConnection = this.connection.peerConnection;\n\n if (!peerConnection) {\n return;\n }\n\n this.connection.peerConnection = null;\n\n //unsubscribe from all PeerConnection's events\n peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = () => { };\n\n const peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\n let dataChannelNotClosed = false;\n\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = <DataConnection>this.connection;\n const dataChannel = dataConnection.dataChannel;\n\n if (dataChannel) {\n dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== \"closed\";\n }\n }\n\n if (peerConnectionNotClosed || dataChannelNotClosed) {\n peerConnection.close();\n }\n }\n\n private async _makeOffer(): Promise<void> {\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n const offer = await peerConnection.createOffer(\n this.connection.options.constraints\n );\n\n logger.log(\"Created offer.\");\n\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\n offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;\n }\n\n try {\n await peerConnection.setLocalDescription(offer);\n\n logger.log(\"Set localDescription:\", offer, `for:${this.connection.peer}`);\n\n let payload: any = {\n sdp: offer,\n type: this.connection.type,\n connectionId: this.connection.connectionId,\n metadata: this.connection.metadata,\n browser: util.browser\n };\n\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = <DataConnection>this.connection;\n\n payload = {\n ...payload,\n label: dataConnection.label,\n reliable: dataConnection.reliable,\n serialization: dataConnection.serialization\n };\n }\n\n provider.socket.send({\n type: ServerMessageType.Offer,\n payload,\n dst: this.connection.peer\n });\n } catch (err) {\n // TODO: investigate why _makeOffer is being called from the answer\n if (\n err !=\n \"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\n ) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setLocalDescription, \", err);\n }\n }\n } catch (err_1) {\n provider.emitError(PeerErrorType.WebRTC, err_1);\n logger.log(\"Failed to createOffer, \", err_1);\n }\n }\n\n private async _makeAnswer(): Promise<void> {\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n const answer = await peerConnection.createAnswer();\n logger.log(\"Created answer.\");\n\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\n answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;\n }\n\n try {\n await peerConnection.setLocalDescription(answer);\n\n logger.log(`Set localDescription:`, answer, `for:${this.connection.peer}`);\n\n provider.socket.send({\n type: ServerMessageType.Answer,\n payload: {\n sdp: answer,\n type: this.connection.type,\n connectionId: this.connection.connectionId,\n browser: util.browser\n },\n dst: this.connection.peer\n });\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setLocalDescription, \", err);\n }\n } catch (err_1) {\n provider.emitError(PeerErrorType.WebRTC, err_1);\n logger.log(\"Failed to create answer, \", err_1);\n }\n }\n\n /** Handle an SDP. */\n async handleSDP(\n type: string,\n sdp: any\n ): Promise<void> {\n sdp = new RTCSessionDescription(sdp);\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n logger.log(\"Setting remote description\", sdp);\n\n const self = this;\n\n try {\n await peerConnection.setRemoteDescription(sdp);\n logger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\n if (type === \"OFFER\") {\n await self._makeAnswer();\n }\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setRemoteDescription, \", err);\n }\n }\n\n /** Handle a candidate. */\n async handleCandidate(ice: any): Promise<void> {\n logger.log(`handleCandidate:`, ice);\n\n const candidate = ice.candidate;\n const sdpMLineIndex = ice.sdpMLineIndex;\n const sdpMid = ice.sdpMid;\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n await peerConnection.addIceCandidate(\n new RTCIceCandidate({\n sdpMid: sdpMid,\n sdpMLineIndex: sdpMLineIndex,\n candidate: candidate\n })\n );\n logger.log(`Added ICE candidate for:${this.connection.peer}`);\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to handleCandidate, \", err);\n }\n }\n\n private _addTracksToConnection(\n stream: MediaStream,\n peerConnection: RTCPeerConnection\n ): void {\n logger.log(`add tracks from stream ${stream.id} to peer connection`);\n\n if (!peerConnection.addTrack) {\n return logger.error(\n `Your browser does't support RTCPeerConnection#addTrack. Ignored.`\n );\n }\n\n stream.getTracks().forEach(track => {\n peerConnection.addTrack(track, stream);\n });\n }\n\n private _addStreamToMediaConnection(\n stream: MediaStream,\n mediaConnection: MediaConnection\n ): void {\n logger.log(\n `add stream ${stream.id} to media connection ${\n mediaConnection.connectionId\n }`\n );\n\n mediaConnection.addStream(stream);\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { Peer } from \"./peer\";\nimport { ServerMessage } from \"./servermessage\";\nimport { ConnectionType } from \"./enums\";\n\nexport abstract class BaseConnection extends EventEmitter {\n protected _open = false;\n\n readonly metadata: any;\n connectionId: string;\n\n peerConnection: RTCPeerConnection;\n\n abstract get type(): ConnectionType;\n\n get open() {\n return this._open;\n }\n\n constructor(\n readonly peer: string,\n public provider: Peer,\n readonly options: any\n ) {\n super();\n\n this.metadata = options.metadata;\n }\n\n abstract close(): void;\n\n abstract handleMessage(message: ServerMessage): void;\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport { ConnectionType, ConnectionEventType, ServerMessageType } from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { AnswerOption } from \"..\";\n\n/**\n * Wraps the streaming interface between two Peers.\n */\nexport class MediaConnection extends BaseConnection {\n private static readonly ID_PREFIX = \"mc_\";\n\n private _negotiator: Negotiator;\n private _localStream: MediaStream;\n private _remoteStream: MediaStream;\n\n get type() {\n return ConnectionType.Media;\n }\n\n get localStream(): MediaStream { return this._localStream; }\n get remoteStream(): MediaStream { return this._remoteStream; }\n\n constructor(peerId: string, provider: Peer, options: any) {\n super(peerId, provider, options);\n\n this._localStream = this.options._stream;\n this.connectionId =\n this.options.connectionId ||\n MediaConnection.ID_PREFIX + util.randomToken();\n\n this._negotiator = new Negotiator(this);\n\n if (this._localStream) {\n this._negotiator.startConnection({\n _stream: this._localStream,\n originator: true\n });\n }\n }\n\n addStream(remoteStream) {\n logger.log(\"Receiving stream\", remoteStream);\n\n this._remoteStream = remoteStream;\n super.emit(ConnectionEventType.Stream, remoteStream); // Should we call this `open`?\n }\n\n handleMessage(message: ServerMessage): void {\n const type = message.type;\n const payload = message.payload;\n\n switch (message.type) {\n case ServerMessageType.Answer:\n // Forward to negotiator\n this._negotiator.handleSDP(type, payload.sdp);\n this._open = true;\n break;\n case ServerMessageType.Candidate:\n this._negotiator.handleCandidate(payload.candidate);\n break;\n default:\n logger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\n break;\n }\n }\n\n answer(stream: MediaStream, options: AnswerOption = {}): void {\n if (this._localStream) {\n logger.warn(\n \"Local stream already exists on this MediaConnection. Are you answering a call twice?\"\n );\n return;\n }\n\n this._localStream = stream;\n\n if (options && options.sdpTransform) {\n this.options.sdpTransform = options.sdpTransform;\n }\n\n this._negotiator.startConnection({ ...this.options._payload, _stream: stream });\n // Retrieve lost messages stored because PeerConnection not set up.\n const messages = this.provider._getMessages(this.connectionId);\n\n for (let message of messages) {\n this.handleMessage(message);\n }\n\n this._open = true;\n }\n\n /**\n * Exposed functionality for users.\n */\n\n /** Allows user to close connection. */\n close(): void {\n if (this._negotiator) {\n this._negotiator.cleanup();\n this._negotiator = null;\n }\n\n this._localStream = null;\n this._remoteStream = null;\n\n if (this.provider) {\n this.provider._removeConnection(this);\n\n this.provider = null;\n }\n\n if (this.options && this.options._stream) {\n this.options._stream = null;\n }\n\n if (!this.open) {\n return;\n }\n\n this._open = false;\n\n super.emit(ConnectionEventType.Close);\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\n\nexport class EncodingQueue extends EventEmitter {\n readonly fileReader: FileReader = new FileReader();\n\n private _queue: Blob[] = [];\n private _processing: boolean = false;\n\n constructor() {\n super();\n\n this.fileReader.onload = (evt) => {\n this._processing = false;\n\n if (evt.target) {\n this.emit('done', evt.target.result as ArrayBuffer);\n }\n\n this.doNextTask();\n };\n\n this.fileReader.onerror = (evt) => {\n logger.error(`EncodingQueue error:`, evt);\n this._processing = false;\n this.destroy();\n this.emit('error', evt);\n }\n }\n\n get queue(): Blob[] {\n return this._queue;\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get processing(): boolean {\n return this._processing;\n }\n\n enque(blob: Blob): void {\n this.queue.push(blob);\n\n if (this.processing) return;\n\n this.doNextTask();\n }\n\n destroy(): void {\n this.fileReader.abort();\n this._queue = [];\n }\n\n private doNextTask(): void {\n if (this.size === 0) return;\n if (this.processing) return;\n\n this._processing = true;\n\n this.fileReader.readAsArrayBuffer(this.queue.shift());\n }\n}","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport {\n ConnectionType,\n ConnectionEventType,\n SerializationType,\n ServerMessageType\n} from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { EncodingQueue } from './encodingQueue';\nimport { DataConnection as IDataConnection } from '../index';\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport class DataConnection extends BaseConnection implements IDataConnection {\n private static readonly ID_PREFIX = \"dc_\";\n private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\n\n private _negotiator: Negotiator;\n readonly label: string;\n readonly serialization: SerializationType;\n readonly reliable: boolean;\n stringify: (data: any) => string = JSON.stringify;\n parse: (data: string) => any = JSON.parse;\n\n get type() {\n return ConnectionType.Data;\n }\n\n private _buffer: any[] = [];\n private _bufferSize = 0;\n private _buffering = false;\n private _chunkedData: {\n [id: number]: {\n data: Blob[],\n count: number,\n total: number\n }\n } = {};\n\n private _dc: RTCDataChannel;\n private _encodingQueue = new EncodingQueue();\n\n get dataChannel(): RTCDataChannel {\n return this._dc;\n }\n\n get bufferSize(): number { return this._bufferSize; }\n\n constructor(peerId: string, provider: Peer, options: any) {\n super(peerId, provider, options);\n\n this.connectionId =\n this.options.connectionId || DataConnection.ID_PREFIX + util.randomToken();\n\n this.label = this.options.label || this.connectionId;\n this.serialization = this.options.serialization || SerializationType.Binary;\n this.reliable = !!this.options.reliable;\n\n this._encodingQueue.on('done', (ab: ArrayBuffer) => {\n this._bufferedSend(ab);\n });\n\n this._encodingQueue.on('error', () => {\n logger.error(`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`);\n this.close();\n });\n\n this._negotiator = new Negotiator(this);\n\n this._negotiator.startConnection(\n this.options._payload || {\n originator: true\n }\n );\n }\n\n /** Called by the Negotiator when the DataChannel is ready. */\n initialize(dc: RTCDataChannel): void {\n this._dc = dc;\n this._configureDataChannel();\n }\n\n private _configureDataChannel(): void {\n if (!util.supports.binaryBlob || util.supports.reliable) {\n this.dataChannel.binaryType = \"arraybuffer\";\n }\n\n this.dataChannel.onopen = () => {\n logger.log(`DC#${this.connectionId} dc connection success`);\n this._open = true;\n this.emit(ConnectionEventType.Open);\n };\n\n this.dataChannel.onmessage = (e) => {\n logger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\n this._handleDataMessage(e);\n };\n\n this.dataChannel.onclose = () => {\n logger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n this.close();\n };\n }\n\n // Handles a DataChannel message.\n private _handleDataMessage({ data }: { data: Blob | ArrayBuffer | string }): void {\n const datatype = data.constructor;\n\n const isBinarySerialization = this.serialization === SerializationType.Binary ||\n this.serialization === SerializationType.BinaryUTF8;\n\n let deserializedData: any = data;\n\n if (isBinarySerialization) {\n if (datatype === Blob) {\n // Datatype should never be blob\n util.blobToArrayBuffer(data as Blob, (ab) => {\n const unpackedData = util.unpack(ab);\n this.emit(ConnectionEventType.Data, unpackedData);\n });\n return;\n } else if (datatype === ArrayBuffer) {\n deserializedData = util.unpack(data as ArrayBuffer);\n } else if (datatype === String) {\n // String fallback for binary data for browsers that don't support binary yet\n const ab = util.binaryStringToArrayBuffer(data as string);\n deserializedData = util.unpack(ab);\n }\n } else if (this.serialization === SerializationType.JSON) {\n deserializedData = this.parse(data as string);\n }\n\n // Check if we've chunked--if so, piece things back together.\n // We're guaranteed that this isn't 0.\n if (deserializedData.__peerData) {\n this._handleChunk(deserializedData);\n return;\n }\n\n super.emit(ConnectionEventType.Data, deserializedData);\n }\n\n private _handleChunk(data: { __peerData: number, n: number, total: number, data: Blob }): void {\n const id = data.__peerData;\n const chunkInfo = this._chunkedData[id] || {\n data: [],\n count: 0,\n total: data.total\n };\n\n chunkInfo.data[data.n] = data.data;\n chunkInfo.count++;\n this._chunkedData[id] = chunkInfo;\n\n if (chunkInfo.total === chunkInfo.count) {\n // Clean up before making the recursive call to `_handleDataMessage`.\n delete this._chunkedData[id];\n\n // We've received all the chunks--time to construct the complete data.\n const data = new Blob(chunkInfo.data);\n this._handleDataMessage({ data });\n }\n }\n\n /**\n * Exposed functionality for users.\n */\n\n /** Allows user to close connection. */\n close(): void {\n this._buffer = [];\n this._bufferSize = 0;\n this._chunkedData = {};\n\n if (this._negotiator) {\n this._negotiator.cleanup();\n this._negotiator = null;\n }\n\n if (this.provider) {\n this.provider._removeConnection(this);\n\n this.provider = null;\n }\n\n if (this.dataChannel) {\n this.dataChannel.onopen = null;\n this.dataChannel.onmessage = null;\n this.dataChannel.onclose = null;\n this._dc = null;\n }\n\n if (this._encodingQueue) {\n this._encodingQueue.destroy();\n this._encodingQueue.removeAllListeners();\n this._encodingQueue = null;\n }\n\n if (!this.open) {\n return;\n }\n\n this._open = false;\n\n super.emit(ConnectionEventType.Close);\n }\n\n /** Allows user to send data. */\n send(data: any, chunked?: boolean): void {\n if (!this.open) {\n super.emit(\n ConnectionEventType.Error,\n new Error(\n \"Connection is not open. You should listen for the `open` event before sending messages.\"\n )\n );\n return;\n }\n\n if (this.serialization === SerializationType.JSON) {\n this._bufferedSend(this.stringify(data));\n } else if (\n this.serialization === SerializationType.Binary ||\n this.serialization === SerializationType.BinaryUTF8\n ) {\n const blob = util.pack(data);\n\n if (!chunked && blob.size > util.chunkedMTU) {\n this._sendChunks(blob);\n return;\n }\n\n if (!util.supports.binaryBlob) {\n // We only do this if we really need to (e.g. blobs are not supported),\n // because this conversion is costly.\n this._encodingQueue.enque(blob);\n } else {\n this._bufferedSend(blob);\n }\n } else {\n this._bufferedSend(data);\n }\n }\n\n private _bufferedSend(msg: any): void {\n if (this._buffering || !this._trySend(msg)) {\n this._buffer.push(msg);\n this._bufferSize = this._buffer.length;\n }\n }\n\n // Returns true if the send succeeds.\n private _trySend(msg: any): boolean {\n if (!this.open) {\n return false;\n }\n\n if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\n this._buffering = true;\n setTimeout(() => {\n this._buffering = false;\n this._tryBuffer();\n }, 50);\n\n return false;\n }\n\n try {\n this.dataChannel.send(msg);\n } catch (e) {\n logger.error(`DC#:${this.connectionId} Error when sending:`, e);\n this._buffering = true;\n\n this.close();\n\n return false;\n }\n\n return true;\n }\n\n // Try to send the first message in the buffer.\n private _tryBuffer(): void {\n if (!this.open) {\n return;\n }\n\n if (this._buffer.length === 0) {\n return;\n }\n\n const msg = this._buffer[0];\n\n if (this._trySend(msg)) {\n this._buffer.shift();\n this._bufferSize = this._buffer.length;\n this._tryBuffer();\n }\n }\n\n private _sendChunks(blob: Blob): void {\n const blobs = util.chunk(blob);\n logger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\n\n for (let blob of blobs) {\n this.send(blob, true);\n }\n }\n\n handleMessage(message: ServerMessage): void {\n const payload = message.payload;\n\n switch (message.type) {\n case ServerMessageType.Answer:\n this._negotiator.handleSDP(message.type, payload.sdp);\n break;\n case ServerMessageType.Candidate:\n this._negotiator.handleCandidate(payload.candidate);\n break;\n default:\n logger.warn(\n \"Unrecognized message type:\",\n message.type,\n \"from peer:\",\n this.peer\n );\n break;\n }\n }\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\n\nexport class API {\n constructor(private readonly _options: any) { }\n\n private _buildUrl(method: string): string {\n const protocol = this._options.secure ? \"https://\" : \"http://\";\n let url =\n protocol +\n this._options.host +\n \":\" +\n this._options.port +\n this._options.path +\n this._options.key +\n \"/\" +\n method;\n const queryString = \"?ts=\" + new Date().getTime() + \"\" + Math.random();\n url += queryString;\n\n return url;\n }\n\n /** Get a unique ID from the server via XHR and initialize with it. */\n async retrieveId(): Promise<string> {\n const url = this._buildUrl(\"id\");\n\n try {\n const response = await fetch(url);\n\n if (response.status !== 200) {\n throw new Error(`Error. Status:${response.status}`);\n }\n\n return response.text();\n } catch (error) {\n logger.error(\"Error retrieving ID\", error);\n\n let pathError = \"\";\n\n if (\n this._options.path === \"/\" &&\n this._options.host !== util.CLOUD_HOST\n ) {\n pathError =\n \" If you passed in a `path` to your self-hosted PeerServer, \" +\n \"you'll also need to pass in that same path when creating a new \" +\n \"Peer.\";\n }\n\n throw new Error(\"Could not get an ID from the server.\" + pathError);\n }\n }\n\n /** @deprecated */\n async listAllPeers(): Promise<any[]> {\n const url = this._buildUrl(\"peers\");\n\n try {\n const response = await fetch(url);\n\n if (response.status !== 200) {\n if (response.status === 401) {\n let helpfulError = \"\";\n\n if (this._options.host === util.CLOUD_HOST) {\n helpfulError =\n \"It looks like you're using the cloud server. You can email \" +\n \"[email protected] to enable peer listing for your API key.\";\n } else {\n helpfulError =\n \"You need to enable `allow_discovery` on your self-hosted \" +\n \"PeerServer to use this feature.\";\n }\n\n throw new Error(\"It doesn't look like you have permission to list peers IDs. \" +\n helpfulError);\n }\n\n throw new Error(`Error. Status:${response.status}`);\n }\n\n return response.json();\n } catch (error) {\n logger.error(\"Error retrieving list peers\", error);\n\n throw new Error(\"Could not get list peers from the server.\" + error);\n }\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { util } from \"./util\";\nimport logger, { LogLevel } from \"./logger\";\nimport { Socket } from \"./socket\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport {\n ConnectionType,\n PeerErrorType,\n PeerEventType,\n SocketEventType,\n ServerMessageType\n} from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { API } from \"./api\";\nimport { PeerConnectOption, PeerJSOption } from \"..\";\n\nclass PeerOptions implements PeerJSOption {\n debug?: LogLevel; // 1: Errors, 2: Warnings, 3: All logs\n host?: string;\n port?: number;\n path?: string;\n key?: string;\n token?: string;\n config?: any;\n secure?: boolean;\n pingInterval?: number;\n logFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\n}\n\n/**\n * A peer who can initiate connections with other peers.\n */\nexport class Peer extends EventEmitter {\n private static readonly DEFAULT_KEY = \"peerjs\";\n\n private readonly _options: PeerOptions;\n private readonly _api: API;\n private readonly _socket: Socket;\n\n private _id: string | null = null;\n private _lastServerId: string | null = null;\n\n // States.\n private _destroyed = false; // Connections have been killed\n private _disconnected = false; // Connection to PeerServer killed but P2P connections still active\n private _open = false; // Sockets and such are not yet open.\n private readonly _connections: Map<string, BaseConnection[]> = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map<string, ServerMessage[]> = new Map(); // src => [list of messages]\n\n get id() {\n return this._id;\n }\n\n get options() {\n return this._options;\n }\n\n get open() {\n return this._open;\n }\n\n get socket() {\n return this._socket;\n }\n\n /**\n * @deprecated \n * Return type will change from Object to Map<string,[]> \n */\n get connections(): Object {\n const plainConnections = Object.create(null);\n\n for (let [k, v] of this._connections) {\n plainConnections[k] = v;\n }\n\n return plainConnections;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n get disconnected() {\n return this._disconnected;\n }\n\n constructor(id?: string | PeerOptions, options?: PeerOptions) {\n super();\n\n let userId: string | undefined;\n\n // Deal with overloading\n if (id && id.constructor == Object) {\n options = id as PeerOptions;\n } else if (id) {\n userId = id.toString();\n }\n\n // Configurize options\n options = {\n debug: 0, // 1: Errors, 2: Warnings, 3: All logs\n host: util.CLOUD_HOST,\n port: util.CLOUD_PORT,\n path: \"/\",\n key: Peer.DEFAULT_KEY,\n token: util.randomToken(),\n config: util.defaultConfig,\n ...options\n };\n this._options = options;\n\n // Detect relative URL host.\n if (this._options.host === \"/\") {\n this._options.host = window.location.hostname;\n }\n\n // Set path correctly.\n if (this._options.path) {\n if (this._options.path[0] !== \"/\") {\n this._options.path = \"/\" + this._options.path;\n }\n if (this._options.path[this._options.path.length - 1] !== \"/\") {\n this._options.path += \"/\";\n }\n }\n\n // Set whether we use SSL to same as current host\n if (this._options.secure === undefined && this._options.host !== util.CLOUD_HOST) {\n this._options.secure = util.isSecure();\n } else if (this._options.host == util.CLOUD_HOST) {\n this._options.secure = true;\n }\n // Set a custom log function if present\n if (this._options.logFunction) {\n logger.setLogFunction(this._options.logFunction);\n }\n\n logger.logLevel = this._options.debug || 0;\n\n this._api = new API(options);\n this._socket = this._createServerConnection();\n\n // Sanity checks\n // Ensure WebRTC supported\n if (!util.supports.audioVideo && !util.supports.data) {\n this._delayedAbort(\n PeerErrorType.BrowserIncompatible,\n \"The current browser does not support WebRTC\"\n );\n return;\n }\n\n // Ensure alphanumeric id\n if (!!userId && !util.validateId(userId)) {\n this._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\n return;\n }\n\n if (userId) {\n this._initialize(userId);\n } else {\n this._api.retrieveId()\n .then(id => this._initialize(id))\n .catch(error => this._abort(PeerErrorType.ServerError, error));\n }\n }\n\n private _createServerConnection(): Socket {\n const socket = new Socket(\n this._options.secure,\n this._options.host!,\n this._options.port!,\n this._options.path!,\n this._options.key!,\n this._options.pingInterval\n );\n\n socket.on(SocketEventType.Message, (data: ServerMessage) => {\n this._handleMessage(data);\n });\n\n socket.on(SocketEventType.Error, (error: string) => {\n this._abort(PeerErrorType.SocketError, error);\n });\n\n socket.on(SocketEventType.Disconnected, () => {\n if (this.disconnected) {\n return;\n }\n\n this.emitError(PeerErrorType.Network, \"Lost connection to server.\");\n this.disconnect();\n });\n\n socket.on(SocketEventType.Close, () => {\n if (this.disconnected) {\n return;\n }\n\n this._abort(PeerErrorType.SocketClosed, \"Underlying socket is already closed.\");\n });\n\n return socket;\n }\n\n /** Initialize a connection with the server. */\n private _initialize(id: string): void {\n this._id = id;\n this.socket.start(id, this._options.token!);\n }\n\n /** Handles messages from the server. */\n private _handleMessage(message: ServerMessage): void {\n const type = message.type;\n const payload = message.payload;\n const peerId = message.src;\n\n switch (type) {\n case ServerMessageType.Open: // The connection to the server is open.\n this._lastServerId = this.id;\n this._open = true;\n this.emit(PeerEventType.Open, this.id);\n break;\n case ServerMessageType.Error: // Server error.\n this._abort(PeerErrorType.ServerError, payload.msg);\n break;\n case ServerMessageType.IdTaken: // The selected ID is taken.\n this._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\n break;\n case ServerMessageType.InvalidKey: // The given API key cannot be found.\n this._abort(PeerErrorType.InvalidKey, `API KEY \"${this._options.key}\" is invalid`);\n break;\n case ServerMessageType.Leave: // Another peer has closed its connection to this peer.\n logger.log(`Received leave message from ${peerId}`);\n this._cleanupPeer(peerId);\n this._connections.delete(peerId);\n break;\n case ServerMessageType.Expire: // The offer sent to a peer has expired without response.\n this.emitError(PeerErrorType.PeerUnavailable, `Could not connect to peer ${peerId}`);\n break;\n case ServerMessageType.Offer: {\n // we should consider switching this to CALL/CONNECT, but this is the least breaking option.\n const connectionId = payload.connectionId;\n let connection = this.getConnection(peerId, connectionId);\n\n if (connection) {\n connection.close();\n logger.warn(`Offer received for existing Connection ID:${connectionId}`);\n }\n\n // Create a new connection.\n if (payload.type === ConnectionType.Media) {\n connection = new MediaConnection(peerId, this, {\n connectionId: connectionId,\n _payload: payload,\n metadata: payload.metadata\n });\n this._addConnection(peerId, connection);\n this.emit(PeerEventType.Call, connection);\n } else if (payload.type === ConnectionType.Data) {\n connection = new DataConnection(peerId, this, {\n connectionId: connectionId,\n _payload: payload,\n metadata: payload.metadata,\n label: payload.label,\n serialization: payload.serialization,\n reliable: payload.reliable\n });\n this._addConnection(peerId, connection);\n this.emit(PeerEventType.Connection, connection);\n } else {\n logger.warn(`Received malformed connection type:${payload.type}`);\n return;\n }\n\n // Find messages.\n const messages = this._getMessages(connectionId);\n for (let message of messages) {\n connection.handleMessage(message);\n }\n\n break;\n }\n default: {\n if (!payload) {\n logger.warn(`You received a malformed message from ${peerId} of type ${type}`);\n return;\n }\n\n const connectionId = payload.connectionId;\n const connection = this.getConnection(peerId, connectionId);\n\n if (connection && connection.peerConnection) {\n // Pass it on.\n connection.handleMessage(message);\n } else if (connectionId) {\n // Store for possible later use\n this._storeMessage(connectionId, message);\n } else {\n logger.warn(\"You received an unrecognized message:\", message);\n }\n break;\n }\n }\n }\n\n /** Stores messages without a set up connection, to be claimed later. */\n private _storeMessage(connectionId: string, message: ServerMessage): void {\n if (!this._lostMessages.has(connectionId)) {\n this._lostMessages.set(connectionId, []);\n }\n\n this._lostMessages.get(connectionId).push(message);\n }\n\n /** Retrieve messages from lost message store */\n //TODO Change it to private\n public _getMessages(connectionId: string): ServerMessage[] {\n const messages = this._lostMessages.get(connectionId);\n\n if (messages) {\n this._lostMessages.delete(connectionId);\n return messages;\n }\n\n return [];\n }\n\n /**\n * Returns a DataConnection to the specified peer. See documentation for a\n * complete list of options.\n */\n connect(peer: string, options: PeerConnectOption = {}): DataConnection {\n if (this.disconnected) {\n logger.warn(\n \"You cannot connect to a new Peer because you called \" +\n \".disconnect() on this Peer and ended your connection with the \" +\n \"server. You can create a new Peer to reconnect, or call reconnect \" +\n \"on this peer if you believe its ID to still be available.\"\n );\n this.emitError(\n PeerErrorType.Disconnected,\n \"Cannot connect to new Peer after disconnecting from server.\"\n );\n return;\n }\n\n const dataConnection = new DataConnection(peer, this, options);\n this._addConnection(peer, dataConnection);\n return dataConnection;\n }\n\n /**\n * Returns a MediaConnection to the specified peer. See documentation for a\n * complete list of options.\n */\n call(peer: string, stream: MediaStream, options: any = {}): MediaConnection {\n if (this.disconnected) {\n logger.warn(\n \"You cannot connect to a new Peer because you called \" +\n \".disconnect() on this Peer and ended your connection with the \" +\n \"server. You can create a new Peer to reconnect.\"\n );\n this.emitError(\n PeerErrorType.Disconnected,\n \"Cannot connect to new Peer after disconnecting from server.\"\n );\n return;\n }\n\n if (!stream) {\n logger.error(\n \"To call a peer, you must provide a stream from your browser's `getUserMedia`.\"\n );\n return;\n }\n\n options._stream = stream;\n\n const mediaConnection = new MediaConnection(peer, this, options);\n this._addConnection(peer, mediaConnection);\n return mediaConnection;\n }\n\n /** Add a data/media connection to this peer. */\n private _addConnection(peerId: string, connection: BaseConnection): void {\n logger.log(`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`);\n\n if (!this._connections.has(peerId)) {\n this._connections.set(peerId, []);\n }\n this._connections.get(peerId).push(connection);\n }\n\n //TODO should be private\n _removeConnection(connection: BaseConnection): void {\n const connections = this._connections.get(connection.peer);\n\n if (connections) {\n const index = connections.indexOf(connection);\n\n if (index !== -1) {\n connections.splice(index, 1);\n }\n }\n\n //remove from lost messages\n this._lostMessages.delete(connection.connectionId);\n }\n\n /** Retrieve a data/media connection for this peer. */\n getConnection(peerId: string, connectionId: string): null | BaseConnection {\n const connections = this._connections.get(peerId);\n if (!connections) {\n return null;\n }\n\n for (let connection of connections) {\n if (connection.connectionId === connectionId) {\n return connection;\n }\n }\n\n return null;\n }\n\n private _delayedAbort(type: PeerErrorType, message: string | Error): void {\n setTimeout(() => {\n this._abort(type, message);\n }, 0);\n }\n\n /**\n * Emits an error message and destroys the Peer.\n * The Peer is not destroyed if it's in a disconnected state, in which case\n * it retains its disconnected state and its existing connections.\n */\n private _abort(type: PeerErrorType, message: string | Error): void {\n logger.error(\"Aborting!\");\n\n this.emitError(type, message);\n\n if (!this._lastServerId) {\n this.destroy();\n } else {\n this.disconnect();\n }\n }\n\n /** Emits a typed error message. */\n emitError(type: PeerErrorType, err: string | Error): void {\n logger.error(\"Error:\", err);\n\n let error: Error & { type?: PeerErrorType };\n\n if (typeof err === \"string\") {\n error = new Error(err);\n } else {\n error = err as Error;\n }\n\n error.type = type;\n\n this.emit(PeerEventType.Error, error);\n }\n\n /**\n * Destroys the Peer: closes all active connections as well as the connection\n * to the server.\n * Warning: The peer can no longer create or accept connections after being\n * destroyed.\n */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n logger.log(`Destroy peer with ID:${this.id}`);\n\n this.disconnect();\n this._cleanup();\n\n this._destroyed = true;\n\n this.emit(PeerEventType.Close);\n }\n\n /** Disconnects every connection on this peer. */\n private _cleanup(): void {\n for (let peerId of this._connections.keys()) {\n this._cleanupPeer(peerId);\n this._connections.delete(peerId);\n }\n\n this.socket.removeAllListeners();\n }\n\n /** Closes all connections to this peer. */\n private _cleanupPeer(peerId: string): void {\n const connections = this._connections.get(peerId);\n\n if (!connections) return;\n\n for (let connection of connections) {\n connection.close();\n }\n }\n\n /**\n * Disconnects the Peer's connection to the PeerServer. Does not close any\n * active connections.\n * Warning: The peer can no longer create or accept connections after being\n * disconnected. It also cannot reconnect to the server.\n */\n disconnect(): void {\n if (this.disconnected) {\n return;\n }\n\n const currentId = this.id;\n\n logger.log(`Disconnect peer with ID:${currentId}`);\n\n this._disconnected = true;\n this._open = false;\n\n this.socket.close();\n\n this._lastServerId = currentId;\n this._id = null;\n\n this.emit(PeerEventType.Disconnected, currentId);\n }\n\n /** Attempts to reconnect with the same ID. */\n reconnect(): void {\n if (this.disconnected && !this.destroyed) {\n logger.log(`Attempting reconnection to server with ID ${this._lastServerId}`);\n this._disconnected = false;\n this._initialize(this._lastServerId!);\n } else if (this.destroyed) {\n throw new Error(\"This peer cannot reconnect to the server. It has already been destroyed.\");\n } else if (!this.disconnected && !this.open) {\n // Do nothing. We're still connecting the first time.\n logger.error(\"In a hurry? We're still trying to make the initial connection!\");\n } else {\n throw new Error(`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`);\n }\n }\n\n /**\n * Get a list of available peer IDs. If you're running your own server, you'll\n * want to set allow_discovery: true in the PeerServer options. If you're using\n * the cloud server, email [email protected] to get the functionality enabled for\n * your key.\n */\n listAllPeers(cb = (_: any[]) => { }): void {\n this._api.listAllPeers()\n .then(peers => cb(peers))\n .catch(error => this._abort(PeerErrorType.ServerError, error));\n }\n}\n","import { util } from \"./util\";\nimport { Peer } from \"./peer\";\n\nexport const peerjs = {\n Peer,\n util\n};\n\nexport default Peer;\n\n(<any>window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(<any>window).Peer = Peer;\n"]}