tor-browser

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

static-router-race-network-and-fetch-handler-sw.js (1489B)


      1 'use strict';
      2 
      3 import {routerRules} from './router-rules.js';
      4 import {
      5  recordRequest,
      6  recordError,
      7  getRecords,
      8  resetRecords } from './static-router-sw.sub.js';
      9 
     10 import './imported-sw.js';
     11 
     12 self.addEventListener('install', async e => {
     13  e.waitUntil(caches.open('v1').then(
     14      cache => {cache.put('cache.txt', new Response('From cache'))}));
     15 
     16  const params = new URLSearchParams(location.search);
     17  const key = params.get('key');
     18  try {
     19    await e.addRoutes(routerRules[key]);
     20  } catch (e) {
     21    recordError(e);
     22  }
     23  self.skipWaiting();
     24 });
     25 
     26 self.addEventListener('activate', e => {
     27  e.waitUntil(clients.claim());
     28 });
     29 
     30 self.addEventListener('fetch', async function(event) {
     31  try {
     32    recordRequest(event.request);
     33    const url = new URL(event.request.url);
     34    // Force slow response
     35    if (url.searchParams.has('sw_slow')) {
     36      const start = Date.now();
     37      while (true) {
     38        if (Date.now() - start > 200) {
     39          break;
     40        }
     41      }
     42    }
     43    const nonce = url.searchParams.get('nonce');
     44    event.respondWith(new Response(nonce));
     45    // Call `fetch(e.request)` but it's not consumed.
     46    if (url.searchParams.has('call_fetch')) {
     47      await fetch(event.request);
     48    }
     49  } catch (e) {
     50    recordError(e)
     51  }
     52 });
     53 
     54 self.addEventListener('message', function(event) {
     55  if (event.data.reset) {
     56    resetRecords();
     57  }
     58  if (event.data.port) {
     59    const {requests, errors} = getRecords();
     60    event.data.port.postMessage({requests, errors});
     61  }
     62 });