async WebRTC minimal bad isRemote

by jib1

HTML

<div id="div"></div><br><div id="statsdiv"></div>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
<script src="https://jan-ivar.github.io/blacksilence/blacksilence.js"></script>

JavaScript

// This is a BAD example! Don't use isRemote, as it will break soon!

let log = msg => div.innerHTML += msg + "<br>";
let pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();

async function showStats(pc) {
  try {
    await new Promise(resolve => pc.oniceconnectionstatechange =
        () => pc.iceConnectionState == "connected" && resolve());
    while (true) {
      let html = "", stats = await pc.getStats();
      for (let stat of stats.values()) {
        switch (stat.type) {
          case "outbound-rtp": {
            if (stat.isRemote) html += "Remote ";
            html += dumpOutbound(stat) + "<br>";
            break;
          }
          case "inbound-rtp": {
            if (stat.isRemote) html += "Remote ";
            html += dumpInbound(stat) + "<br>";
            break;
          }
        }
      }
      update(statsdiv, `<small>${html}</small>`);
      await wait(1000);
    }
  } catch (e) {
    log(e);
  }
}
pc1.addTrack(black(), new MediaStream());
showStats(pc1);

var mute = () => video1.srcObject.getTracks().forEach(t => t.enabled = !t.enabled);
var update = (div, msg) => div.innerHTML = msg;
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));

let mb = bytes => (bytes/1024000).toFixed(2);
let dumpHeader = o => `${o.type} ${o.mediaType} ${new Date(o.timestamp).toTimeString()}<br>SSRC: ${o.ssrc} `;
var dumpOutbound = o => dumpHeader(o) + `Sent: ${o.packetsSent} packets (${mb(o.bytesSent)} MB)<br>Frames encoded: ${o.framesEncoded} Dropped frames: ${o.droppedFrames}<br>`;
var dumpInbound = o => dumpHeader(o) + `Received: ${o.packetsReceived} packets (${mb(o.bytesReceived)} MB) Lost: ${o.packetsLost}<br>Discarded packets: ${o.discardedPackets} Jitter: ${o.jitter}<br>`;

pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc1.onnegotiationneeded = async e => {
  await pc1.setLocalDescription(await pc1.createOffer());
  await...