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');
   ...