{"version":3,"sources":["webpack:///./src/assets/js/adapter.js"],"names":["f","exports","module","define","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","SDPUtils","Math","random","toString","substr","localCName","generateIdentifier","splitLines","blob","trim","split","map","line","splitSections","parts","part","index","getDescription","sections","getMediaSections","shift","matchPrefix","prefix","filter","indexOf","parseCandidate","substring","candidate","foundation","component","parseInt","protocol","toLowerCase","priority","ip","port","type","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","sdp","push","toUpperCase","join","parseIceOptions","parseRtpMap","parsed","payloadType","name","clockRate","numChannels","writeRtpMap","codec","pt","undefined","preferredPayloadType","parseExtmap","id","direction","uri","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","Object","keys","params","forEach","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","value","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","getIceParameters","concat","iceParameters","password","writeIceParameters","parseRtpParameters","description","codecs","headerExtensions","fecMechanisms","rtcp","mline","rtpmapline","fmtps","writeRtpDescription","kind","caps","maxptime","extension","parseRtpEncodingParameters","secondarySsrc","encodingParameters","hasRed","hasUlpfec","ssrcs","primarySsrc","flows","apt","encParam","codecPayloadType","rtx","JSON","parse","stringify","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","obj","cname","rsize","reducedSize","compound","mux","parseMsid","spec","stream","track","planB","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessionId","version","writeMediaSection","transceiver","iceGatherer","getLocalParameters","dtlsTransport","rtpSender","rtpReceiver","msid","sendEncodingParameters","getDirection","getKind","isRejected","parseMLine","fmt","slice","parseOLine","username","sessionVersion","netType","addressType","address","2","dtlsRole","trackId","_initialTrackId","filterIceServers","iceServers","edgeVersion","hasTurn","server","urls","url","console","warn","isString","validTurn","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","findCodecByPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","rCodec","min","lHeaderExtension","rHeaderExtension","isActionAllowedInSignalingState","action","signalingState","offer","setLocalDescription","setRemoteDescription","answer","maybeAddCandidate","iceTransport","alreadyAdded","getRemoteCandidates","find","remoteCandidate","addRemoteCandidate","makeError","NotSupportedError","InvalidStateError","InvalidAccessError","TypeError","OperationError","window","addTrackToStreamAndFireEvent","addTrack","dispatchEvent","MediaStreamTrackEvent","removeTrackFromStreamAndFireEvent","removeTrack","fireAddTrack","pc","receiver","streams","trackEvent","Event","setTimeout","_dispatchEvent","RTCPeerConnection","config","this","_eventTarget","document","createDocumentFragment","method","bind","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","localDescription","remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","prototype","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","event","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","_maybeFireNegotiationNeeded","RTCRtpSender","addStream","getTracks","clonedStream","clone","idx","clonedTrack","addEventListener","enabled","sender","stop","splice","removeStream","getSenders","getReceivers","_createIceGatherer","sdpMLineIndex","defineProperty","writable","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","removeEventListener","evt","sdpMid","cand","serializedCandidate","assign","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","encodings","p","receive","Promise","reject","isIceLite","rejected","remoteIceParameters","remoteDtlsParameters","start","_updateSignalingState","resolve","receiverList","iceOptions","remoteMsid","isComplete","cands","setTransport","setRemoteCandidates","MediaStream","default","RTCRtpReceiver","getCapabilities","isNewTrack","get","nativeTrack","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","desc","RTCSessionDescription","createAnswer","mediaSectionsInOffer","localTrack","getAudioTracks","getVideoTracks","hasRtx","c","addIceCandidate","candidateString","getStats","promises","fixStatsType","stat","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","results","Map","all","then","res","result","set","methods","nativeMethod","args","apply","error","3","4","global","adapterFactory","self","5","utils","dependencies","opts","options","shimChrome","shimFirefox","shimEdge","shimSafari","key","hasOwnProperty","logging","log","browserDetails","detectBrowser","chromeShim","edgeShim","firefoxShim","safariShim","commonShim","adapter","extractVersion","disableLog","disableWarnings","browser","shimPeerConnection","browserShim","shimCreateObjectURL","shimGetUserMedia","shimMediaStream","shimSourceObject","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimRTCIceCandidate","shimMaxMessageSize","shimSendThrowTypeError","shimRemoveStream","shimReplaceTrack","shimRTCIceServerUrls","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimCreateOfferLegacy","6","webkitMediaStream","_ontrack","origSetRemoteDescription","_ontrackpoly","te","wrapPeerConnectionEvent","shimSenderWithDtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","senders","URL","HTMLMediaElement","_srcObject","src","revokeObjectURL","createObjectURL","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","DOMException","existingSenders","newSenders","newSender","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","replace","RegExp","replaceExternalStreamId","oldStream","isLegacyCall","err","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","OrigPeerConnection","newIceServers","deprecated","origGetStats","selector","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","stats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","7","navigator","constraintsToChrome_","cc","ideal","exact","max","oldname_","charAt","oc","mix","advanced","shimConstraints_","constraints","func","audio","remap","b","video","face","facingMode","matches","getSupportedFacingModeLies","mediaDevices","getSupportedConstraints","enumerateDevices","devices","d","dev","some","match","label","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia_","onSuccess","onError","webkitGetUserMedia","getUserMedia","getUserMediaPromise_","kinds","MediaStreamTrack","getSources","device","groupId","echoCancellation","frameRate","height","width","origGetUserMedia","cs","8","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","toJSON","nativeCreateObjectURL","nativeRevokeObjectURL","newId","delete","dsc","srcObject","nativeSetAttribute","setAttribute","RTCSctpTransport","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","origCreateDataChannel","createDataChannel","dataChannel","origDataChannelSend","dc","data","size","byteLength","9","shimRTCPeerConnection","origMSTEnabled","ev","RTCDtmfSender","replaceTrack","setTrack","10","catch","11","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","12","InternalError","SecurityError","constraintsToFF37_","mozGetUserMedia","infos","orgEnumerateDevices","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","13","_localStreams","getStreamById","_remoteStreams","_addTrack","tracks","_onaddstream","_onaddstreampoly","failureCallback","withCallback","cb","errcb","RTCTransceiver","origCreateOffer","audioTransceiver","getTransceivers","setDirection","addTransceiver","videoTransceiver","14","logDisabled_","deprecationWarnings_","uastring","expr","pos","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","wrappedCallback","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","oldMethod","newMethod","userAgent"],"mappings":"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","file":"static/js/chunk-2d0c430e.6de14f3d.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.adapter = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 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 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.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); // was: relAddr\n sdp.push('rport');\n sdp.push(candidate.relatedPort); // was: relPort\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(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 // was: channels\n parsed.numChannels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\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 return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (codec.numChannels !== 1 ? '/' + codec.numChannels : '') + '\\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 params.push(param + '=' + codec.parameters[param]);\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\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 caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\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.split(' ');\n parts.shift();\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 rtx: {\n ssrc: secondarySsrc\n }\n };\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: secondarySsrc,\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 var cname;\n // Gets the first SSRC. Note that 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(parts) {\n return parts.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// 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\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=thisisadapterortc ' + sessionId + ' ' + version + ' 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// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n\n},{}],2:[function(require,module,exports){\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 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 // 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 var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n event.candidate.candidate = serializedCandidate;\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 ((kind === 'application' && protocol === 'DTLS/SCTP') || rejected) {\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 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 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 states[transceiver.iceTransport.state]++;\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 states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\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 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 sdp += 'm=application 0 DTLS/SCTP 5000\\r\\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 = 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() {\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 var fixStatsType = function(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 return new Promise(function(resolve) {\n // shim getStats with maplike support\n var results = new Map();\n Promise.all(promises).then(function(res) {\n res.forEach(function(result) {\n Object.keys(result).forEach(function(id) {\n result[id].type = fixStatsType(result[id]);\n results.set(id, result[id]);\n });\n });\n resolve(results);\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},{\"sdp\":1}],3:[function(require,module,exports){\narguments[4][1][0].apply(exports,arguments)\n},{\"dup\":1}],4:[function(require,module,exports){\n(function (global){\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\nvar adapterFactory = require('./adapter_factory.js');\nmodule.exports = adapterFactory({window: global.window});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./adapter_factory.js\":5}],5:[function(require,module,exports){\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\nvar utils = require('./utils');\n// Shimming starts here.\nmodule.exports = function(dependencies, opts) {\n var window = dependencies && dependencies.window;\n\n var options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n };\n\n for (var key in opts) {\n if (hasOwnProperty.call(opts, key)) {\n options[key] = opts[key];\n }\n }\n\n // Utils.\n var logging = utils.log;\n var browserDetails = utils.detectBrowser(window);\n\n // Uncomment the line below if you want logging to occur, including logging\n // for the switch statement below. Can also be turned on in the browser via\n // adapter.disableLog(false), but then logging from the switch statement below\n // will not appear.\n // require('./utils').disableLog(false);\n\n // Browser shims.\n var chromeShim = require('./chrome/chrome_shim') || null;\n var edgeShim = require('./edge/edge_shim') || null;\n var firefoxShim = require('./firefox/firefox_shim') || null;\n var safariShim = require('./safari/safari_shim') || null;\n var commonShim = require('./common_shim') || null;\n\n // Export to the adapter global object visible in the browser.\n var adapter = {\n browserDetails: browserDetails,\n commonShim: 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 commonShim.shimCreateObjectURL(window);\n\n chromeShim.shimGetUserMedia(window);\n chromeShim.shimMediaStream(window);\n chromeShim.shimSourceObject(window);\n chromeShim.shimPeerConnection(window);\n chromeShim.shimOnTrack(window);\n chromeShim.shimAddTrackRemoveTrack(window);\n chromeShim.shimGetSendersWithDtmf(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(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 commonShim.shimCreateObjectURL(window);\n\n firefoxShim.shimGetUserMedia(window);\n firefoxShim.shimSourceObject(window);\n firefoxShim.shimPeerConnection(window);\n firefoxShim.shimOnTrack(window);\n firefoxShim.shimRemoveStream(window);\n\n commonShim.shimRTCIceCandidate(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 commonShim.shimCreateObjectURL(window);\n\n edgeShim.shimGetUserMedia(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 commonShim.shimCreateObjectURL(window);\n\n safariShim.shimRTCIceServerUrls(window);\n safariShim.shimCallbacksAPI(window);\n safariShim.shimLocalStreamsAPI(window);\n safariShim.shimRemoteStreamsAPI(window);\n safariShim.shimTrackEventTransceiver(window);\n safariShim.shimGetUserMedia(window);\n safariShim.shimCreateOfferLegacy(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n};\n\n},{\"./chrome/chrome_shim\":6,\"./common_shim\":8,\"./edge/edge_shim\":9,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":13,\"./utils\":14}],6:[function(require,module,exports){\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';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\nmodule.exports = {\n shimGetUserMedia: require('./getusermedia'),\n shimMediaStream: function(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n },\n\n shimOnTrack: function(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get: function() {\n return this._ontrack;\n },\n set: function(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n }\n });\n var origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n var pc = this;\n if (!pc._ontrackpoly) {\n pc._ontrackpoly = function(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', function(te) {\n var receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = pc.getReceivers().find(function(r) {\n return r.track && r.track.id === te.track.id;\n });\n } else {\n receiver = {track: te.track};\n }\n\n var event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver: receiver};\n event.streams = [e.stream];\n pc.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(function(track) {\n var receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = pc.getReceivers().find(function(r) {\n return r.track && r.track.id === track.id;\n });\n } else {\n receiver = {track: track};\n }\n var event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver: receiver};\n event.streams = [e.stream];\n pc.dispatchEvent(event);\n });\n };\n pc.addEventListener('addstream', pc._ontrackpoly);\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n } else if (!('RTCRtpTransceiver' in window)) {\n utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n if (!e.transceiver) {\n e.transceiver = {receiver: e.receiver};\n }\n return e;\n });\n }\n },\n\n shimGetSendersWithDtmf: function(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 var shimSenderWithDtmf = function(pc, track) {\n return {\n track: 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() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n var pc = this;\n var sender = origAddTrack.apply(pc, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(pc, track);\n pc._senders.push(sender);\n }\n return sender;\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n var pc = this;\n origRemoveTrack.apply(pc, arguments);\n var idx = pc._senders.indexOf(sender);\n if (idx !== -1) {\n pc._senders.splice(idx, 1);\n }\n };\n }\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n pc._senders = pc._senders || [];\n origAddStream.apply(pc, [stream]);\n stream.getTracks().forEach(function(track) {\n pc._senders.push(shimSenderWithDtmf(pc, track));\n });\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n pc._senders = pc._senders || [];\n origRemoveStream.apply(pc, [stream]);\n\n stream.getTracks().forEach(function(track) {\n var sender = pc._senders.find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender\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 var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function() {\n var pc = this;\n var senders = origGetSenders.apply(pc, []);\n senders.forEach(function(sender) {\n sender._pc = pc;\n });\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function() {\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\n shimSourceObject: function(window) {\n var URL = window && window.URL;\n\n if (typeof window === 'object') {\n if (window.HTMLMediaElement &&\n !('srcObject' in window.HTMLMediaElement.prototype)) {\n // Shim the srcObject property, once, when HTMLMediaElement is found.\n Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n get: function() {\n return this._srcObject;\n },\n set: function(stream) {\n var self = this;\n // Use _srcObject as a private property for this shim\n this._srcObject = stream;\n if (this.src) {\n URL.revokeObjectURL(this.src);\n }\n\n if (!stream) {\n this.src = '';\n return undefined;\n }\n this.src = URL.createObjectURL(stream);\n // We need to recreate the blob url when a track is added or\n // removed. Doing it manually since we want to avoid a recursion.\n stream.addEventListener('addtrack', function() {\n if (self.src) {\n URL.revokeObjectURL(self.src);\n }\n self.src = URL.createObjectURL(stream);\n });\n stream.addEventListener('removetrack', function() {\n if (self.src) {\n URL.revokeObjectURL(self.src);\n }\n self.src = URL.createObjectURL(stream);\n });\n }\n });\n }\n }\n },\n\n shimAddTrackRemoveTrackWithNative: function(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 = function() {\n var pc = this;\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams).map(function(streamId) {\n return pc._shimmedLocalStreams[streamId][0];\n });\n };\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n var 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 var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(function(track) {\n var alreadyExists = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n var existingSenders = pc.getSenders();\n origAddStream.apply(this, arguments);\n var newSenders = pc.getSenders().filter(function(newSender) {\n return existingSenders.indexOf(newSender) === -1;\n });\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n var pc = this;\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(function(streamId) {\n var idx = pc._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n pc._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (pc._shimmedLocalStreams[streamId].length === 1) {\n delete pc._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n },\n\n shimAddTrackRemoveTrack: function(window) {\n var browserDetails = utils.detectBrowser(window);\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return this.shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n var origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams = function() {\n var pc = this;\n var nativeStreams = origGetLocalStreams.apply(this);\n pc._reverseStreams = pc._reverseStreams || {};\n return nativeStreams.map(function(stream) {\n return pc._reverseStreams[stream.id];\n });\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n pc._streams = pc._streams || {};\n pc._reverseStreams = pc._reverseStreams || {};\n\n stream.getTracks().forEach(function(track) {\n var alreadyExists = pc.getSenders().find(function(s) {\n return s.track === track;\n });\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 (!pc._reverseStreams[stream.id]) {\n var newStream = new window.MediaStream(stream.getTracks());\n pc._streams[stream.id] = newStream;\n pc._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(pc, [stream]);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n pc._streams = pc._streams || {};\n pc._reverseStreams = pc._reverseStreams || {};\n\n origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);\n delete pc._reverseStreams[(pc._streams[stream.id] ?\n pc._streams[stream.id].id : stream.id)];\n delete pc._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n var pc = this;\n if (pc.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n var streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(function(t) {\n return t === track;\n })) {\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 var alreadyExists = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n pc._streams = pc._streams || {};\n pc._reverseStreams = pc._reverseStreams || {};\n var oldStream = pc._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(function() {\n pc.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n var newStream = new window.MediaStream([track]);\n pc._streams[stream.id] = newStream;\n pc._reverseStreams[newStream.id] = stream;\n pc.addStream(newStream);\n }\n return pc.getSenders().find(function(s) {\n return s.track === track;\n });\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var 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: sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var 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: sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n var pc = this;\n var args = arguments;\n var isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(pc, [\n function(description) {\n var desc = replaceInternalStreamId(pc, description);\n args[0].apply(null, [desc]);\n },\n function(err) {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(pc, arguments)\n .then(function(description) {\n return replaceInternalStreamId(pc, description);\n });\n };\n });\n\n var origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription = function() {\n var pc = this;\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(pc, arguments);\n }\n arguments[0] = replaceExternalStreamId(pc, arguments[0]);\n return origSetLocalDescription.apply(pc, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n var origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get: function() {\n var pc = this;\n var description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(pc, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n var pc = this;\n if (pc.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 var isLocal = sender._pc === pc;\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 pc._streams = pc._streams || {};\n var stream;\n Object.keys(pc._streams).forEach(function(streamid) {\n var hasTrack = pc._streams[streamid].getTracks().find(function(track) {\n return sender.track === track;\n });\n if (hasTrack) {\n stream = pc._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 pc.removeStream(pc._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n pc.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n },\n\n shimPeerConnection: function(window) {\n var browserDetails = utils.detectBrowser(window);\n\n // The RTCPeerConnection object.\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n // Translate iceTransportPolicy to iceTransports,\n // see https://code.google.com/p/webrtc/issues/detail?id=4869\n // this was fixed in M56 along with unprefixing RTCPeerConnection.\n logging('PeerConnection');\n if (pcConfig && pcConfig.iceTransportPolicy) {\n pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n }\n\n return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype =\n window.webkitRTCPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if (window.webkitRTCPeerConnection.generateCertificate) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return window.webkitRTCPeerConnection.generateCertificate;\n }\n });\n }\n } else {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n var OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var 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 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 Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n\n var origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function(selector,\n successCallback, errorCallback) {\n var pc = this;\n var args = 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 arguments[0] !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n var fixChromeStats_ = function(response) {\n var standardReport = {};\n var reports = response.result();\n reports.forEach(function(report) {\n var 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(function(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 var makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(function(key) {\n return [key, stats[key]];\n }));\n };\n\n if (arguments.length >= 2) {\n var successCallbackWrapper_ = function(response) {\n args[1](makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n arguments[0]]);\n }\n\n // promise-support\n return new Promise(function(resolve, reject) {\n origGetStats.apply(pc, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(successCallback, errorCallback);\n };\n\n // add promise support -- natively available in Chrome 51\n if (browserDetails.version < 51) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n var pc = this;\n var promise = new Promise(function(resolve, reject) {\n nativeMethod.apply(pc, [args[0], resolve, reject]);\n });\n if (args.length < 2) {\n return promise;\n }\n return promise.then(function() {\n args[1].apply(null, []);\n },\n function(err) {\n if (args.length >= 3) {\n args[2].apply(null, [err]);\n }\n });\n };\n });\n }\n\n // promise support for createOffer and createAnswer. Available (without\n // bugs) since M52: crbug/619289\n if (browserDetails.version < 52) {\n ['createOffer', 'createAnswer'].forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n var pc = this;\n if (arguments.length < 1 || (arguments.length === 1 &&\n typeof arguments[0] === 'object')) {\n var opts = arguments.length === 1 ? arguments[0] : undefined;\n return new Promise(function(resolve, reject) {\n nativeMethod.apply(pc, [resolve, reject, opts]);\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // support for addIceCandidate(null or undefined)\n var nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n }\n};\n\n},{\"../utils.js\":14,\"./getusermedia\":7}],7:[function(require,module,exports){\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';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n var browserDetails = utils.detectBrowser(window);\n var navigator = window && window.navigator;\n\n var constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n var cc = {};\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var 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 var 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 var 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(function(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 var 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 var 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 var face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n var 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 var 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(function(devices) {\n devices = devices.filter(function(d) {\n return d.kind === 'videoinput';\n });\n var dev = devices.find(function(d) {\n return matches.some(function(match) {\n return d.label.toLowerCase().indexOf(match) !== -1;\n });\n });\n if (!dev && devices.length && matches.indexOf('back') !== -1) {\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 var shimError_ = function(e) {\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.constraintName,\n toString: function() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n var getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, function(c) {\n navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n\n navigator.getUserMedia = getUserMedia_;\n\n // Returns the result of getUserMedia as a Promise.\n var getUserMediaPromise_ = function(constraints) {\n return new Promise(function(resolve, reject) {\n navigator.getUserMedia(constraints, resolve, reject);\n });\n };\n\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {\n getUserMedia: getUserMediaPromise_,\n enumerateDevices: function() {\n return new Promise(function(resolve) {\n var kinds = {audio: 'audioinput', video: 'videoinput'};\n return window.MediaStreamTrack.getSources(function(devices) {\n resolve(devices.map(function(device) {\n return {label: device.label,\n kind: kinds[device.kind],\n deviceId: device.id,\n groupId: ''};\n }));\n });\n });\n },\n getSupportedConstraints: function() {\n return {\n deviceId: true, echoCancellation: true, facingMode: true,\n frameRate: true, height: true, width: true\n };\n }\n };\n }\n\n // A shim for getUserMedia method on the mediaDevices object.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (!navigator.mediaDevices.getUserMedia) {\n navigator.mediaDevices.getUserMedia = function(constraints) {\n return getUserMediaPromise_(constraints);\n };\n } else {\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 var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, function(c) {\n return origGetUserMedia(c).then(function(stream) {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(function(track) {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, function(e) {\n return Promise.reject(shimError_(e));\n });\n });\n };\n }\n\n // Dummy devicechange event methods.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n navigator.mediaDevices.addEventListener = function() {\n logging('Dummy mediaDevices.addEventListener called.');\n };\n }\n if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n navigator.mediaDevices.removeEventListener = function() {\n logging('Dummy mediaDevices.removeEventListener called.');\n };\n }\n};\n\n},{\"../utils.js\":14}],8:[function(require,module,exports){\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');\nvar utils = require('./utils');\n\nmodule.exports = {\n shimRTCIceCandidate: function(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 && 'foundation' in\n window.RTCIceCandidate.prototype) {\n return;\n }\n\n var NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function(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 var nativeCandidate = new NativeRTCIceCandidate(args);\n var parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n var augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function() {\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', function(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\n // shimCreateObjectURL must be called before shimSourceObject to avoid loop.\n\n shimCreateObjectURL: function(window) {\n var URL = window && window.URL;\n\n if (!(typeof window === 'object' && window.HTMLMediaElement &&\n 'srcObject' in window.HTMLMediaElement.prototype &&\n URL.createObjectURL && URL.revokeObjectURL)) {\n // Only shim CreateObjectURL using srcObject if srcObject exists.\n return undefined;\n }\n\n var nativeCreateObjectURL = URL.createObjectURL.bind(URL);\n var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);\n var streams = new Map(), newId = 0;\n\n URL.createObjectURL = function(stream) {\n if ('getTracks' in stream) {\n var url = 'polyblob:' + (++newId);\n streams.set(url, stream);\n utils.deprecated('URL.createObjectURL(stream)',\n 'elem.srcObject = stream');\n return url;\n }\n return nativeCreateObjectURL(stream);\n };\n URL.revokeObjectURL = function(url) {\n nativeRevokeObjectURL(url);\n streams.delete(url);\n };\n\n var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,\n 'src');\n Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {\n get: function() {\n return dsc.get.apply(this);\n },\n set: function(url) {\n this.srcObject = streams.get(url) || null;\n return dsc.set.apply(this, [url]);\n }\n });\n\n var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;\n window.HTMLMediaElement.prototype.setAttribute = function() {\n if (arguments.length === 2 &&\n ('' + arguments[0]).toLowerCase() === 'src') {\n this.srcObject = streams.get(arguments[1]) || null;\n }\n return nativeSetAttribute.apply(this, arguments);\n };\n },\n\n shimMaxMessageSize: function(window) {\n if (window.RTCSctpTransport || !window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get: function() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n var sctpInDescription = function(description) {\n var sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(function(mediaSection) {\n var mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n var getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n var version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n var 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 var 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 {\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 }\n }\n return canSendMaxMessageSize;\n };\n\n var 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 var 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 var match = SDPUtils.matchPrefix(description.sdp, '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 var origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n var pc = this;\n pc._sctp = null;\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n var 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 var sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get: function() {\n return maxMessageSize;\n }\n });\n pc._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(pc, arguments);\n };\n },\n\n shimSendThrowTypeError: function(window) {\n if (!window.RTCPeerConnection) {\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 var origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel = function() {\n var pc = this;\n var dataChannel = origCreateDataChannel.apply(pc, arguments);\n var origDataChannelSend = dataChannel.send;\n\n // Patch 'send' method\n dataChannel.send = function() {\n var dc = this;\n var data = arguments[0];\n var length = data.length || data.size || data.byteLength;\n if (length > pc.sctp.maxMessageSize) {\n throw new DOMException('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)', 'TypeError');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n\n return dataChannel;\n };\n }\n};\n\n},{\"./utils\":14,\"sdp\":3}],9:[function(require,module,exports){\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\nvar utils = require('../utils');\nvar shimRTCPeerConnection = require('rtcpeerconnection-shim');\n\nmodule.exports = {\n shimGetUserMedia: require('./getusermedia'),\n shimPeerConnection: function(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function(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 var origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set: function(value) {\n origMSTEnabled.set.call(this, value);\n var 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: function() {\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\n window.RTCPeerConnection =\n shimRTCPeerConnection(window, browserDetails.version);\n },\n shimReplaceTrack: function(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\n},{\"../utils\":14,\"./getusermedia\":10,\"rtcpeerconnection-shim\":2}],10:[function(require,module,exports){\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\n// Expose public methods.\nmodule.exports = function(window) {\n var navigator = window && window.navigator;\n\n var shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString: function() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(function(e) {\n return Promise.reject(shimError_(e));\n });\n };\n};\n\n},{}],11:[function(require,module,exports){\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\nvar utils = require('../utils');\n\nmodule.exports = {\n shimGetUserMedia: require('./getusermedia'),\n shimOnTrack: function(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get: function() {\n return this._ontrack;\n },\n set: function(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n this.removeEventListener('addstream', this._ontrackpoly);\n }\n this.addEventListener('track', this._ontrack = f);\n this.addEventListener('addstream', this._ontrackpoly = function(e) {\n e.stream.getTracks().forEach(function(track) {\n var event = new Event('track');\n event.track = track;\n event.receiver = {track: track};\n event.transceiver = {receiver: event.receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n }.bind(this));\n }.bind(this));\n }\n });\n }\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: function() {\n return {receiver: this.receiver};\n }\n });\n }\n },\n\n shimSourceObject: function(window) {\n // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n if (typeof window === 'object') {\n if (window.HTMLMediaElement &&\n !('srcObject' in window.HTMLMediaElement.prototype)) {\n // Shim the srcObject property, once, when HTMLMediaElement is found.\n Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n get: function() {\n return this.mozSrcObject;\n },\n set: function(stream) {\n this.mozSrcObject = stream;\n }\n });\n }\n }\n },\n\n shimPeerConnection: function(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n // The RTCPeerConnection object.\n if (!window.RTCPeerConnection) {\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (browserDetails.version < 38) {\n // .urls is not supported in FF < 38.\n // create RTCIceServers with a single url.\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (server.hasOwnProperty('urls')) {\n for (var j = 0; j < server.urls.length; j++) {\n var newServer = {\n url: server.urls[j]\n };\n if (server.urls[j].indexOf('turn') === 0) {\n newServer.username = server.username;\n newServer.credential = server.credential;\n }\n newIceServers.push(newServer);\n }\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n }\n return new window.mozRTCPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype =\n window.mozRTCPeerConnection.prototype;\n\n // wrap static methods. Currently just generateCertificate.\n if (window.mozRTCPeerConnection.generateCertificate) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return window.mozRTCPeerConnection.generateCertificate;\n }\n });\n }\n\n window.RTCSessionDescription = window.mozRTCSessionDescription;\n window.RTCIceCandidate = window.mozRTCIceCandidate;\n }\n\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // support for addIceCandidate(null or undefined)\n var nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n\n // shim getStats with maplike support\n var makeMapStats = function(stats) {\n var map = new Map();\n Object.keys(stats).forEach(function(key) {\n map.set(key, stats[key]);\n map[key] = stats[key];\n });\n return map;\n };\n\n var modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function(\n selector,\n onSucc,\n onErr\n ) {\n return nativeGetStats.apply(this, [selector || null])\n .then(function(stats) {\n if (browserDetails.version < 48) {\n stats = makeMapStats(stats);\n }\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(function(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(function(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\n shimRemoveStream: function(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(function(sender) {\n if (sender.track && stream.getTracks().indexOf(sender.track) !== -1) {\n pc.removeTrack(sender);\n }\n });\n };\n }\n};\n\n},{\"../utils\":14,\"./getusermedia\":12}],12:[function(require,module,exports){\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\nvar utils = require('../utils');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n var browserDetails = utils.detectBrowser(window);\n var navigator = window && window.navigator;\n var MediaStreamTrack = window && window.MediaStreamTrack;\n\n var shimError_ = function(e) {\n return {\n name: {\n InternalError: 'NotReadableError',\n NotSupportedError: 'TypeError',\n PermissionDeniedError: 'NotAllowedError',\n SecurityError: 'NotAllowedError'\n }[e.name] || e.name,\n message: {\n 'The operation is insecure.': 'The request is not allowed by the ' +\n 'user agent or the platform in the current context.'\n }[e.message] || e.message,\n constraint: e.constraint,\n toString: function() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n // getUserMedia constraints shim.\n var getUserMedia_ = function(constraints, onSuccess, onError) {\n var constraintsToFF37_ = function(c) {\n if (typeof c !== 'object' || c.require) {\n return c;\n }\n var require = [];\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = c[key] = (typeof c[key] === 'object') ?\n c[key] : {ideal: c[key]};\n if (r.min !== undefined ||\n r.max !== undefined || r.exact !== undefined) {\n require.push(key);\n }\n if (r.exact !== undefined) {\n if (typeof r.exact === 'number') {\n r. min = r.max = r.exact;\n } else {\n c[key] = r.exact;\n }\n delete r.exact;\n }\n if (r.ideal !== undefined) {\n c.advanced = c.advanced || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[key] = {min: r.ideal, max: r.ideal};\n } else {\n oc[key] = r.ideal;\n }\n c.advanced.push(oc);\n delete r.ideal;\n if (!Object.keys(r).length) {\n delete c[key];\n }\n }\n });\n if (require.length) {\n c.require = require;\n }\n return c;\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n if (browserDetails.version < 38) {\n logging('spec: ' + JSON.stringify(constraints));\n if (constraints.audio) {\n constraints.audio = constraintsToFF37_(constraints.audio);\n }\n if (constraints.video) {\n constraints.video = constraintsToFF37_(constraints.video);\n }\n logging('ff37: ' + JSON.stringify(constraints));\n }\n return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n onError(shimError_(e));\n });\n };\n\n // Returns the result of getUserMedia as a Promise.\n var getUserMediaPromise_ = function(constraints) {\n return new Promise(function(resolve, reject) {\n getUserMedia_(constraints, resolve, reject);\n });\n };\n\n // Shim for mediaDevices on older versions.\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n addEventListener: function() { },\n removeEventListener: function() { }\n };\n }\n navigator.mediaDevices.enumerateDevices =\n navigator.mediaDevices.enumerateDevices || function() {\n return new Promise(function(resolve) {\n var infos = [\n {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n ];\n resolve(infos);\n });\n };\n\n if (browserDetails.version < 41) {\n // Work around http://bugzil.la/1169665\n var orgEnumerateDevices =\n navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n navigator.mediaDevices.enumerateDevices = function() {\n return orgEnumerateDevices().then(undefined, function(e) {\n if (e.name === 'NotFoundError') {\n return [];\n }\n throw e;\n });\n };\n }\n if (browserDetails.version < 49) {\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).then(function(stream) {\n // Work around https://bugzil.la/802326\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(function(track) {\n track.stop();\n });\n throw new DOMException('The object can not be found here.',\n 'NotFoundError');\n }\n return stream;\n }, function(e) {\n return Promise.reject(shimError_(e));\n });\n };\n }\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n var 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 var 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 var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n var 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 var nativeApplyConstraints = 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 navigator.getUserMedia = function(constraints, onSuccess, onError) {\n if (browserDetails.version < 44) {\n return getUserMedia_(constraints, onSuccess, onError);\n }\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\n},{\"../utils\":14}],13:[function(require,module,exports){\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';\nvar utils = require('../utils');\n\nmodule.exports = {\n shimLocalStreamsAPI: function(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams = function() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('getStreamById' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getStreamById = function(id) {\n var result = null;\n if (this._localStreams) {\n this._localStreams.forEach(function(stream) {\n if (stream.id === id) {\n result = stream;\n }\n });\n }\n if (this._remoteStreams) {\n this._remoteStreams.forEach(function(stream) {\n if (stream.id === id) {\n result = stream;\n }\n });\n }\n return result;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (this._localStreams.indexOf(stream) === -1) {\n this._localStreams.push(stream);\n }\n var pc = this;\n stream.getTracks().forEach(function(track) {\n _addTrack.call(pc, track, stream);\n });\n };\n\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (stream) {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (this._localStreams.indexOf(stream) === -1) {\n this._localStreams.push(stream);\n }\n }\n return _addTrack.call(this, track, stream);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n var index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n var pc = this;\n var tracks = stream.getTracks();\n this.getSenders().forEach(function(sender) {\n if (tracks.indexOf(sender.track) !== -1) {\n pc.removeTrack(sender);\n }\n });\n };\n }\n },\n shimRemoteStreamsAPI: function(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get: function() {\n return this._onaddstream;\n },\n set: function(f) {\n var pc = this;\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 = function(e) {\n e.streams.forEach(function(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 var event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n });\n }\n },\n shimCallbacksAPI: function(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n var prototype = window.RTCPeerConnection.prototype;\n var createOffer = prototype.createOffer;\n var createAnswer = prototype.createAnswer;\n var setLocalDescription = prototype.setLocalDescription;\n var setRemoteDescription = prototype.setRemoteDescription;\n var addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer = function(successCallback, failureCallback) {\n var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n var promise = createOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer = function(successCallback, failureCallback) {\n var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n var promise = createAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n var withCallback = function(description, successCallback, failureCallback) {\n var 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 var 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 var 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 shimGetUserMedia: function(window) {\n var navigator = window && window.navigator;\n\n if (!navigator.getUserMedia) {\n if (navigator.webkitGetUserMedia) {\n navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n } else if (navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n }\n },\n shimRTCIceServerUrls: function(window) {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n var OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var 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: function() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n },\n shimTrackEventTransceiver: function(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCPeerConnection &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n // can't check 'transceiver' in window.RTCTrackEvent.prototype, as it is\n // defined for some reason even when window.RTCTransceiver is not.\n !window.RTCTransceiver) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function() {\n return {receiver: this.receiver};\n }\n });\n }\n },\n\n shimCreateOfferLegacy: function(window) {\n var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function(offerOptions) {\n var pc = this;\n if (offerOptions) {\n var audioTransceiver = pc.getTransceivers().find(function(transceiver) {\n return transceiver.sender.track &&\n transceiver.sender.track.kind === 'audio';\n });\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 pc.addTransceiver('audio');\n }\n\n var videoTransceiver = pc.getTransceivers().find(function(transceiver) {\n return transceiver.sender.track &&\n transceiver.sender.track.kind === 'video';\n });\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n videoTransceiver.setDirection('sendonly');\n } else if (videoTransceiver.direction === 'recvonly') {\n videoTransceiver.setDirection('inactive');\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n pc.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(pc, arguments);\n };\n }\n};\n\n},{\"../utils\":14}],14:[function(require,module,exports){\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\nvar logDisabled_ = true;\nvar 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 */\nfunction extractVersion(uastring, expr, pos) {\n var 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.\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var proto = window.RTCPeerConnection.prototype;\n var nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n var wrappedCallback = function(e) {\n cb(wrapper(e));\n };\n this._eventMap = this._eventMap || {};\n this._eventMap[cb] = wrappedCallback;\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n var 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 var 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: function() {\n return this['_on' + eventNameToWrap];\n },\n set: function(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 });\n}\n\n// Utility methods.\nmodule.exports = {\n extractVersion: extractVersion,\n wrapPeerConnectionEvent: wrapPeerConnectionEvent,\n disableLog: function(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 */\n disableWarnings: function(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\n log: function() {\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 */\n deprecated: function(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 */\n detectBrowser: function(window) {\n var navigator = window && window.navigator;\n\n // Returned result object.\n var result = {};\n result.browser = null;\n result.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 // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\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 } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n }\n};\n\n},{}]},{},[4])(4)\n});"],"sourceRoot":""}