JSFiddle - React, Tailwind, and code Playground
HTML
<script src='https://webrtc.github.io/adapter/adapter-0.2.4.js'></script>
JavaScript
var pc1 = new RTCPeerConnection(null);
var pc2 = new RTCPeerConnection(null);
var addCandidate = function(pc, event) {
if (!event.candidate) {
return;
}
var cand = new RTCIceCandidate(event.candidate);
pc.addIceCandidate(cand);
};
pc1.onicecandidate = function(event) {
addCandidate(pc2, event);
};
pc2.onicecandidate = function(event) {
addCandidate(pc1, event);
};
function pause(ms) {
return new Promise(function (resolve) {
setTimeout(resolve, ms);
});
}
navigator.mediaDevices.getUserMedia({
audio: false,
video: true,
fake: true
}).then(function (videoOnlyStream) {
pc1.createDataChannel('foo');
return pc1.createOffer().then(function(offer) {
console.log('pc1 offer', offer);
return pc1.setLocalDescription(offer);
}).then(function() {
return pc2.setRemoteDescription(pc1.localDescription);
}).then(function() {
return pc2.createAnswer();
}).then(function(answer) {
console.log('pc2 answer', answer);
return pc2.setLocalDescription(answer);
}).then(function() {
return pc1.setRemoteDescription(pc2.localDescription);
}).then(function() {
var pauseSeconds = 1;
console.log('negotiated first stream');
console.log('pausing for ' + pauseSeconds + 's before renegotiating');
return pause(pauseSeconds * 1000);
}).then(function () {
pc2.addStream(videoOnlyStream);
return pc2.createOffer();
}).then(function(offer) {
console.log('pc2 renegotiation offer', offer);
return pc2.setLocalDescription(offer);
}).then(function() {
return pc1.setRemoteDescription(pc2.localDescription);
}).then(function() {
return pc1.createAnswer();
}).then(function (answer) {
console.log('pc1 renegotiation answer', answer);
return pc2.setRemoteDescription(answer);
}).then(function () {
console.log('renegotiated');
...