clients-get-resultingClientId-worker.js (1841B)
1 let savedPort = null; 2 let savedResultingClientId = null; 3 4 async function getTestingPage() { 5 const clientList = await self.clients.matchAll({ type: 'window', includeUncontrolled: true }); 6 for (let c of clientList) { 7 if (c.url.endsWith('clients-get.https.html')) { 8 c.focus(); 9 return c; 10 } 11 } 12 return null; 13 } 14 15 async function destroyResultingClient(testingPage) { 16 const destroyedPromise = new Promise(resolve => { 17 self.addEventListener('message', e => { 18 if (e.data.msg == 'resultingClientDestroyed') { 19 resolve(); 20 } 21 }, {once: true}); 22 }); 23 testingPage.postMessage({ msg: 'destroyResultingClient' }); 24 return destroyedPromise; 25 } 26 27 self.addEventListener('fetch', async (e) => { 28 let { resultingClientId } = e; 29 savedResultingClientId = resultingClientId; 30 31 if (e.request.url.endsWith('simple.html?fail')) { 32 e.waitUntil((async () => { 33 const testingPage = await getTestingPage(); 34 await destroyResultingClient(testingPage); 35 testingPage.postMessage({ msg: 'resultingClientDestroyedAck', 36 resultingDestroyedClientId: savedResultingClientId }); 37 })()); 38 return; 39 } 40 41 e.respondWith(fetch(e.request)); 42 }); 43 44 self.addEventListener('message', (e) => { 45 let { msg, resultingClientId } = e.data; 46 e.waitUntil((async () => { 47 if (msg == 'getIsResultingClientUndefined') { 48 const client = await self.clients.get(resultingClientId); 49 let isUndefined = typeof client == 'undefined'; 50 e.source.postMessage({ msg: 'getIsResultingClientUndefined', 51 isResultingClientUndefined: isUndefined }); 52 return; 53 } 54 if (msg == 'getResultingClientId') { 55 e.source.postMessage({ msg: 'getResultingClientId', 56 resultingClientId: savedResultingClientId }); 57 return; 58 } 59 })()); 60 });