tor-browser

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

script-transform-sendKeyFrameRequest.js (2413B)


      1 onrtctransform = event => {
      2  const transformer = event.transformer;
      3  let gotFrame;
      4 
      5  transformer.options.port.onmessage = event => {
      6    const {method} = event.data;
      7    if (method == 'sendKeyFrameRequest') {
      8      sendKeyFrameRequest();
      9    } else if (method == 'sendKeyFrameRequestDoesNotThrow') {
     10      sendKeyFrameRequestDoesNotThrow();
     11    } else if (method == 'waitForFrame') {
     12      waitForFrame();
     13    }
     14  }
     15 
     16  async function rejectInMs(timeout) {
     17    return new Promise((_, reject) => {
     18      const rejectWithTimeout = () => {
     19        reject(new DOMException(`Timed out after waiting for ${timeout} ms`,
     20          'TimeoutError'));
     21      };
     22      setTimeout(rejectWithTimeout, timeout);
     23    });
     24  }
     25 
     26  async function resolveInMs(timeout) {
     27    return new Promise((resolve) => {
     28      setTimeout(resolve, timeout);
     29    });
     30  }
     31 
     32  async function sendKeyFrameRequest() {
     33    try {
     34      await Promise.race([transformer.sendKeyFrameRequest(), rejectInMs(8000)]);;
     35      transformer.options.port.postMessage('success');
     36    } catch (e) {
     37      // TODO: This does not work if we send e.name, why?
     38      transformer.options.port.postMessage(`failure: ${e.name}`);
     39    }
     40  }
     41 
     42  async function sendKeyFrameRequestDoesNotThrow() {
     43    try {
     44      await Promise.race([transformer.sendKeyFrameRequest(), resolveInMs(50)]);;
     45      transformer.options.port.postMessage('success');
     46    } catch (e) {
     47      // TODO: This does not work if we send e.name, why?
     48      transformer.options.port.postMessage(`failure: ${e.name}`);
     49    }
     50  }
     51 
     52  async function waitForFrame() {
     53    try {
     54      await Promise.race([new Promise(r => gotFrameCallback = r), rejectInMs(8000)]);
     55      transformer.options.port.postMessage('got frame');
     56    } catch (e) {
     57      // TODO: This does not work if we send e.name, why?
     58      transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`});
     59    }
     60  }
     61 
     62  transformer.options.port.postMessage('started');
     63  transformer.reader = transformer.readable.getReader();
     64  transformer.writer = transformer.writable.getWriter();
     65 
     66  function process(transformer)
     67  {
     68    transformer.reader.read().then(chunk => {
     69      if (chunk.done)
     70        return;
     71      if (gotFrameCallback) {
     72        gotFrameCallback();
     73      }
     74      transformer.writer.write(chunk.value);
     75      process(transformer);
     76    });
     77  }
     78 
     79  process(transformer);
     80 };
     81 self.postMessage('registered');