diff --git a/dist/peerjs.js b/dist/peerjs.js index b70ce5f1d..4094a80a5 100644 --- a/dist/peerjs.js +++ b/dist/peerjs.js @@ -8679,6 +8679,8 @@ function (_super) { function DataConnection(peerId, provider, options) { var _this = _super.call(this, peerId, provider, options) || this; + _this.jsonStringify = JSON.stringify; + _this.jsonParse = JSON.parse; _this._buffer = []; _this._bufferSize = 0; _this._buffering = false; @@ -8790,7 +8792,7 @@ function (_super) { deserializedData = util_1.util.unpack(ab); } } else if (this.serialization === enums_1.SerializationType.JSON) { - deserializedData = JSON.parse(data); + deserializedData = this.jsonParse(data); } // Check if we've chunked--if so, piece things back together. // We're guaranteed that this isn't 0. @@ -8884,7 +8886,7 @@ function (_super) { } if (this.serialization === enums_1.SerializationType.JSON) { - this._bufferedSend(JSON.stringify(data)); + this._bufferedSend(this.jsonStringify(data)); } else if (this.serialization === enums_1.SerializationType.Binary || this.serialization === enums_1.SerializationType.BinaryUTF8) { var blob = util_1.util.pack(data); diff --git a/dist/peerjs.js.map b/dist/peerjs.js.map index 87d67a4e2..257e85927 100644 --- a/dist/peerjs.js.map +++ b/dist/peerjs.js.map @@ -1 +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","getSupportedConstraints","matches","enumerateDevices","then","devices","filter","d","kind","dev","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia_","onSuccess","onError","getUserMedia","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","error","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","event","Event","transceiver","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","reports","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","successCallbackWrapper_","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","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","method","nativeMethod","methodObj","args","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","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","removeTrackFromStreamAndFireEvent","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","rejected","isRejected","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","getCapabilities","codec","isNewTrack","default","nativeTrack","hasRtx","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjects","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","ridRegex","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","mLine","parseMLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","sdpSemantics","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","size","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeAllowExtmapMixed","nativeSRD","line","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1gBA;;;;;;;;AAOC;AACD;;;;;;;;;;;;;;;;;;;;AAEA,IAAIA,YAAY,GAAG,IAAnB;AACA,IAAIC,oBAAoB,GAAG,IAA3B;AAEA;;;;;;;;;AAQO,SAASC,cAAT,CAAwBC,QAAxB,EAAkCC,IAAlC,EAAwCC,GAAxC,EAA6C;AAClD,MAAMC,KAAK,GAAGH,QAAQ,CAACG,KAAT,CAAeF,IAAf,CAAd;AACA,SAAOE,KAAK,IAAIA,KAAK,CAACC,MAAN,IAAgBF,GAAzB,IAAgCG,QAAQ,CAACF,KAAK,CAACD,GAAD,CAAN,EAAa,EAAb,CAA/C;AACD,EAED;AACA;AACA;;;AACO,SAASI,uBAAT,CAAiCC,MAAjC,EAAyCC,eAAzC,EAA0DC,OAA1D,EAAmE;AACxE,MAAI,CAACF,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD;;AACD,MAAMC,KAAK,GAAGJ,MAAM,CAACG,iBAAP,CAAyBE,SAAvC;AACA,MAAMC,sBAA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iBAAO,IAAP;AACD;;AACD,eAAOK,SAAS,IAAI,CAACL,OAArB;AACD,OAdM,CAAP;AAgBA,aAAOC,MAAM,CAACE,GAAd;AACAF,MAAAA,MAAM,CAACC,IAAP,GAAcE,QAAQ,GAAGF,IAAI,CAAC,CAAD,CAAP,GAAaA,IAAnC;AACA,aAAO,CAAC,CAACA,IAAI,CAACrT,MAAd;AACD;AACF,GA9BM,CAAP;AA+BD;;AClDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnwBA;;;;;;;;AAOC;AACD;;AAEA,IAAI0T,QAAQ,GAAGC,OAAO,CAAC,KAAD,CAAtB;;AAEA,SAASC,YAAT,CAAsBvE,IAAtB,EAA4B;AAC1B,SAAO;AACLwE,IAAAA,UAAU,EAAE,aADP;AAELC,IAAAA,WAAW,EAAE,cAFR;AAGLC,IAAAA,aAAa,EAAE,gBAHV;AAIL7E,IAAAA,cAAc,EAAE,iBAJX;AAKLC,IAAAA,eAAe,EAAE;AALZ,IAMLE,IAAI,CAAClK,IANA,KAMSkK,IAAI,CAAClK,IANrB;AAOD;;AAED,SAAS6O,iBAAT,CAA2BvH,WAA3B,EAAwCwH,IAAxC,EAA8C9O,IAA9C,EAAoDgF,MAApD,EAA4D+J,QAA5D,EAAsE;AACpE,MAAI9C,GAAG,GAAGsC,QAAQ,CAACS,mBAAT,CAA6B1H,WAAW,CAACpE,IAAzC,EAA+C4L,IAA/C,CAAV,CADoE,CAGpE;;AACA7C,EAAAA,GAAG,IAAIsC,QAAQ,CAACU,kBAAT,CACH3H,WAAW,CAAC4H,WAAZ,CAAwBC,kBAAxB,EADG,CAAP,CAJoE,CAOpE;;AACAlD,EAAAA,GAAG,IAAIsC,QAAQ,CAACa,mBAAT,CACH9H,WAAW,CAAC+H,aAAZ,CAA0BF,kBAA1B,EADG,EAEHnP,IAA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CAAA,SAAA,CAAA,WAAA,GAAA,YAAA;AACE,WAAO,IAAI,CAAC,MAAL,GACJ,QADI,CACK,EADL,EAEJ,MAFI,CAEG,CAFH,CAAP;AAGD,GAJD;;AAMA,EAAA,OAAA,CAAA,SAAA,CAAA,QAAA,GAAA,YAAA;AACE,WAAO,QAAQ,CAAC,QAAT,KAAsB,QAA7B;AACD,GAFD;;AAGF,SAAA,OAAA;AA7IwB,CAAJ,EAAA,GAAP;;ACZb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChVA,IAAM,UAAU,GAAG,UAAnB;AAEA;;;;;;;;AAOA,IAAY,QAAZ;;AAAA,CAAA,UAAY,QAAZ,EAAoB;AAChB,EAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAA,QAAA,CAAA,QAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;AACH,CALD,EAAY,QAAQ,GAAR,OAAA,CAAA,QAAA,KAAA,OAAA,CAAA,QAAA,GAAQ,EAAR,CAAZ;;AAOA,IAAA,MAAA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","file":"peerjs.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: 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 = [];\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 = 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 = (\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 = 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 = 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 {\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 = 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 {\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 {\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 {\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';\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport class DataConnection extends BaseConnection {\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\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 = JSON.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(JSON.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 {\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 {\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 \"team@peerjs.com 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 = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map = 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 \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 team@peerjs.com 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(window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(window).Peer = Peer;\n"]} \ No newline at end of file +{"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","getSupportedConstraints","matches","enumerateDevices","then","devices","filter","d","kind","dev","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia_","onSuccess","onError","getUserMedia","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","error","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","event","Event","transceiver","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","reports","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","successCallbackWrapper_","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","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","method","nativeMethod","methodObj","args","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","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","removeTrackFromStreamAndFireEvent","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","rejected","isRejected","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","getCapabilities","codec","isNewTrack","default","nativeTrack","hasRtx","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjects","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","ridRegex","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","mLine","parseMLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","sdpSemantics","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","size","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeAllowExtmapMixed","nativeSRD","line","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1gBA;;;;;;;;AAOC;AACD;;;;;;;;;;;;;;;;;;;;AAEA,IAAIA,YAAY,GAAG,IAAnB;AACA,IAAIC,oBAAoB,GAAG,IAA3B;AAEA;;;;;;;;;AAQO,SAASC,cAAT,CAAwBC,QAAxB,EAAkCC,IAAlC,EAAwCC,GAAxC,EAA6C;AAClD,MAAMC,KAAK,GAAGH,QAAQ,CAACG,KAAT,CAAeF,IAAf,CAAd;AACA,SAAOE,KAAK,IAAIA,KAAK,CAACC,MAAN,IAAgBF,GAAzB,IAAgCG,QAAQ,CAACF,KAAK,CAACD,GAAD,CAAN,EAAa,EAAb,CAA/C;AACD,EAED;AACA;AACA;;;AACO,SAASI,uBAAT,CAAiCC,MAAjC,EAAyCC,eAAzC,EAA0DC,OAA1D,EAAmE;AACxE,MAAI,CAACF,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD;;AACD,MAAMC,KAAK,GAAGJ,MAAM,CAACG,iBAAP,CAAyBE,SAAvC;AACA,MAAMC,sBAA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iBAAO,IAAP;AACD;;AACD,eAAOK,SAAS,IAAI,CAACL,OAArB;AACD,OAdM,CAAP;AAgBA,aAAOC,MAAM,CAACE,GAAd;AACAF,MAAAA,MAAM,CAACC,IAAP,GAAcE,QAAQ,GAAGF,IAAI,CAAC,CAAD,CAAP,GAAaA,IAAnC;AACA,aAAO,CAAC,CAACA,IAAI,CAACrT,MAAd;AACD;AACF,GA9BM,CAAP;AA+BD;;AClDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnwBA;;;;;;;;AAOC;AACD;;AAEA,IAAI0T,QAAQ,GAAGC,OAAO,CAAC,KAAD,CAAtB;;AAEA,SAASC,YAAT,CAAsBvE,IAAtB,EAA4B;AAC1B,SAAO;AACLwE,IAAAA,UAAU,EAAE,aADP;AAELC,IAAAA,WAAW,EAAE,cAFR;AAGLC,IAAAA,aAAa,EAAE,gBAHV;AAIL7E,IAAAA,cAAc,EAAE,iBAJX;AAKLC,IAAAA,eAAe,EAAE;AALZ,IAMLE,IAAI,CAAClK,IANA,KAMSkK,IAAI,CAAClK,IANrB;AAOD;;AAED,SAAS6O,iBAAT,CAA2BvH,WAA3B,EAAwCwH,IAAxC,EAA8C9O,IAA9C,EAAoDgF,MAApD,EAA4D+J,QAA5D,EAAsE;AACpE,MAAI9C,GAAG,GAAGsC,QAAQ,CAACS,mBAAT,CAA6B1H,WAAW,CAACpE,IAAzC,EAA+C4L,IAA/C,CAAV,CADoE,CAGpE;;AACA7C,EAAAA,GAAG,IAAIsC,QAAQ,CAACU,kBAAT,CACH3H,WAAW,CAAC4H,WAAZ,CAAwBC,kBAAxB,EADG,CAAP,CAJoE,CAOpE;;AACAlD,EAAAA,GAAG,IAAIsC,QAAQ,CAACa,mBAAT,CACH9H,WAAW,CAAC+H,aAAZ,CAA0BF,kBAA1B,EADG,EAEHnP,IAA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CAAA,SAAA,CAAA,WAAA,GAAA,YAAA;AACE,WAAO,IAAI,CAAC,MAAL,GACJ,QADI,CACK,EADL,EAEJ,MAFI,CAEG,CAFH,CAAP;AAGD,GAJD;;AAMA,EAAA,OAAA,CAAA,SAAA,CAAA,QAAA,GAAA,YAAA;AACE,WAAO,QAAQ,CAAC,QAAT,KAAsB,QAA7B;AACD,GAFD;;AAGF,SAAA,OAAA;AA7IwB,CAAJ,EAAA,GAAP;;ACZb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChVA,IAAM,UAAU,GAAG,UAAnB;AAEA;;;;;;;;AAOA,IAAY,QAAZ;;AAAA,CAAA,UAAY,QAAZ,EAAoB;AAChB,EAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAA,QAAA,CAAA,QAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;AACH,CALD,EAAY,QAAQ,GAAR,OAAA,CAAA,QAAA,KAAA,OAAA,CAAA,QAAA,GAAQ,EAAR,CAAZ;;AAOA,IAAA,MAAA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","file":"peerjs.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: 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 = [];\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 = 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 = (\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 = 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 = 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 {\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 = 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 {\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 {\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 {\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 jsonStringify: (data: any) => string = JSON.stringify;\n jsonParse: (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.jsonParse(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.jsonStringify(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 {\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 {\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 \"team@peerjs.com 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 = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map = 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 \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 team@peerjs.com 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(window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(window).Peer = Peer;\n"]} \ No newline at end of file diff --git a/dist/peerjs.min.js b/dist/peerjs.min.js index dbf513713..7c4b30126 100644 --- a/dist/peerjs.min.js +++ b/dist/peerjs.min.js @@ -59,7 +59,7 @@ var t=require("./bufferbuilder").BufferBuilder,e=require("./bufferbuilder").bina },{"./util":"BHXf","./logger":"8WOs","./negotiator":"HCdX","./enums":"9ZRY","./baseconnection":"tQFK"}],"GGp6":[function(require,module,exports) { "use strict";var e=this&&this.__extends||function(){var e=function(t,r){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(t,r)};return function(t,r){function o(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(o.prototype=r.prototype,new o)}}(),t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});var r=require("eventemitter3"),o=t(require("./logger")),n=function(t){function r(){var e=t.call(this)||this;return e.fileReader=new FileReader,e._queue=[],e._processing=!1,e.fileReader.onload=function(t){e._processing=!1,t.target&&e.emit("done",t.target.result),e.doNextTask()},e.fileReader.onerror=function(t){o.default.error("EncodingQueue error:",t),e._processing=!1,e.destroy(),e.emit("error",t)},e}return e(r,t),Object.defineProperty(r.prototype,"queue",{get:function(){return this._queue},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"size",{get:function(){return this.queue.length},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"processing",{get:function(){return this._processing},enumerable:!0,configurable:!0}),r.prototype.enque=function(e){this.queue.push(e),this.processing||this.doNextTask()},r.prototype.destroy=function(){this.fileReader.abort(),this._queue=[]},r.prototype.doNextTask=function(){0!==this.size&&(this.processing||(this._processing=!0,this.fileReader.readAsArrayBuffer(this.queue.shift())))},r}(r.EventEmitter);exports.EncodingQueue=n; },{"eventemitter3":"2JJl","./logger":"8WOs"}],"GBTQ":[function(require,module,exports) { -"use strict";var e=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),t=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],i=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});var i=require("./util"),o=n(require("./logger")),r=require("./negotiator"),a=require("./enums"),s=require("./baseconnection"),u=require("./encodingQueue"),l=function(n){function s(e,t,l){var f=n.call(this,e,t,l)||this;return f._buffer=[],f._bufferSize=0,f._buffering=!1,f._chunkedData={},f._encodingQueue=new u.EncodingQueue,f.connectionId=f.options.connectionId||s.ID_PREFIX+i.util.randomToken(),f.label=f.options.label||f.connectionId,f.serialization=f.options.serialization||a.SerializationType.Binary,f.reliable=!!f.options.reliable,f._encodingQueue.on("done",function(e){f._bufferedSend(e)}),f._encodingQueue.on("error",function(){o.default.error("DC#"+f.connectionId+": Error occured in encoding from blob to arraybuffer, close DC"),f.close()}),f._negotiator=new r.Negotiator(f),f._negotiator.startConnection(f.options._payload||{originator:!0}),f}return e(s,n),Object.defineProperty(s.prototype,"type",{get:function(){return a.ConnectionType.Data},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"dataChannel",{get:function(){return this._dc},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"bufferSize",{get:function(){return this._bufferSize},enumerable:!0,configurable:!0}),s.prototype.initialize=function(e){this._dc=e,this._configureDataChannel()},s.prototype._configureDataChannel=function(){var e=this;i.util.supports.binaryBlob&&!i.util.supports.reliable||(this.dataChannel.binaryType="arraybuffer"),this.dataChannel.onopen=function(){o.default.log("DC#"+e.connectionId+" dc connection success"),e._open=!0,e.emit(a.ConnectionEventType.Open)},this.dataChannel.onmessage=function(t){o.default.log("DC#"+e.connectionId+" dc onmessage:",t.data),e._handleDataMessage(t)},this.dataChannel.onclose=function(){o.default.log("DC#"+e.connectionId+" dc closed for:",e.peer),e.close()}},s.prototype._handleDataMessage=function(e){var t=this,o=e.data,r=o.constructor,s=o;if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){if(r===Blob)return void i.util.blobToArrayBuffer(o,function(e){var n=i.util.unpack(e);t.emit(a.ConnectionEventType.Data,n)});if(r===ArrayBuffer)s=i.util.unpack(o);else if(r===String){var u=i.util.binaryStringToArrayBuffer(o);s=i.util.unpack(u)}}else this.serialization===a.SerializationType.JSON&&(s=JSON.parse(o));s.__peerData?this._handleChunk(s):n.prototype.emit.call(this,a.ConnectionEventType.Data,s)},s.prototype._handleChunk=function(e){var t=e.__peerData,n=this._chunkedData[t]||{data:[],count:0,total:e.total};if(n.data[e.n]=e.data,n.count++,this._chunkedData[t]=n,n.total===n.count){delete this._chunkedData[t];var i=new Blob(n.data);this._handleDataMessage({data:i})}},s.prototype.close=function(){this._buffer=[],this._bufferSize=0,this._chunkedData={},this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this.provider&&(this.provider._removeConnection(this),this.provider=null),this.dataChannel&&(this.dataChannel.onopen=null,this.dataChannel.onmessage=null,this.dataChannel.onclose=null,this._dc=null),this._encodingQueue&&(this._encodingQueue.destroy(),this._encodingQueue.removeAllListeners(),this._encodingQueue=null),this.open&&(this._open=!1,n.prototype.emit.call(this,a.ConnectionEventType.Close))},s.prototype.send=function(e,t){if(this.open)if(this.serialization===a.SerializationType.JSON)this._bufferedSend(JSON.stringify(e));else if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){var o=i.util.pack(e);if(!t&&o.size>i.util.chunkedMTU)return void this._sendChunks(o);i.util.supports.binaryBlob?this._bufferedSend(o):this._encodingQueue.enque(o)}else this._bufferedSend(e);else n.prototype.emit.call(this,a.ConnectionEventType.Error,new Error("Connection is not open. You should listen for the `open` event before sending messages."))},s.prototype._bufferedSend=function(e){!this._buffering&&this._trySend(e)||(this._buffer.push(e),this._bufferSize=this._buffer.length)},s.prototype._trySend=function(e){var t=this;if(!this.open)return!1;if(this.dataChannel.bufferedAmount>s.MAX_BUFFERED_AMOUNT)return this._buffering=!0,setTimeout(function(){t._buffering=!1,t._tryBuffer()},50),!1;try{this.dataChannel.send(e)}catch(n){return o.default.error("DC#:"+this.connectionId+" Error when sending:",n),this._buffering=!0,this.close(),!1}return!0},s.prototype._tryBuffer=function(){if(this.open&&0!==this._buffer.length){var e=this._buffer[0];this._trySend(e)&&(this._buffer.shift(),this._bufferSize=this._buffer.length,this._tryBuffer())}},s.prototype._sendChunks=function(e){var n,r,a=i.util.chunk(e);o.default.log("DC#"+this.connectionId+" Try to send "+a.length+" chunks...");try{for(var s=t(a),u=s.next();!u.done;u=s.next()){var l=u.value;this.send(l,!0)}}catch(f){n={error:f}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}},s.prototype.handleMessage=function(e){var t=e.payload;switch(e.type){case a.ServerMessageType.Answer:this._negotiator.handleSDP(e.type,t.sdp);break;case a.ServerMessageType.Candidate:this._negotiator.handleCandidate(t.candidate);break;default:o.default.warn("Unrecognized message type:",e.type,"from peer:",this.peer)}},s.ID_PREFIX="dc_",s.MAX_BUFFERED_AMOUNT=8388608,s}(s.BaseConnection);exports.DataConnection=l; +"use strict";var e=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(t,n)};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),t=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],i=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});var i=require("./util"),o=n(require("./logger")),r=require("./negotiator"),a=require("./enums"),s=require("./baseconnection"),u=require("./encodingQueue"),l=function(n){function s(e,t,l){var f=n.call(this,e,t,l)||this;return f.jsonStringify=JSON.stringify,f.jsonParse=JSON.parse,f._buffer=[],f._bufferSize=0,f._buffering=!1,f._chunkedData={},f._encodingQueue=new u.EncodingQueue,f.connectionId=f.options.connectionId||s.ID_PREFIX+i.util.randomToken(),f.label=f.options.label||f.connectionId,f.serialization=f.options.serialization||a.SerializationType.Binary,f.reliable=!!f.options.reliable,f._encodingQueue.on("done",function(e){f._bufferedSend(e)}),f._encodingQueue.on("error",function(){o.default.error("DC#"+f.connectionId+": Error occured in encoding from blob to arraybuffer, close DC"),f.close()}),f._negotiator=new r.Negotiator(f),f._negotiator.startConnection(f.options._payload||{originator:!0}),f}return e(s,n),Object.defineProperty(s.prototype,"type",{get:function(){return a.ConnectionType.Data},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"dataChannel",{get:function(){return this._dc},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"bufferSize",{get:function(){return this._bufferSize},enumerable:!0,configurable:!0}),s.prototype.initialize=function(e){this._dc=e,this._configureDataChannel()},s.prototype._configureDataChannel=function(){var e=this;i.util.supports.binaryBlob&&!i.util.supports.reliable||(this.dataChannel.binaryType="arraybuffer"),this.dataChannel.onopen=function(){o.default.log("DC#"+e.connectionId+" dc connection success"),e._open=!0,e.emit(a.ConnectionEventType.Open)},this.dataChannel.onmessage=function(t){o.default.log("DC#"+e.connectionId+" dc onmessage:",t.data),e._handleDataMessage(t)},this.dataChannel.onclose=function(){o.default.log("DC#"+e.connectionId+" dc closed for:",e.peer),e.close()}},s.prototype._handleDataMessage=function(e){var t=this,o=e.data,r=o.constructor,s=o;if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){if(r===Blob)return void i.util.blobToArrayBuffer(o,function(e){var n=i.util.unpack(e);t.emit(a.ConnectionEventType.Data,n)});if(r===ArrayBuffer)s=i.util.unpack(o);else if(r===String){var u=i.util.binaryStringToArrayBuffer(o);s=i.util.unpack(u)}}else this.serialization===a.SerializationType.JSON&&(s=this.jsonParse(o));s.__peerData?this._handleChunk(s):n.prototype.emit.call(this,a.ConnectionEventType.Data,s)},s.prototype._handleChunk=function(e){var t=e.__peerData,n=this._chunkedData[t]||{data:[],count:0,total:e.total};if(n.data[e.n]=e.data,n.count++,this._chunkedData[t]=n,n.total===n.count){delete this._chunkedData[t];var i=new Blob(n.data);this._handleDataMessage({data:i})}},s.prototype.close=function(){this._buffer=[],this._bufferSize=0,this._chunkedData={},this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this.provider&&(this.provider._removeConnection(this),this.provider=null),this.dataChannel&&(this.dataChannel.onopen=null,this.dataChannel.onmessage=null,this.dataChannel.onclose=null,this._dc=null),this._encodingQueue&&(this._encodingQueue.destroy(),this._encodingQueue.removeAllListeners(),this._encodingQueue=null),this.open&&(this._open=!1,n.prototype.emit.call(this,a.ConnectionEventType.Close))},s.prototype.send=function(e,t){if(this.open)if(this.serialization===a.SerializationType.JSON)this._bufferedSend(this.jsonStringify(e));else if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){var o=i.util.pack(e);if(!t&&o.size>i.util.chunkedMTU)return void this._sendChunks(o);i.util.supports.binaryBlob?this._bufferedSend(o):this._encodingQueue.enque(o)}else this._bufferedSend(e);else n.prototype.emit.call(this,a.ConnectionEventType.Error,new Error("Connection is not open. You should listen for the `open` event before sending messages."))},s.prototype._bufferedSend=function(e){!this._buffering&&this._trySend(e)||(this._buffer.push(e),this._bufferSize=this._buffer.length)},s.prototype._trySend=function(e){var t=this;if(!this.open)return!1;if(this.dataChannel.bufferedAmount>s.MAX_BUFFERED_AMOUNT)return this._buffering=!0,setTimeout(function(){t._buffering=!1,t._tryBuffer()},50),!1;try{this.dataChannel.send(e)}catch(n){return o.default.error("DC#:"+this.connectionId+" Error when sending:",n),this._buffering=!0,this.close(),!1}return!0},s.prototype._tryBuffer=function(){if(this.open&&0!==this._buffer.length){var e=this._buffer[0];this._trySend(e)&&(this._buffer.shift(),this._bufferSize=this._buffer.length,this._tryBuffer())}},s.prototype._sendChunks=function(e){var n,r,a=i.util.chunk(e);o.default.log("DC#"+this.connectionId+" Try to send "+a.length+" chunks...");try{for(var s=t(a),u=s.next();!u.done;u=s.next()){var l=u.value;this.send(l,!0)}}catch(f){n={error:f}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}},s.prototype.handleMessage=function(e){var t=e.payload;switch(e.type){case a.ServerMessageType.Answer:this._negotiator.handleSDP(e.type,t.sdp);break;case a.ServerMessageType.Candidate:this._negotiator.handleCandidate(t.candidate);break;default:o.default.warn("Unrecognized message type:",e.type,"from peer:",this.peer)}},s.ID_PREFIX="dc_",s.MAX_BUFFERED_AMOUNT=8388608,s}(s.BaseConnection);exports.DataConnection=l; },{"./util":"BHXf","./logger":"8WOs","./negotiator":"HCdX","./enums":"9ZRY","./baseconnection":"tQFK","./encodingQueue":"GGp6"}],"in7L":[function(require,module,exports) { "use strict";var t=this&&this.__awaiter||function(t,e,r,o){return new(r||(r=Promise))(function(n,s){function i(t){try{a(o.next(t))}catch(e){s(e)}}function u(t){try{a(o.throw(t))}catch(e){s(e)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(i,u)}a((o=o.apply(t,e||[])).next())})},e=this&&this.__generator||function(t,e){var r,o,n,s,i={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return s={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function u(s){return function(u){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,o&&(n=2&s[0]?o.return:s[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,s[1])).done)return n;switch(o=0,n&&(s=[2&s[0],n.value]),s[0]){case 0:case 1:n=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(n=(n=i.trys).length>0&&n[n.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1] 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: 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 = [];\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 = 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 = (\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 = 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 = 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 {\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 = 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 {\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 {\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 {\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';\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport class DataConnection extends BaseConnection {\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\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 = JSON.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(JSON.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 {\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 {\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 \"team@peerjs.com 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 = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map = 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 \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 team@peerjs.com 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(window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(window).Peer = Peer;\n"]} \ No newline at end of file +{"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: 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 = [];\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 = 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 = (\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 = 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 = 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 {\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 = 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 {\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 {\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 {\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 jsonStringify: (data: any) => string = JSON.stringify;\n jsonParse: (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.jsonParse(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.jsonStringify(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 {\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 {\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 \"team@peerjs.com 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 = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map = 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 \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 team@peerjs.com 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(window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(window).Peer = Peer;\n"]} \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index f7deee0ee..f25e0dc6c 100644 --- a/index.d.ts +++ b/index.d.ts @@ -175,6 +175,8 @@ declare namespace Peer { serialization: string; type: string; bufferSize: number; + stringify: (data: any) => string; + parse: (data: string) => any; } interface MediaConnection { diff --git a/lib/dataconnection.ts b/lib/dataconnection.ts index 36848d9f2..aec3c054b 100644 --- a/lib/dataconnection.ts +++ b/lib/dataconnection.ts @@ -11,11 +11,12 @@ import { Peer } from "./peer"; import { BaseConnection } from "./baseconnection"; import { ServerMessage } from "./servermessage"; import { EncodingQueue } from './encodingQueue'; +import { DataConnection as IDataConnection } from '../index'; /** * Wraps a DataChannel between two Peers. */ -export class DataConnection extends BaseConnection { +export class DataConnection extends BaseConnection implements IDataConnection { private static readonly ID_PREFIX = "dc_"; private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024; @@ -23,6 +24,8 @@ export class DataConnection extends BaseConnection { readonly label: string; readonly serialization: SerializationType; readonly reliable: boolean; + stringify: (data: any) => string = JSON.stringify; + parse: (data: string) => any = JSON.parse; get type() { return ConnectionType.Data; @@ -129,7 +132,7 @@ export class DataConnection extends BaseConnection { deserializedData = util.unpack(ab); } } else if (this.serialization === SerializationType.JSON) { - deserializedData = JSON.parse(data as string); + deserializedData = this.parse(data as string); } // Check if we've chunked--if so, piece things back together. @@ -208,7 +211,7 @@ export class DataConnection extends BaseConnection { } /** Allows user to send data. */ - send(data: any, chunked: boolean): void { + send(data: any, chunked?: boolean): void { if (!this.open) { super.emit( ConnectionEventType.Error, @@ -220,7 +223,7 @@ export class DataConnection extends BaseConnection { } if (this.serialization === SerializationType.JSON) { - this._bufferedSend(JSON.stringify(data)); + this._bufferedSend(this.stringify(data)); } else if ( this.serialization === SerializationType.Binary || this.serialization === SerializationType.BinaryUTF8