| async function registerAndActiveServiceWorker(script, scope, callback) { |
| const registration = await navigator.serviceWorker.register(script, {scope}); |
| const serviceWorker = |
| registration.installing || registration.waiting || registration.active; |
| if (serviceWorker) { |
| waitForServiceWorkerActivation(scope, callback); |
| return; |
| } |
| |
| registration.addEventListener('updatefound', event => { |
| waitForServiceWorkerActivation(scope, callback); |
| }); |
| } |
| |
| async function waitForServiceWorkerActivation(scope, callback) { |
| const registration = await navigator.serviceWorker.getRegistration(scope); |
| if (registration.active) { |
| callback(registration); |
| return; |
| } |
| |
| const serviceWorker = registration.installing || registration.waiting; |
| serviceWorker.addEventListener('statechange', event => { |
| if (event.target.state == 'activated') { |
| callback(registration); |
| } |
| }); |
| } |