Source code
Revision control
Copy as Markdown
Other Tools
// Most of this file has been stolen from dom/serviceworkers/test/utils.js.
function waitForState(worker, state) {
return new Promise((resolve, reject) => {
function onStateChange() {
if (worker.state === state) {
worker.removeEventListener("statechange", onStateChange);
resolve();
}
if (worker.state === "redundant") {
worker.removeEventListener("statechange", onStateChange);
reject(new Error("The service worker failed to install."));
}
}
// First add an event listener, so we won't miss any change that happens
// before we check the current state.
worker.addEventListener("statechange", onStateChange);
// Now check if the worker is already in the desired state.
onStateChange();
});
}
async function registerServiceWorkerAndWait(serviceWorkerFile) {
if (!serviceWorkerFile) {
throw new Error(
"No service worker filename has been specified. Please specify a valid filename."
);
}
console.log(`...registering the serviceworker "${serviceWorkerFile}"`);
const reg = await navigator.serviceWorker.register(`./${serviceWorkerFile}`, {
scope: "./",
});
console.log("...waiting for activation");
await waitForState(reg.installing, "activated");
console.log("...activated!");
}