{"action":"created","comment":{"url":"https://api.github.com/repos/webrtc/adapter/pulls/comments/41079491","id":41079491,"diff_hunk":"@@ -484,8 +486,1061 @@ if (typeof window === 'undefined' || !window.navigator) {\n   webrtcDetectedVersion =\n     parseInt(navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)[2], 10);\n \n-  // the minimum version still supported by adapter.\n-  webrtcMinimumVersion = 12;\n+  // The minimum version still supported by adapter.\n+  // This is the build number for Edge.\n+  webrtcMinimumVersion = 10547;\n+\n+  if (RTCIceGatherer) {\n+    window.RTCIceCandidate = function(args) {\n+      return args;\n+    };\n+    window.RTCSessionDescription = function(args) {\n+      return args;\n+    };\n+\n+    window.RTCPeerConnection = function(config) {\n+      var self = this;\n+\n+      this.onicecandidate = null;\n+      this.onaddstream = null;\n+      this.onremovestream = null;\n+      this.onsignalingstatechange = null;\n+      this.oniceconnectionstatechange = null;\n+      this.onnegotiationneeded = null;\n+      this.ondatachannel = null;\n+\n+      this.localStreams = [];\n+      this.remoteStreams = [];\n+      this.getLocalStreams = function() { return self.localStreams; };\n+      this.getRemoteStreams = function() { return self.remoteStreams; };\n+\n+      this.localDescription = new RTCSessionDescription({\n+        type: '',\n+        sdp: ''\n+      });\n+      this.remoteDescription = new RTCSessionDescription({\n+        type: '',\n+        sdp: ''\n+      });\n+      this.signalingState = 'stable';\n+      this.iceConnectionState = 'new';\n+\n+      this.iceOptions = {\n+        gatherPolicy: 'all',\n+        iceServers: []\n+      };\n+      if (config && config.iceTransportPolicy) {\n+        switch (config.iceTransportPolicy) {\n+        case 'all':\n+        case 'relay':\n+          this.iceOptions.gatherPolicy = config.iceTransportPolicy;\n+          break;\n+        case 'none':\n+          // FIXME: remove once implementation and spec have added this.\n+          throw new TypeError('iceTransportPolicy \"none\" not supported');\n+        }\n+      }\n+      if (config && config.iceServers) {\n+        this.iceOptions.iceServers = config.iceServers;\n+      }\n+\n+      // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n+      // everything that is needed to describe a SDP m-line.\n+      this.mLines = [];\n+\n+      this._iceCandidates = [];\n+\n+      this._peerConnectionId = 'PC_' + Math.floor(Math.random() * 65536);\n+\n+      // FIXME: Should be generated according to spec (guid?)\n+      // and be the same for all PCs from the same JS\n+      this._cname = Math.random().toString(36).substr(2, 10);\n+    };\n+\n+    window.RTCPeerConnection.prototype.addStream = function(stream) {\n+      // clone just in case we're working in a local demo\n+      // FIXME: seems to be fixed\n+      this.localStreams.push(stream.clone());\n+\n+      // FIXME: maybe trigger negotiationneeded?\n+    };\n+\n+    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n+      var idx = this.localStreams.indexOf(stream);\n+      if (idx > -1) {\n+        this.localStreams.splice(idx, 1);\n+      }\n+      // FIXME: maybe trigger negotiationneeded?\n+    };\n+\n+    // SDP helper from sdp-jingle-json with modifications.\n+    // https://github.com/otalk/sdp-jingle-json\n+    window.RTCPeerConnection.prototype._toCandidateJSON = function(line) {\n+      var parts;\n+      if (line.indexOf('a=candidate:') === 0) {\n+        parts = line.substring(12).split(' ');\n+      } else { // no a=candidate\n+        parts = line.substring(10).split(' ');\n+      }\n+\n+      var candidate = {\n+        foundation: parts[0],\n+        component: parts[1],\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+        //generation: '0'\n+      };\n+\n+      for (var i = 8; i < parts.length; i += 2) {\n+        if (parts[i] === 'raddr') {\n+          candidate.relatedAddress = parts[i + 1]; // was: relAddr\n+        } else if (parts[i] === 'rport') {\n+          candidate.relatedPort = parseInt(parts[i + 1], 10); // was: relPort\n+        } else if (parts[i] === 'generation') {\n+          candidate.generation = parts[i + 1];\n+        } else if (parts[i] === 'tcptype') {\n+          candidate.tcpType = parts[i + 1];\n+        }\n+      }\n+      return candidate;\n+    };\n+\n+    // SDP helper from sdp-jingle-json with modifications.\n+    window.RTCPeerConnection.prototype._toCandidateSDP = 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 === 'srflx' || type === 'prflx' || type === 'relay') {\n+        if (candidate.relatedAddress && 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+      }\n+      if (candidate.tcpType && candidate.protocol.toUpperCase() === 'TCP') {\n+        sdp.push('tcptype');\n+        sdp.push(candidate.tcpType);\n+      }\n+      return 'a=candidate:' + sdp.join(' ');\n+    };\n+\n+    // SDP helper from sdp-jingle-json with modifications.\n+    window.RTCPeerConnection.prototype._parseRtpMap = function(line) {\n+      var parts = line.substr(9).split(' ');\n+      var parsed = {\n+        payloadType: parseInt(parts.shift(), 10) // was: id\n+      };\n+\n+      parts = parts[0].split('/');\n+\n+      parsed.name = parts[0];\n+      parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n+      parsed.numChannels = parts.length === 3 ? parseInt(parts[2], 10) : 1; // was: channels\n+      return parsed;\n+    };\n+\n+    // This function parses an SDP media section to determine capabilities.\n+    window.RTCPeerConnection.prototype._getRemoteCapabilities =\n+        function(mediaSection) {\n+      var remoteCapabilities = {\n+        codecs: [],\n+        headerExtensions: [],\n+        fecMechanisms: []\n+      };\n+      var i;\n+      var lines = mediaSection.split('\\r\\n');\n+      var mline = lines[0].substr(2).split(' ');\n+      var rtpmapFilter = function(line) {\n+        return line.indexOf('a=rtpmap:' + mline[i]) === 0;\n+      };\n+      var fmtpFilter = function(line) {\n+        return line.indexOf('a=fmtp:' + mline[i]) === 0;\n+      };\n+      var parseFmtp = function(line) {\n+        var parsed = {};\n+        var kv;\n+        var parts = line.substr(('a=fmtp:' + mline[i]).length + 1).split(';');\n+        for (var j = 0; j < parts.length; j++) {\n+          kv = parts[j].split('=');\n+          parsed[kv[0].trim()] = kv[1];\n+        }\n+        return parsed;\n+      };\n+      var rtcpFbFilter = function(line) {\n+        return line.indexOf('a=rtcp-fb:' + mline[i]) === 0;\n+      };\n+      var parseRtcpFb = function(line) {\n+        var parts = line.substr(('a=rtcp-fb:' + mline[i]).length + 1)\n+            .split(' ');\n+        return {\n+          type: parts.shift(),\n+          parameter: parts.join(' ')\n+        };\n+      };\n+      for (i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n+        var line = lines.filter(rtpmapFilter)[0];\n+        if (line) {\n+          var codec = this._parseRtpMap(line);\n+\n+          var fmtp = lines.filter(fmtpFilter);\n+          codec.parameters = fmtp.length ? parseFmtp(fmtp[0]) : {};\n+          codec.rtcpFeedback = lines.filter(rtcpFbFilter).map(parseRtcpFb);\n+\n+          remoteCapabilities.codecs.push(codec);\n+        }\n+      }\n+      return remoteCapabilities;\n+    };\n+\n+    // Serializes capabilities to SDP.\n+    window.RTCPeerConnection.prototype._capabilitiesToSDP = function(caps) {\n+      var sdp = '';\n+      caps.codecs.forEach(function(codec) {\n+        var pt = codec.payloadType;\n+        if (codec.preferredPayloadType !== undefined) {\n+          pt = codec.preferredPayloadType;\n+        }\n+        sdp += 'a=rtpmap:' + pt +\n+            ' ' + codec.name +\n+            '/' + codec.clockRate +\n+            (codec.numChannels !== 1 ? '/' + codec.numChannels : '') +\n+            '\\r\\n';\n+        if (codec.parameters && codec.parameters.length) {\n+          sdp += 'a=ftmp:' + pt + ' ';\n+          Object.keys(codec.parameters).forEach(function(param) {\n+            sdp += param + '=' + codec.parameters[param];\n+          });\n+          sdp += '\\r\\n';\n+        }\n+        if (codec.rtcpFeedback) {\n+          // FIXME: special handling for trr-int?\n+          codec.rtcpFeedback.forEach(function(fb) {\n+            sdp += 'a=rtcp-fb:' + pt + ' ' + fb.type + ' ' +\n+                fb.parameter + '\\r\\n';\n+          });\n+        }\n+      });\n+      return sdp;\n+    };\n+\n+    // Calculates the intersection of local and remote capabilities.\n+    window.RTCPeerConnection.prototype._getCommonCapabilities =\n+        function(localCapabilities, remoteCapabilities) {\n+      var commonCapabilities = {\n+        codecs: [],\n+        headerExtensions: [],\n+        fecMechanisms: []\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 === rCodec.name &&\n+              lCodec.clockRate === rCodec.clockRate &&\n+              lCodec.numChannels === rCodec.numChannels) {\n+            // push rCodec so we reply with offerer payload type\n+            commonCapabilities.codecs.push(rCodec);\n+\n+            // FIXME: also need to calculate intersection between\n+            // .rtcpFeedback and .parameters\n+            break;\n+          }\n+        }\n+      });\n+\n+      localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n+        for (var i = 0; i < remoteCapabilities.headerExtensions.length; 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+    // Parses DTLS parameters from SDP section or sessionpart.\n+    window.RTCPeerConnection.prototype._getDtlsParameters =\n+        function(section, session) {\n+      var lines = section.split('\\r\\n');\n+      lines = lines.concat(session.split('\\r\\n')); // Search in session part, too.\n+      var fpLine = lines.filter(function(line) {\n+        return line.indexOf('a=fingerprint:') === 0;\n+      });\n+      fpLine = fpLine[0].substr(14);\n+      var dtlsParameters = {\n+        role: 'auto',\n+        fingerprints: [{\n+          algorithm: fpLine.split(' ')[0],\n+          value: fpLine.split(' ')[1]\n+        }]\n+      };\n+      return dtlsParameters;\n+    };\n+\n+    // Serializes DTLS parameters to SDP.\n+    window.RTCPeerConnection.prototype._dtlsParametersToSDP =\n+        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+\n+    // Parses ICE information from SDP section or sessionpart.\n+    window.RTCPeerConnection.prototype._getIceParameters =\n+        function(section, session) {\n+      var lines = section.split('\\r\\n');\n+      lines = lines.concat(session.split('\\r\\n')); // Search in session part, too.\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.\n+    window.RTCPeerConnection.prototype._iceParametersToSDP = function(params) {\n+      return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n+          'a=ice-pwd:' + params.password + '\\r\\n';\n+    };\n+\n+    window.RTCPeerConnection.prototype._getEncodingParameters = function(ssrc) {\n+      return {\n+        ssrc: ssrc,\n+        codecPayloadType: 0,\n+        active: true\n+      };\n+    };\n+\n+    // Create ICE gatherer, ICE transport and DTLS transport.\n+    window.RTCPeerConnection.prototype._createIceAndDtlsTransports =\n+        function(mid, sdpMLineIndex) {\n+      var self = this;\n+      var iceGatherer = new RTCIceGatherer(self.iceOptions);\n+      var iceTransport = new RTCIceTransport(iceGatherer);\n+      iceGatherer.onlocalcandidate = function(evt) {\n+        var event = {};\n+        event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n+\n+        var cand = evt.candidate;\n+        var isEndOfCandidates = !(cand && Object.keys(cand).length > 0);\n+        if (isEndOfCandidates) {\n+          event.candidate.candidate =\n+              'candidate:1 1 udp 1 0.0.0.0 9 typ endOfCandidates';\n+          if (iceGatherer.state === undefined) { // polyfill\n+            iceGatherer.state = 'completed';\n+          }\n+        } else {\n+          // RTCIceCandidate doesn't have a component, needs to be added\n+          cand.component = iceTransport.component === 'RTCP' ? 2 : 1;\n+          event.candidate.candidate = self._toCandidateSDP(cand);\n+        }\n+        if (self.onicecandidate !== null) {\n+          // Emit null candidate when all gatherers are complete.\n+          var complete = self.mLines.every(function(mLine) {\n+            return mLine.iceGatherer && mLine.iceGatherer.state === 'completed';\n+          });\n+          if (self.localDescription && self.localDescription.type === '') {\n+            self._iceCandidates.push(event);\n+            if (complete) {\n+              self._iceCandidates.push({});\n+            }\n+          } else {\n+            self.onicecandidate(event);\n+            if (complete) {\n+              self.onicecandidate({});\n+            }\n+          }\n+        }\n+      };\n+      iceTransport.onicestatechange = function() {\n+        self._updateIceConnectionState();\n+      };\n+\n+      var dtlsTransport = new RTCDtlsTransport(iceTransport);\n+      dtlsTransport.ondtlsstatechange = function() {\n+        //self._updateConnectionState();\n+      };\n+      dtlsTransport.onerror = function(error) {\n+        console.error('dtls error', error);\n+      };\n+      return {\n+        iceGatherer: iceGatherer,\n+        iceTransport: iceTransport,\n+        dtlsTransport: dtlsTransport\n+      };\n+    };\n+\n+    window.RTCPeerConnection.prototype.setLocalDescription =\n+        function(description) {\n+      var self = this;\n+      if (description.type === 'offer') {\n+        if (!description.ortc) {\n+          // FIXME: throw?\n+        } else {\n+          this.mLines = description.ortc;\n+        }\n+      } else if (description.type === 'answer') {\n+        var sections = self.remoteDescription.sdp.split('\\r\\nm=');","path":"adapter.js","position":433,"original_position":433,"commit_id":"6f8a77314add272e428252d5b6f9661cf6007d5a","original_commit_id":"6f8a77314add272e428252d5b6f9661cf6007d5a","user":{"login":"juberti","id":1821693,"avatar_url":"https://avatars.githubusercontent.com/u/1821693?v=3","gravatar_id":"","url":"https://api.github.com/users/juberti","html_url":"https://github.com/juberti","followers_url":"https://api.github.com/users/juberti/followers","following_url":"https://api.github.com/users/juberti/following{/other_user}","gists_url":"https://api.github.com/users/juberti/gists{/gist_id}","starred_url":"https://api.github.com/users/juberti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juberti/subscriptions","organizations_url":"https://api.github.com/users/juberti/orgs","repos_url":"https://api.github.com/users/juberti/repos","events_url":"https://api.github.com/users/juberti/events{/privacy}","received_events_url":"https://api.github.com/users/juberti/received_events","type":"User","site_admin":false},"body":"I would be happier if we had an explicit splitSessionDescription function that returned an array of m= sections as text.","created_at":"2015-10-02T23:55:13Z","updated_at":"2015-10-02T23:55:13Z","html_url":"https://github.com/webrtc/adapter/pull/136#discussion_r41079491","pull_request_url":"https://api.github.com/repos/webrtc/adapter/pulls/136","_links":{"self":{"href":"https://api.github.com/repos/webrtc/adapter/pulls/comments/41079491"},"html":{"href":"https://github.com/webrtc/adapter/pull/136#discussion_r41079491"},"pull_request":{"href":"https://api.github.com/repos/webrtc/adapter/pulls/136"}}},"pull_request":{"url":"https://api.github.com/repos/webrtc/adapter/pulls/136","id":45233903,"html_url":"https://github.com/webrtc/adapter/pull/136","diff_url":"https://github.com/webrtc/adapter/pull/136.diff","patch_url":"https://github.com/webrtc/adapter/pull/136.patch","issue_url":"https://api.github.com/repos/webrtc/adapter/issues/136","number":136,"state":"open","locked":false,"title":"shim rtcpeerconnection ontop of ortc","user":{"login":"fippo","id":289731,"avatar_url":"https://avatars.githubusercontent.com/u/289731?v=3","gravatar_id":"","url":"https://api.github.com/users/fippo","html_url":"https://github.com/fippo","followers_url":"https://api.github.com/users/fippo/followers","following_url":"https://api.github.com/users/fippo/following{/other_user}","gists_url":"https://api.github.com/users/fippo/gists{/gist_id}","starred_url":"https://api.github.com/users/fippo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fippo/subscriptions","organizations_url":"https://api.github.com/users/fippo/orgs","repos_url":"https://api.github.com/users/fippo/repos","events_url":"https://api.github.com/users/fippo/events{/privacy}","received_events_url":"https://api.github.com/users/fippo/received_events","type":"User","site_admin":false},"body":"@juberti @pthatcherg I think you might be interested in this. A couple of rough edges but it passes most tests here (pending #131) and makes many of the samples work.\r\n\r\nMany thanks to @shijuns and @aboba for answering all of my questions.","created_at":"2015-09-16T22:50:15Z","updated_at":"2015-10-02T23:55:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d9895cf25378ba1b1de7a12e99a9ec6b212a9670","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/webrtc/adapter/pulls/136/commits","review_comments_url":"https://api.github.com/repos/webrtc/adapter/pulls/136/comments","review_comment_url":"https://api.github.com/repos/webrtc/adapter/pulls/comments{/number}","comments_url":"https://api.github.com/repos/webrtc/adapter/issues/136/comments","statuses_url":"https://api.github.com/repos/webrtc/adapter/statuses/6f8a77314add272e428252d5b6f9661cf6007d5a","head":{"label":"fippo:shim-ortc","ref":"shim-ortc","sha":"6f8a77314add272e428252d5b6f9661cf6007d5a","user":{"login":"fippo","id":289731,"avatar_url":"https://avatars.githubusercontent.com/u/289731?v=3","gravatar_id":"","url":"https://api.github.com/users/fippo","html_url":"https://github.com/fippo","followers_url":"https://api.github.com/users/fippo/followers","following_url":"https://api.github.com/users/fippo/following{/other_user}","gists_url":"https://api.github.com/users/fippo/gists{/gist_id}","starred_url":"https://api.github.com/users/fippo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fippo/subscriptions","organizations_url":"https://api.github.com/users/fippo/orgs","repos_url":"https://api.github.com/users/fippo/repos","events_url":"https://api.github.com/users/fippo/events{/privacy}","received_events_url":"https://api.github.com/users/fippo/received_events","type":"User","site_admin":false},"repo":{"id":30330866,"name":"adapter","full_name":"fippo/adapter","owner":{"login":"fippo","id":289731,"avatar_url":"https://avatars.githubusercontent.com/u/289731?v=3","gravatar_id":"","url":"https://api.github.com/users/fippo","html_url":"https://github.com/fippo","followers_url":"https://api.github.com/users/fippo/followers","following_url":"https://api.github.com/users/fippo/following{/other_user}","gists_url":"https://api.github.com/users/fippo/gists{/gist_id}","starred_url":"https://api.github.com/users/fippo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fippo/subscriptions","organizations_url":"https://api.github.com/users/fippo/orgs","repos_url":"https://api.github.com/users/fippo/repos","events_url":"https://api.github.com/users/fippo/events{/privacy}","received_events_url":"https://api.github.com/users/fippo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/fippo/adapter","description":"Shim to insulate apps from spec changes and prefix differences.","fork":true,"url":"https://api.github.com/repos/fippo/adapter","forks_url":"https://api.github.com/repos/fippo/adapter/forks","keys_url":"https://api.github.com/repos/fippo/adapter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fippo/adapter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fippo/adapter/teams","hooks_url":"https://api.github.com/repos/fippo/adapter/hooks","issue_events_url":"https://api.github.com/repos/fippo/adapter/issues/events{/number}","events_url":"https://api.github.com/repos/fippo/adapter/events","assignees_url":"https://api.github.com/repos/fippo/adapter/assignees{/user}","branches_url":"https://api.github.com/repos/fippo/adapter/branches{/branch}","tags_url":"https://api.github.com/repos/fippo/adapter/tags","blobs_url":"https://api.github.com/repos/fippo/adapter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fippo/adapter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fippo/adapter/git/refs{/sha}","trees_url":"https://api.github.com/repos/fippo/adapter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fippo/adapter/statuses/{sha}","languages_url":"https://api.github.com/repos/fippo/adapter/languages","stargazers_url":"https://api.github.com/repos/fippo/adapter/stargazers","contributors_url":"https://api.github.com/repos/fippo/adapter/contributors","subscribers_url":"https://api.github.com/repos/fippo/adapter/subscribers","subscription_url":"https://api.github.com/repos/fippo/adapter/subscription","commits_url":"https://api.github.com/repos/fippo/adapter/commits{/sha}","git_commits_url":"https://api.github.com/repos/fippo/adapter/git/commits{/sha}","comments_url":"https://api.github.com/repos/fippo/adapter/comments{/number}","issue_comment_url":"https://api.github.com/repos/fippo/adapter/issues/comments{/number}","contents_url":"https://api.github.com/repos/fippo/adapter/contents/{+path}","compare_url":"https://api.github.com/repos/fippo/adapter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fippo/adapter/merges","archive_url":"https://api.github.com/repos/fippo/adapter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fippo/adapter/downloads","issues_url":"https://api.github.com/repos/fippo/adapter/issues{/number}","pulls_url":"https://api.github.com/repos/fippo/adapter/pulls{/number}","milestones_url":"https://api.github.com/repos/fippo/adapter/milestones{/number}","notifications_url":"https://api.github.com/repos/fippo/adapter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fippo/adapter/labels{/name}","releases_url":"https://api.github.com/repos/fippo/adapter/releases{/id}","created_at":"2015-02-05T01:20:35Z","updated_at":"2015-02-05T01:20:39Z","pushed_at":"2015-10-02T16:13:31Z","git_url":"git://github.com/fippo/adapter.git","ssh_url":"git@github.com:fippo/adapter.git","clone_url":"https://github.com/fippo/adapter.git","svn_url":"https://github.com/fippo/adapter","homepage":null,"size":3268,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"webrtc:master","ref":"master","sha":"0d75c47aa4c4fd05a879f59801b8eb3f10b1f13b","user":{"login":"webrtc","id":10526312,"avatar_url":"https://avatars.githubusercontent.com/u/10526312?v=3","gravatar_id":"","url":"https://api.github.com/users/webrtc","html_url":"https://github.com/webrtc","followers_url":"https://api.github.com/users/webrtc/followers","following_url":"https://api.github.com/users/webrtc/following{/other_user}","gists_url":"https://api.github.com/users/webrtc/gists{/gist_id}","starred_url":"https://api.github.com/users/webrtc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/webrtc/subscriptions","organizations_url":"https://api.github.com/users/webrtc/orgs","repos_url":"https://api.github.com/users/webrtc/repos","events_url":"https://api.github.com/users/webrtc/events{/privacy}","received_events_url":"https://api.github.com/users/webrtc/received_events","type":"Organization","site_admin":false},"repo":{"id":30027163,"name":"adapter","full_name":"webrtc/adapter","owner":{"login":"webrtc","id":10526312,"avatar_url":"https://avatars.githubusercontent.com/u/10526312?v=3","gravatar_id":"","url":"https://api.github.com/users/webrtc","html_url":"https://github.com/webrtc","followers_url":"https://api.github.com/users/webrtc/followers","following_url":"https://api.github.com/users/webrtc/following{/other_user}","gists_url":"https://api.github.com/users/webrtc/gists{/gist_id}","starred_url":"https://api.github.com/users/webrtc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/webrtc/subscriptions","organizations_url":"https://api.github.com/users/webrtc/orgs","repos_url":"https://api.github.com/users/webrtc/repos","events_url":"https://api.github.com/users/webrtc/events{/privacy}","received_events_url":"https://api.github.com/users/webrtc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/webrtc/adapter","description":"Shim to insulate apps from spec changes and prefix differences.","fork":false,"url":"https://api.github.com/repos/webrtc/adapter","forks_url":"https://api.github.com/repos/webrtc/adapter/forks","keys_url":"https://api.github.com/repos/webrtc/adapter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/webrtc/adapter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/webrtc/adapter/teams","hooks_url":"https://api.github.com/repos/webrtc/adapter/hooks","issue_events_url":"https://api.github.com/repos/webrtc/adapter/issues/events{/number}","events_url":"https://api.github.com/repos/webrtc/adapter/events","assignees_url":"https://api.github.com/repos/webrtc/adapter/assignees{/user}","branches_url":"https://api.github.com/repos/webrtc/adapter/branches{/branch}","tags_url":"https://api.github.com/repos/webrtc/adapter/tags","blobs_url":"https://api.github.com/repos/webrtc/adapter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/webrtc/adapter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/webrtc/adapter/git/refs{/sha}","trees_url":"https://api.github.com/repos/webrtc/adapter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/webrtc/adapter/statuses/{sha}","languages_url":"https://api.github.com/repos/webrtc/adapter/languages","stargazers_url":"https://api.github.com/repos/webrtc/adapter/stargazers","contributors_url":"https://api.github.com/repos/webrtc/adapter/contributors","subscribers_url":"https://api.github.com/repos/webrtc/adapter/subscribers","subscription_url":"https://api.github.com/repos/webrtc/adapter/subscription","commits_url":"https://api.github.com/repos/webrtc/adapter/commits{/sha}","git_commits_url":"https://api.github.com/repos/webrtc/adapter/git/commits{/sha}","comments_url":"https://api.github.com/repos/webrtc/adapter/comments{/number}","issue_comment_url":"https://api.github.com/repos/webrtc/adapter/issues/comments{/number}","contents_url":"https://api.github.com/repos/webrtc/adapter/contents/{+path}","compare_url":"https://api.github.com/repos/webrtc/adapter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/webrtc/adapter/merges","archive_url":"https://api.github.com/repos/webrtc/adapter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/webrtc/adapter/downloads","issues_url":"https://api.github.com/repos/webrtc/adapter/issues{/number}","pulls_url":"https://api.github.com/repos/webrtc/adapter/pulls{/number}","milestones_url":"https://api.github.com/repos/webrtc/adapter/milestones{/number}","notifications_url":"https://api.github.com/repos/webrtc/adapter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/webrtc/adapter/labels{/name}","releases_url":"https://api.github.com/repos/webrtc/adapter/releases{/id}","created_at":"2015-01-29T15:41:40Z","updated_at":"2015-10-02T14:46:41Z","pushed_at":"2015-10-02T16:13:31Z","git_url":"git://github.com/webrtc/adapter.git","ssh_url":"git@github.com:webrtc/adapter.git","clone_url":"https://github.com/webrtc/adapter.git","svn_url":"https://github.com/webrtc/adapter","homepage":null,"size":3910,"stargazers_count":134,"watchers_count":134,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":42,"mirror_url":null,"open_issues_count":20,"forks":42,"open_issues":20,"watchers":134,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/webrtc/adapter/pulls/136"},"html":{"href":"https://github.com/webrtc/adapter/pull/136"},"issue":{"href":"https://api.github.com/repos/webrtc/adapter/issues/136"},"comments":{"href":"https://api.github.com/repos/webrtc/adapter/issues/136/comments"},"review_comments":{"href":"https://api.github.com/repos/webrtc/adapter/pulls/136/comments"},"review_comment":{"href":"https://api.github.com/repos/webrtc/adapter/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/webrtc/adapter/pulls/136/commits"},"statuses":{"href":"https://api.github.com/repos/webrtc/adapter/statuses/6f8a77314add272e428252d5b6f9661cf6007d5a"}}}}