tor-browser

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

lifetime_worker.js (2367B)


      1 var state = "from_scope";
      2 var resolvePromiseCallback;
      3 
      4 self.onfetch = function (event) {
      5  if (event.request.url.includes("lifetime_frame.html")) {
      6    event.respondWith(new Response("iframe_lifetime"));
      7    return;
      8  }
      9 
     10  var currentState = state;
     11  event.waitUntil(
     12    self.clients.matchAll().then(clients => {
     13      clients.forEach(client => {
     14        client.postMessage({ type: "fetch", state: currentState });
     15      });
     16    })
     17  );
     18 
     19  if (event.request.url.includes("update")) {
     20    state = "update";
     21  } else if (event.request.url.includes("wait")) {
     22    event.respondWith(
     23      new Promise(function (res) {
     24        if (resolvePromiseCallback) {
     25          dump("ERROR: service worker was already waiting on a promise.\n");
     26        }
     27        resolvePromiseCallback = function () {
     28          res(new Response("resolve_respondWithPromise"));
     29        };
     30      })
     31    );
     32    state = "wait";
     33  } else if (event.request.url.includes("release")) {
     34    state = "release";
     35    resolvePromise();
     36  }
     37 };
     38 
     39 function resolvePromise() {
     40  if (resolvePromiseCallback === undefined || resolvePromiseCallback == null) {
     41    dump("ERROR: wait promise was not set.\n");
     42    return;
     43  }
     44  resolvePromiseCallback();
     45  resolvePromiseCallback = null;
     46 }
     47 
     48 self.onmessage = function (event) {
     49  var lastState = state;
     50  state = event.data;
     51  if (state === "wait") {
     52    event.waitUntil(
     53      new Promise(function (res) {
     54        if (resolvePromiseCallback) {
     55          dump("ERROR: service worker was already waiting on a promise.\n");
     56        }
     57        resolvePromiseCallback = res;
     58      })
     59    );
     60  } else if (state === "release") {
     61    resolvePromise();
     62  }
     63  event.source.postMessage({ type: "message", state: lastState });
     64 };
     65 
     66 self.onpush = function (event) {
     67  var pushResolve;
     68  event.waitUntil(
     69    new Promise(function (resolve) {
     70      pushResolve = resolve;
     71    })
     72  );
     73 
     74  // FIXME(catalinb): push message carry no data. So we assume the only
     75  // push message we get is "wait"
     76  self.clients.matchAll().then(function (client) {
     77    if (!client.length) {
     78      dump("ERROR: no clients to send the response to.\n");
     79    }
     80 
     81    client[0].postMessage({ type: "push", state });
     82 
     83    state = "wait";
     84    if (resolvePromiseCallback) {
     85      dump("ERROR: service worker was already waiting on a promise.\n");
     86    } else {
     87      resolvePromiseCallback = pushResolve;
     88    }
     89  });
     90 };