tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

RTCDataChannel-helper.js (2679B)


      1 async function negotiate(offerer, answerer) {
      2  offerer.onicecandidate = e => answerer.addIceCandidate(e.candidate);
      3  answerer.onicecandidate = e => offerer.addIceCandidate(e.candidate);
      4 
      5  await offerer.setLocalDescription();
      6  await answerer.setRemoteDescription(offerer.localDescription);
      7  await answerer.setLocalDescription();
      8  await offerer.setRemoteDescription(answerer.localDescription);
      9 }
     10 
     11 // Calling this will only work if the channel is brand new
     12 async function maybeWrapChannel(channel, shim = null) {
     13  if (shim) {
     14    assert_true(shim instanceof WorkerBackedDataChannel);
     15    await shim.init(channel);
     16    channel = shim;
     17  }
     18  await new Promise(r => channel.addEventListener("open", r, {once: true}));
     19  if (shim) {
     20    await shim.updateState();
     21  }
     22  return channel;
     23 }
     24 
     25 async function openChannelPair(pc1, pc2, label, config, workerShim1, workerShim2) {
     26  const channelEvent = new Promise(r => {
     27    pc2.addEventListener('datachannel', async ({channel}) => {
     28      if (channel.label == label) {
     29        channel = await maybeWrapChannel(channel, workerShim2);
     30        r(channel);
     31      }
     32    });
     33  });
     34 
     35  return Promise.all([
     36    maybeWrapChannel(pc1.createDataChannel(label, config), workerShim1),
     37    channelEvent
     38  ]);
     39 }
     40 
     41 async function makeDataChannelTestFixture(label, config, workerShim1, workerShim2) {
     42  const offerer = new RTCPeerConnection();
     43  const answerer = new RTCPeerConnection();
     44  const pairPromise = openChannelPair(
     45    offerer, answerer, label, {}, workerShim1, workerShim2);
     46  await negotiate(offerer, answerer);
     47  const [offererChannel, answererChannel] = await pairPromise;
     48  return {offerer, answerer, offererChannel, answererChannel};
     49 }
     50 
     51 async function openChannelPairOffererShimmed() {
     52  // Use worker shim in RTCDataChannel-worker-shim.js
     53  const {offerer, answerer, offererChannel, answererChannel} =
     54    await makeDataChannelTestFixture(
     55      'foo', {}, new WorkerBackedDataChannel(), null);
     56 
     57  return {
     58    shimmedChannel: offererChannel,
     59    nonShimmedChannel: answererChannel,
     60    offerer,
     61    answerer
     62  };
     63 }
     64 
     65 async function openChannelPairAnswererShimmed() {
     66  // Use worker shim in RTCDataChannel-worker-shim.js
     67  const {offerer, answerer, offererChannel, answererChannel} =
     68    await makeDataChannelTestFixture(
     69      'foo', {}, null, new WorkerBackedDataChannel());
     70 
     71  return {
     72    shimmedChannel: answererChannel,
     73    nonShimmedChannel: offererChannel,
     74    offerer,
     75    answerer
     76  };
     77 }
     78 
     79 async function openChannelPairWithShim(whichChannelShimmed) {
     80  switch (whichChannelShimmed) {
     81    case 'offerer':
     82      return openChannelPairOffererShimmed();
     83    case 'answerer':
     84      return openChannelPairAnswererShimmed();
     85  }
     86 }