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 };