'use strict'; const installEventFired = new Promise(resolve => { self.fireInstallEvent = resolve; }); const installFinished = new Promise(resolve => { self.finishInstall = resolve; }); addEventListener('install', event => { fireInstallEvent(); event.waitUntil(installFinished); }); addEventListener('message', event => { let resolveWaitUntil; event.waitUntil(new Promise(resolve => { resolveWaitUntil = resolve; })); // Use a dedicated MessageChannel for every request so senders can wait for // individual requests to finish, and concurrent requests (to different // workers) don't cause race conditions. const port = event.data; port.onmessage = (event) => { switch (event.data) { case 'awaitInstallEvent': installEventFired.then(() => { port.postMessage('installEventFired'); }).finally(resolveWaitUntil); break; case 'finishInstall': installFinished.then(() => { port.postMessage('installFinished'); }).finally(resolveWaitUntil); finishInstall(); break; case 'callUpdate': { const channel = new MessageChannel(); registration.update().then(() => { channel.port2.postMessage({ success: true, }); }).catch((exception) => { channel.port2.postMessage({ success: false, exception: exception.name, }); }).finally(resolveWaitUntil); port.postMessage(channel.port1, [channel.port1]); break; } default: port.postMessage('Unexpected command ' + event.data); resolveWaitUntil(); break; } }; });