From 41679c2afb7fb96364abe09e3b7571ba1123c988 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Fri, 2 Dec 2022 16:51:16 +0100 Subject: [PATCH 01/21] First pass --- .../using_service_workers/important-notes.png | Bin 13697 -> 0 bytes .../using_service_workers/index.md | 142 ++++++++---------- .../using_service_workers/sw-events.png | Bin 5783 -> 0 bytes .../using_service_workers/sw101.png | Bin 103638 -> 0 bytes 4 files changed, 64 insertions(+), 78 deletions(-) delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/important-notes.png delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-events.png delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw101.png diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/important-notes.png b/files/en-us/web/api/service_worker_api/using_service_workers/important-notes.png deleted file mode 100644 index 6e0c2120d938dd592e46249f08a4252c523b6ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13697 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 C^Ca^C diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 96196feebb39e85..b4e100c64fe09cc 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -16,17 +16,17 @@ This article provides information on getting started with service workers, inclu ## The premise of service workers -One overriding problem that web users have suffered with for years is loss of connectivity. The best web app in the world will provide a terrible user experience if you can't download it. There have been various attempts to create technologies to solve this problem, and some of the issues have been solved. But the overriding problem is that there still isn't a good overall control mechanism for asset caching and custom network requests. +One overriding problem that web users have suffered with for years is loss of connectivity. The best web app in the world will provide a terrible user experience if you can't download it. There have been various attempts to create technologies to solve this problem, and some of the issues have been solved. But the overriding problem is that there wasn't a good overall control mechanism for asset caching and custom network requests. -The previous attempt, _AppCache_, seemed to be a good idea because it allowed you to specify assets to cache really easily. However, it made many assumptions about what you were trying to do and then broke horribly when your app didn't follow those assumptions exactly. Read Jake Archibald's (unfortunately-titled but well-written) [Application Cache is a Douchebag](https://alistapart.com/article/application-cache-is-a-douchebag/) for more details. +Service workers fix these issues. Using a service worker you can easily set an app up to use cached assets first, thus providing a default experience even when offline, before then getting more data from the network (commonly known as "offline first"). This is already available with native apps, which is one of the main reasons native apps are often chosen over web apps. -> **Note:** From Firefox 84, AppCache has been removed ({{bug("1619673")}}). It has also been [removed](https://bugs.chromium.org/p/chromium/issues/detail?id=582750) from Chromium 95, and is deprecated in Safari. +A service worker functions like a proxy server, allowing you to modify requests and responses, replace them with items from its own cache. -Service workers should finally fix these issues. Service worker syntax is more complex than that of AppCache, but the trade-off is that you can use JavaScript to control your AppCache-implied behaviors with a fine degree of granularity, allowing you to handle this problem and many more. Using a Service worker you can easily set an app up to use cached assets first, thus providing a default experience even when offline, before then getting more data from the network (commonly known as [Offline First](https://offlinefirst.org/)). This is already available with native apps, which is one of the main reasons native apps are often chosen over web apps. +> **Note:** Before service workers, a previous attempt at fixing those issues was AppCache. This API has been deprecated and removed from browsers, and should not be used anymore. ## Setting up to play with service workers -These days, service workers are enabled by default in all modern browsers. To run code using service workers, you'll need to serve your code via HTTPS — Service workers are restricted to running across HTTPS for security reasons. GitHub is therefore a good place to host experiments, as it supports HTTPS. In order to facilitate local development, `localhost` is considered a secure origin by browsers as well. +Service workers are enabled by default in all modern browsers. To run code using service workers, you'll need to serve your code via HTTPS — Service workers are restricted to running across HTTPS for security reasons. A server supporting HTTPS is necessary. To host experiments, you can use a service such as GitHub, Netlify, Vercel, etc. In order to facilitate local development, `localhost` is considered a secure origin by browsers as well. ## Basic architecture @@ -35,20 +35,26 @@ With service workers, the following steps are generally observed for basic set u 1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. 2. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. 3. The service worker is now ready to process events. -4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An Install event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). This is really the same kind of procedure as installing a native or Firefox OS app — making everything available for use offline. +4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. 5. When the `oninstall` handler completes, the service worker is considered installed. -6. Next is activation. When the service worker is installed, it then receives an activate event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a Service worker script. -7. The Service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a Service worker and maintains that for its lifetime. +6. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. +7. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. ![lifecycle diagram](sw-lifecycle.png) -The below graphic shows a summary of the available service worker events: +Here is a summary of the available service worker events: -![install, activate, message, fetch, sync, push](sw-events.png) +- `install` +- `activate` +- `message` +- Functional events + - `fetch` + - `sync` + - `push` -## Service workers demo +## Demo -To demonstrate just the very basics of registering and installing a service worker, we have created a simple demo called [simple service worker](https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker), which is a simple Star wars Lego image gallery. It uses a promise-powered function to read image data from a JSON object and load the images using Ajax, before displaying the images in a line down the page. We've kept things static and simple for now. It also registers, installs, and activates a service worker, and when more of the spec is supported by browsers it will cache all the files required so it will work offline! +To demonstrate just the very basics of registering and installing a service worker, we have created a simple demo called [simple service worker](https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker), which is a simple Star Wars Lego image gallery. It uses a promise-powered function to read image data from a JSON object and load the images using [`fetch()`](/en-US/docs/Web/API/Fetch_API/Using_Fetch), before displaying the images in a line down the page. We've kept things static and simple for now. It also registers, installs, and activates a service worker. ![The words Star Wars followed by an image of a Lego version of the Darth Vader character](demo-screenshot.png) @@ -83,7 +89,7 @@ const registerServiceWorker = async () => { registerServiceWorker(); ``` -1. The if-block performs a feature detection test to make sure service workers are supported before trying to register one. +1. The `if`-block performs a feature detection test to make sure service workers are supported before trying to register one. 2. Next, we use the {{domxref("ServiceWorkerContainer.register()") }} function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) 3. The `scope` parameter is optional, and can be used to specify the subset of your content that you want the service worker to control. In this case, we have specified '`'/'`, which means all content under the app's origin. If you leave it out, it will default to this value anyway, but we specified it here for illustration purposes. @@ -91,32 +97,25 @@ This registers a service worker, which runs in a worker context, and therefore h A single service worker can control many pages. Each time a page within your scope is loaded, the service worker is installed against that page and operates on it. Bear in mind therefore that you need to be careful with global variables in the service worker script: each page doesn't get its own unique worker. -> **Note:** Your service worker functions like a proxy server, allowing you to modify requests and responses, replace them with items from its own cache, and more. - -> **Note:** One great thing about service workers is that if you use feature detection like we've shown above, browsers that don't support service workers can just use your app online in the normal expected fashion. Furthermore, if you use AppCache and SW on a page, browsers that don't support SW but do support AppCache will use that, and browsers that support both will ignore the AppCache and let SW take over. +> **Note:** One great thing about service workers is that if you use feature detection like we've shown above, browsers that don't support service workers can just use your app online in the normal expected fashion. #### Why is my service worker failing to register? This could be for the following reasons: -1. You are not running your application through HTTPS. -2. The path to your service worker file is not written correctly — it needs to be written relative to the origin, not your app's root directory. In our example, the worker is at `https://bncb2v.csb.app/sw.js`, and the app's root is `https://bncb2v.csb.app/`. But the path needs to be written as `/sw.js`. -3. It is also not allowed to point to a service worker of a different origin than that of your app. - -![Possible registration failure reasons](important-notes.png) - -Also note: - +- You are not running your application through HTTPS. +- The path to your service worker file is not written correctly — it needs to be written relative to the origin, not your app's root directory. In our example, the worker is at `https://bncb2v.csb.app/sw.js`, and the app's root is `https://bncb2v.csb.app/`. But the path needs to be written as `/sw.js`. +- It is also not allowed to point to a service worker of a different origin than that of your app. - The service worker will only catch requests from clients under the service worker's scope. -- The max scope for a service worker is the location of the worker. -- If your service worker is active on a client being served with the `Service-Worker-Allowed` header, you can specify a list of max scopes for that worker. -- In Firefox, Service Worker APIs are hidden and cannot be used when the user is in [private browsing mode](https://support.mozilla.org/en-US/kb/private-browsing-use-firefox-without-history). +- The max scope for a service worker is the location of the worker (in other words if the script `sw.js` is located in `/js/sw.js`, it can only control URLs under `/js/` by default). A list of max scopes for that worker can be specified with the [`Service-Worker-Allowed`](/en-US/docs/Web/HTTP/Header/Service-Worker-Allowed) header. +- In Firefox, Service Worker APIs are hidden and cannot be used when the user is in [private browsing mode](https://bugzilla.mozilla.org/show_bug.cgi?id=1320796), or when history is disabled, or if cookies are cleared when Firefox is closed. +- In Chrome, registration fails when the "Block all cookies (not recommended)" option is enabled. ### Install and activate: populating your cache After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The install event is fired when an install is successfully completed. The install event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — {{domxref("cache")}} — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to — again, you have full control. +The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — {{domxref("cache")}} — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. Here's how our service worker handles the `install` event: @@ -144,11 +143,11 @@ self.addEventListener("install", (event) => { ``` 1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a {{domxref("ExtendableEvent.waitUntil()") }} method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. -2. Inside `addResourcesToCache` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function that calls `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. +2. Inside `addResourcesToCache()` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. 3. If the promise is rejected, the install fails, and the worker won't do anything. This is OK, as you can fix your code and then try again the next time registration occurs. 4. After a successful installation, the service worker activates. This doesn't have much of a distinct use the first time your service worker is installed/activated, but it means more when the service worker is updated (see the [Updating your service worker](#updating_your_service_worker) section later on.) -> **Note:** [localStorage](/en-US/docs/Web/API/Web_Storage_API) works in a similar way to service worker cache, but it is synchronous, so not allowed in service workers. +> **Note:** [The Web Storage API (`localStorage`)](/en-US/docs/Web/API/Web_Storage_API) works in a similar way to service worker cache, but it is synchronous, so not allowed in service workers. > **Note:** [IndexedDB](/en-US/docs/Web/API/IndexedDB_API) can be used inside a service worker for data storage if you require it. @@ -156,32 +155,32 @@ self.addEventListener("install", (event) => { Now you've got your site assets cached, you need to tell service workers to do something with the cached content. This is easily done with the `fetch` event. -![Fetch event diagram](sw-fetch.png) +1. A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross origin request to embed an image, that still goes through its service worker.) -A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross origin request to embed an image, that still goes through its service worker.) +2. You can attach a `fetch` event listener to the service worker, then call the `respondWith()` method on the event to hijack our HTTP responses and update them with your own content. -You can attach a `fetch` event listener to the service worker, then call the `respondWith()` method on the event to hijack our HTTP responses and update them with your own magic. + ```js + self.addEventListener("fetch", (event) => { + event + .respondWith + // custom content goes here + (); + }); + ``` -```js -self.addEventListener("fetch", (event) => { - event - .respondWith - // magic goes here - (); -}); -``` +3. We could start by responding with the resource whose URL matches that of the network request, in each case: -We could start by responding with the resource whose URL matches that of the network request, in each case: + ```js + self.addEventListener("fetch", (event) => { + event.respondWith(caches.match(event.request)); + }); + ``` -```js -self.addEventListener("fetch", (event) => { - event.respondWith(caches.match(event.request)); -}); -``` + `caches.match(event.request)` allows us to match each resource requested from the network with the equivalent resource available in the cache, if there is a matching one available. The matching is done via URL and various headers, just like with normal HTTP requests. -`caches.match(event.request)` allows us to match each resource requested from the network with the equivalent resource available in the cache, if there is a matching one available. The matching is done via URL and various headers, just like with normal HTTP requests. +![Fetch event diagram](sw-fetch.png) -Let's look at a few other options we have when defining our magic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) +Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) 1. The {{domxref("Response.Response","Response()")}} constructor allows you to create a custom response. In this case, we are just returning a simple text string: @@ -200,7 +199,7 @@ Let's look at a few other options we have when defining our magic (see our [Fetc ); ``` -3. If a match wasn't found in the cache, you could tell the browser to {{domxref("fetch()")}} the default network request for that resource, to get the new resource from the network if it is available: +3. If a match wasn't found in the cache, you could tell the browser to use {{domxref("fetch()")}} to get the default network request for that resource, to get the new resource from the network if it is available: ```js fetch(event.request); @@ -212,7 +211,7 @@ Let's look at a few other options we have when defining our magic (see our [Fetc caches.match("./fallback.html"); ``` -5. You can retrieve a lot of information about each request by calling parameters of the {{domxref("Request")}} object returned by the {{domxref("FetchEvent")}}: +5. You can retrieve a lot of information about each request with the properties of the {{domxref("Request")}} object given by the {{domxref("FetchEvent")}}: ```js event.request.url; @@ -225,7 +224,7 @@ Let's look at a few other options we have when defining our magic (see our [Fetc So `caches.match(event.request)` is great when there is a match in the service worker cache, but what about cases when there isn't a match? If we didn't provide any kind of failure handling, our promise would resolve with `undefined` and we wouldn't get anything returned. -Fortunately, service workers' promise-based structure makes it trivial to provide further options towards success. We could do this: +After testing the response from the cache, we can fallback on a regular network request: ```js const cacheFirst = async (request) => { @@ -243,7 +242,7 @@ self.addEventListener("fetch", (event) => { If the resources aren't in the cache, they are requested from the network. -If we were being really clever, we would not only request the resource from the network; we would also save it into the cache so that later requests for that resource could be retrieved offline too! This would mean that if extra images were added to the Star Wars gallery, our app could automatically grab them and cache them. The following would do the trick: +Using a more elaborate strategy, we could not only request the resource from the network, but also save it into the cache so that later requests for that resource could be retrieved offline too. This would mean that if extra images were added to the Star Wars gallery, our app could automatically grab them and cache them. The following snippet implements such a strategy: ```js const putInCache = async (request, response) => { @@ -266,11 +265,11 @@ self.addEventListener("fetch", (event) => { }); ``` -If the request URL is not available in the cache, we request the resource from the network request with `await fetch(request)`. After that, we put a clone of the response into the cache. The `putInCache` function uses `caches.open('v1')` and `cache.put()` to add the resource to the cache. The original response is returned to the browser to be given to the page that called it. +If the request URL is not available in the cache, we request the resource from the network request with `await fetch(request)`. After that, we put a clone of the response into the cache. The `putInCache()` function uses `caches.open('v1')` and `cache.put()` to add the resource to the cache. The original response is returned to the browser to be given to the page that called it. Cloning the response is necessary because request and response streams can only be read once. In order to return the response to the browser and put it in the cache we have to clone it. So the original gets returned to the browser and the clone gets sent to the cache. They are each read once. -What might look a bit weird is that the promise returned by `putInCache` is not awaited. But the reason is that we don't want to wait until the response clone has been added to the cache before returning a response. +What might look a bit weird is that the promise returned by `putInCache()` is not awaited. But the reason is that we don't want to wait until the response clone has been added to the cache before returning a response. The only trouble we have now is that if the request doesn't match anything in the cache, and the network is not available, our request will still fail. Let's provide a default fallback so that whatever happens, the user will at least get something: @@ -324,16 +323,14 @@ We have opted for this fallback image because the only updates that are likely t ## Service Worker Navigation Preload -If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManager) feature starts downloading resources as soon as the fetch request is made, and in parallel with service worker bootup. -This ensures that download starts immediately on navigation to a page, rather than having to wait until the service worker has booted. -That delay happens relatively rarely, but is unavoidable when it does happen, and may be significant. +If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManager) feature starts downloading resources as soon as the fetch request is made, and in parallel with service worker activation. This ensures that download starts immediately on navigation to a page, rather than having to wait until the service worker is activated. That delay happens relatively rarely, but is unavoidable when it does happen, and may be significant. First the feature must be enabled during service worker activation, using {{domxref("NavigationPreloadManager.enable()", "registration.navigationPreload.enable()")}}: ```js const enableNavigationPreload = async () => { if (self.registration.navigationPreload) { - // Enable navigation preloads! + // Enable navigation preloads await self.registration.navigationPreload.enable(); } }; @@ -350,8 +347,7 @@ Continuing the example from the previous sections, we insert the code to wait fo The new process is: 1. Check cache -2. Wait on `event.preloadResponse`, which is passed as `preloadResponsePromise` to the `cacheFirst` function. - Cache the result if it returns. +2. Wait on `event.preloadResponse`, which is passed as `preloadResponsePromise` to the `cacheFirst()` function. Cache the result if it returns. 3. If neither of these are defined then we go to the network. ```js @@ -406,7 +402,6 @@ const cacheFirst = async ({ request, preloadResponsePromise, fallbackUrl }) => { // Enable navigation preload const enableNavigationPreload = async () => { if (self.registration.navigationPreload) { - // Enable navigation preloads! await self.registration.navigationPreload.enable(); } }; @@ -442,9 +437,7 @@ self.addEventListener("fetch", (event) => { }); ``` -Note that in this example we download and cache the same data for the resource whether it is downloaded "normally" or preloaded. -You can instead choose to download and cache a different resource on preload. -For more information see [`NavigationPreloadManager` > Custom responses](/en-US/docs/Web/API/NavigationPreloadManager#custom_responses). +Note that in this example we download and cache the same data for the resource whether it is downloaded "normally" or preloaded. You can instead choose to download and cache a different resource on preload. For more information see [`NavigationPreloadManager` > Custom responses](/en-US/docs/Web/API/NavigationPreloadManager#custom_responses). ## Updating your service worker @@ -467,7 +460,7 @@ self.addEventListener("install", (event) => { "/app.js", "/image-list.js", - // ... + // … // include other new resources for the new version… ]) @@ -481,7 +474,7 @@ When no pages are using the current version, the new worker activates and become ### Deleting old caches -You also get an `activate` event. This is generally used to do stuff that would have broken the previous version while it was still running, for example getting rid of old caches. This is also useful for removing data that is no longer needed to avoid filling up too much disk space — each browser has a hard limit on the amount of cache storage that a given service worker can use. The browser does its best to manage disk space, but it may delete the Cache storage for an origin. The browser will generally delete all of the data for an origin or none of the data for an origin. +You also get an `activate` event. This is generally used to do stuff that would have broken the previous version while it was still running, for example getting rid of old caches. This is also useful for removing data that is no longer needed to avoid filling up too much disk space — each browser has a hard limit on the amount of cache storage that a given service worker can use. The browser does its best to manage disk space, but it may delete the cache storage for an origin. The browser will generally delete all of the data for an origin or none of the data for an origin. Promises passed into `waitUntil()` will block other events until completion, so you can rest assured that your clean-up operation will have completed by the time you get your first `fetch` event on the new service worker. @@ -504,20 +497,13 @@ self.addEventListener("activate", (event) => { ## Developer tools -Chrome has `chrome://inspect/#service-workers`, which shows current service worker activity and storage on a device, and `chrome://serviceworker-internals`, which shows more detail and allows you to start/stop/debug the worker process. In the future they will have throttling/offline modes to simulate bad or non-existent connections, which will be a really good thing. - -Firefox has also started to implement some useful tools related to service workers: - -- You can navigate to [`about:debugging`](https://firefox-source-docs.mozilla.org/devtools-user/about_colon_debugging/index.html) to see what SWs are registered and update/remove them. -- When testing you can get around the HTTPS restriction by checking the "Enable Service Workers over HTTP (when toolbox is open)" option in the [Firefox Developer Tools settings](https://firefox-source-docs.mozilla.org/devtools-user/settings/index.html). -- The "Forget" button, available in Firefox's customization options, can be used to clear service workers and their caches ({{bug(1252998)}}). - -> **Note:** You may serve your app from `http://localhost` (e.g. using `me@localhost:/my/app$ python -m SimpleHTTPServer`) for local development. See [Security considerations](https://www.w3.org/TR/service-workers/#security-considerations) +- [Chrome](https://www.chromium.org/blink/serviceworker/service-worker-faq/) +- [Firefox](https://firefox-source-docs.mozilla.org/devtools-user/application/service_workers/index.html) + - The "Forget about this site" button, available in [Firefox's toolbar customization options](https://support.mozilla.org/en-US/kb/customize-firefox-controls-buttons-and-toolbars), can be used to clear service workers and their caches. +- [Edge](https://learn.microsoft.com/en-us/microsoft-edge/devtools-guide-chromium/service-workers/) ## See also - [The Service Worker Cookbook](https://github.com/mdn/serviceworker-cookbook) -- [Is ServiceWorker ready?](https://jakearchibald.github.io/isserviceworkerready/) -- Download the [Service Workers 101 cheatsheet](sw101.png). - [Promises](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) - [Using web workers](/en-US/docs/Web/API/Web_Workers_API/Using_web_workers) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-events.png b/files/en-us/web/api/service_worker_api/using_service_workers/sw-events.png deleted file mode 100644 index d4577ef93b4d6787bdf55bedb8329a56816e0295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5783 zcmai2Rag@avbEt*?@rH9_T-hA}9KfM}#=!{u5$H z1#JZaf;!m!n|CDtWkMeVHARBzQFhFK{;i&tp$Z<4UtV5LOG^U+flWRqTU$p* zM;8|t5C~*uW+pp3yQ-=RiA4VV`Ez)9_`f3OD|G+C+}xa#lheS!AUZnQ!NI}D$A_Gp zJSizjQBhG!N=idRgP)(Dg@wh{)wLvprLv*~Rhl>dlcv6iwhHm!V3w|@nl?7%B^>4r z@p~N>0E8vFmghdIuPdkpym-tO}8u`U^@ff{Pu1^J)z;cS`d zQQH%=y|pya;nsd$iV-2EX(>J_p8|c{ctZlU9qbj*9W)S6%E~YIQ{#B-td$`C>X}JT z4fVx5oJ8JP2>SR)g@O(IJ;jGxsRx=EEzMq+X41IWJ^Wy=85`vk74gB($0;@jVxX@U z6yO{Tc64_!3Gx>3a(S7Tn`B`E%*~E5)_?ZFR_Mq( zIA7F@gB1b-#`QPK3Wk9T`+2`pH`E_MEetxbU*W34d++8;12W9~pPKr=qac53N=|Oe z85vIG_2iY;76Bd~|4ZOa2BdV!AGV1|KMkm@f>#1eLVgYZ0uL{7P{t@0>hUrDzw-4c zC9?mqA*m_H*M?Oy2&C%D$K!i>!aJ4a5=+l=NB!E<4tl{89;16=?v93oj!TLbHB82T zwSSR;*J)dcW+ew}pMFMctLUiHP5{+ol#aQO)I}u!Oa$}EEm)z--3DPsD$T!}iDpeC zO1mFQwm-K>|Izf7tr+UUIOo-$#W=AL*M{`^yQ9mA)*8}KGN2+1C=8i%k&zGffFg`Y zPB@)t&I;vh*Uw1ymT08T!(qg7=|Ro;D}R=Zh(xBB@**6UdSAzgLx5PSi7r0Cgsgn> zp$7l$jI(`T<7ej>q4R_uc8IH&Rgdli*MXm_24p>{^n&N-I}}Hif{}4N4M+2~>I7U9 zlN;E9EhV7x2u&>dNJGTY*^YJxGYRV2aUUIJg*VlD+MA;qQ5LV>EA@y?a6OUVWyL+& z z4B|O|wq*o){?gBF@Awr+igZ_PWM;e`Gwz+wI=xmM7KJ4cVLIYSTY$W%D8@QTGC@lr z%?_HVfeYBSX^>n%p>Jl%7C$)J@3PWo~vJDxtMWLXoFw`_82?*Z$2?fg1>`Z26+U1}M5#%JiVU() zi~5vGnDwQV*D;7A?CkaBo!m6dwBn_-N`=w^`m%s4auKbYhdbF8iAXis!#4JiaLv{ce-1S9!Crbx4Lh|4&*4$BULE!+=;?<0)8b2m%V=SGhT6Rm$lH6E@o_~bJ49IM zHA9srUaVQpT{ki2ea_aF5~7rW>tXj;@jO~D8*(SSb`L{1sif^1c85!!d3<42Gw8Dn z)BG#P_rw{`ncpUVWxzoX;M3S*OwKl~A1xfn0cfK4Jat4Q+Na-O`2_U-TeSE~1mZEQ z6k27R{!yN(LTXk7-qbEH-MG{bM43)99Xy3dIL)=JnBml9#v&e zEXo8pR{N@FTji52l)c}AbZ9f#+3Yabu|Qq)EI#P^i0m$oJNh*J+-OrZl}TRTdQ|h!9@r}O(-rC z-vz$igVxmsk$@X{f4Q6<#%u*|rF#S=0TQr(k`C5x9BsOA`QS7_T%6&(ZIC_0sa%t9 z0kK%BRt5rf-;DT{0R85o5q>{fauq4RnhqFv8wmnD#XwZm(cS|?R?rY)ipNvaI}}Bq z5i8vs2Prf@js6R5fw+PQT6e1&?NtUy6G{p5atS=5deOQ1OJ;SrLlOe69SFTY-}@PH z6yiM;F%fPn{X8G=k}4_mt|C$ABwl2{l@L5fw|kdp?H|i5@q>DdD{dXAUW93-0Q)N0 z01)KGh{Xc6+T-<0x_z%DN>HTaznHc7T56A20LN<^Z+(>~A6?Kw<6O$@@YSaTuQir8 zR&mMW#obD_od3u)V&N~6@=Q5Fya$mza>36|PIkR>+4DCujMUKwLo1P=SRVS*{)yiF zckNc6isy#0mpHPN(|a`y>?dgH3f8T4UFJ@X~I*YC~rb0edkpfx>HQ2qQ)OFxlhX65XVPS|lm$Kq7mzu$(LjBmkCoz4t4W5hlG%)fUw zE`nK+MN5qc3F&s3A;}1*y;05Hm~jR=7Hh9roE|(Y?Ay+`ws5`Wta1_2n(eWrJWRuq z)ACr_x{A2wEXafJJ`eUUN$|6W7FMe}!iM||&!;b*hofZnK$#ki3Y3@dowccCyKOj7 zEQ=vEr52Wr5Yw(80{09~**eW}9}CYe7U_w(j(8C}>VWsYl-nl8LOs!Qgg+ zz3FBUNC6)57c}XEiC6ly#q4CV<^zBBNS$4VM-~aC%L3oN0I3K7#wNFTdYyT(#8x>| zZ^6AKLJ5kw&ybq!I>+yeVW$U5;Ajip17B{a)#mo78f|(*Ezv_hsQ@2|Ib(=yT`^*h z0(|13h@QDm#mfK|IG)3O917^55eEse{|?xBVCg^fe$rliJLh`ajVlNMDqlN||01rL z#IGn^7qU(7o^dq0hux$A$jdt`vdno4 z{@(og?On*|wQ?oc)v>$gsqI-vbA=xPMTAM6uue{c2HAg?I|6cKmk{ zT4Eng8ugA*>?Agd$l}!}EU{FEgU(P45H8-1J^kuXGEg_UE+>k!`(zf&%PVQ;{ZnQz z>!|FT^QJcDLA?%~QOY!)CQTa#s`QH!`q}4mHN;ajW19)@z|U^K$!WB0mWUT^$)-ta z_Em)Kz}ucJf^*%fU!6{HCZJVed1mT&$JsNpasi0aLg~rzypC*Duj#X>VHQ`DMXF;h zJzHzvM^kqz0fq{C(n6wYG;DWG3Sr}P--*e-(d^rMcG-Ituf9mIlr$Usnv)0^zzLo3 zKexwYD+W0E$eeH?CdS-E?8W)0hw%AYQ<9YK&jY-Rq-*9s@<=#keW zmwI2`N?4F?SN1KkV6m}%V?a@mfW;$+$JRMjz@I@`$UUm&FZUa$e&tcIBiIgVEdAm^ zOpez6PBA*>srz)6tunczCswFQVCB|5@bZmczWbr&W@%2&^%U$zY*oWUkiv~Gn{8D_ zM1_s=lU7VwXlAGovXp1J?PDuQ#EzFm2U+{sQA{?N27Ip`wXN2D`#m33A=oqHM#$8# z>MH#_@EgRbg^gN6*3vB5LgC-EPIn_&-8jGPY6hFnZsh_f57A;HuW|QJwY?hMuPw&@ z&D`BzMn{zkK0yS|l3l(k)kM}rCyQ|Xp6HJv4iQK4%5oNcB=<0sMC~PPm+)RLt>7i% zbEf?t{jwXFMj*^N#(p#;MT8}cq|3wp%xMP)52ie>q)Qy)Z)VC3RLuiQUk9U+Rp<+w zTdzOLTtw_*AQ=uTJ#Qz-tE%5_EhqScyldE=D$_u~deHm+(?O|E2Yo>YcLevAteeVP z$TbSf!!`7XU9JjM$n`XTEA`;T2{t`on3&2tTqfry1qXQm`ZdsqLFWDPD``zom z&MOl(MhqBtf?U93bXbD%vD3qva~+?$zE`;o1uuIhIIYg}j5s@VZgAH}7dqJ&VSBO9zPTkC zpXW~Ea-&OKPkC*4_z&3Y8tA;K+ib~63sKeJH>)EssKz9Db}d@4<48Y<<_WX0*X#Yxi=PNR~@i37nzO8FwxAj5%kSXM*?%8R(lTKE&Rkc+ck9I&Ilsb2LQt12k z<;)vGCZfECB5v%A%_p-bZS1*_=c%+$)bgqyi*VC*F@o&Lp)mtU;yn6#&xuOZR$KUm z`W5NeWGP2$gZKHI01vxW0-`RCESjtp`y8qh^Nt_@w!ui&`Dvu1!#BzE`k^uWi)9?* zqs*VbF_vEdYc5PclVH<7k8I?Z{(ZlP?eb0ke19CMTE`mA!PAnsxpuh8u=M4zgm+zV z_2nw_E6cXskUi;c>bRh!V6uIAN>pzdrSV~+(Mqb1OF;PRY6LE^}5qa5wDuRZl{kK+KQBr^Ke z9)&D=wacPg9T&L{RfUi0$%nKm30!MDH#)<0Kju&8K@(Q2luX;$Ocd4L z;q60-Q%%yk^J)`#v{wczt1!6*aIep4&I5#hSDuXlvB5{Vusi>O^Et7(A`QXv&=e7% zwlf%8HIe}+g@JcPus3^;AKx}_4PdW~aN{11;6K9D&GN-1Ft;*U(;z>ykJY?Swb2*& z>n-X^%y_ZJu!53qQTJeYq2sK|O!hM13}Ux~3Z-@6JFgq1RB+vD^Du`V?C{Uvq#R1m z*voO|Tayb%pRc*i9-X?s{AAv|jZ3xJKYhU<{gw`yU+8ReU#cKEm6x|U8{&hd9pfe?EaB5R0s>&erD?e3dn+!Fej1AO9L_$y67@#c;Uus7vcKHg4pfM!Qds+F*?we#I{pXz3R@ zJ++VFM#r%UECv1>7nsTV8Z76H=aUURf>l)x zaDd#Zb#pZLF61i*I5nHIlKMnJgVRUj_{7<&fW|8-I=cC(MeTbQ*p!!c%76}r)q33q z+8%Mx$c_R72lH@-!*2ik3XFoFs#kV?3EAlyhNUzV=G`buC5~;JHJ=)756AE%KYuql z^!`H|q-Oh+9K)xMKlVT9*eO)QyDOnb+!+Rkw{owhWRbm!ZQ?$qL${)a^d63d z${MJq{FeRZy+?o0vLC}SnOn{y^kbsIg01syw<-$Rl ze(N9BIlb1>dHDQe_J?ual?f4`N-n-TUjnY#K2?*z>*YI|Gf1G4Zbc~Cfpi;KwjsyL z$>`p6rDew>v7n>vNSQA6JYDcp>F2Uc0wXg4tpwzq!}bKr#i-TjCEu>Y9r+Oqb`76p zZd;v{D_d+0MU!SH2r@Wq*f4N&H6+<-jkJl}H$D5s&gEMkW=1w>TODS^W1YI!)9cRj zp*Ls9-%%X0gN1cj^>5;E!>Tz zt9IfXu0IlOkCR3FW?gUw2vaEII%fzA@-G}ete8l7aL~8q?OjY^k4pr`JRKv%#4{)c zDuxErWK7B5xl9U8BHxfQv0ZEHY6@LLd1Lki@B}AVsV5s>_gF-BswkeUF11tJ|ID-I z-4pRSK+QzqK;j@b18DMA<%G&vrk$1hhp1L=TPtKr`OxRYRSyW2T*CdhHVyozZbg48 ze<`BFZ*?^Q(vFQL&2Q<=|2tV-ZQ5)VxV#J8jJs>PIz@{_4|(nfCwYfdRp+rV&+=QF zH+Z1ase3!qL>BJ%fS~Jl%`Pyo@y29~i@@^aa*69)`V3;6kd~yJwE9##1GoJ|w?ay` znD5PfZI&cB-wUSCn~@Xh8`0mK4FJRxe1=D%8Ev+=h`|=A-~)VmWPzhRy36Yw8V8y@ zQ+$spW2f!^5f!+IVYxqm14Vi?q<(B7C&^j~1;>`J6h~r$2(c|y(0rTIxTx7v`kjx$ zzTT7oR&YiK6}VsY!ZS!dkWx4ruyO_wVf=p5!4B@vx>(YcYWhtN{m}bJ1y;4fFwkpN zM_vWD27pvoV(LK(=yXIu!8L{uSFF;aq_B+?d%7+LQVvu8!9gh{Tul*y!nFRvI&$(* zO4Y=0{-pxRXjv&-yjhsXP=V%xnHOG><~WAkmSV<3|pjqK|+~ZoaW*v zr8wWu6`bsLgx``{kux(+(Zd8^_DzS}W1*&$;tlodR%budA7dG+Ap3bwPJuVA@ZYq( pm;*ftNfS3y7v=wr-3mOBV2)}&P9aL@zo#(48xEr z{cUB%O*`!BYV@RG=~Rm5rg?oAQIj#f+_Vo%ZsGTt=`Se#l^*> ztKQ7(ke0Q}$1S2G)LGuum(Yv({mIGbtMs2&aS@mK)q6juCeOZIRCcWYo}8R?x#;sb z?-*Vv+aDWqIyoy_Jg->!i=3&wSR{gPly8lUERA=4J^f>If-*WjJnTL*IbIDq{ONrZ zp?P$aJ9RWPG?X(nX|vOkx@NP|)s;K%7rv4hzoOsM)1$tznY3UX`}fFgIcU4`C}Ke^ z>hE8>6`$bYLzBhIg?_@8mKLRj#o(dg)|OhA@p6lKSNFaHRC&2?&$iXjP)$vZbN9}t z@d^D&yOAbB*HM+vLwQT-Ti`!`N=iyphJKs1Yz^e+e;wrTuAWyI*8kMmRsXvqKR+K- zySW&(IRu5uRc-Qi#Mb8HDOFc%mCVfrZM4P5L!nTi;`QdJD50{l#Kc5?#0tuNiLp8; zG2SQtM+r;*A~aqpDk=()+k^bF#Q1wAHo`n5>P@AOPjGPX>x>14_`f6i^FBU4M2S6U zakDNiE{xxM2!AwtI0?BpYSMeR+1c57Igs~CqpYl~UV2wyJC=0vBK7t4H8nN0G=+6F z>6Da|nyE*mrKRf#heSn1Yp@0rUggxFb@TD@m7sP1MyoQWv<3hG^z`(Ul$0OP6o`n3 zo^0&N+^~5Me4muS zaJeI{-*pa4i=}LC_l@jsRhK3O5vF<=Aq$)AN3YBDYV&cM#4SpE>@Z-ekDA*YS`M=C z%`(1xBM%+gD3>#7DA%f;WWV(~5kt&BI;O>M-(Rz~Dy*A%NOpe4UtN(a5{J&93Nw)6ht zf~shHSz?ViNv3ScKt!OXKMg1AcPmj0FGhpY%yERkDd-B=$~R7t80xvCNpmb9(!A4e za9)902WrI#R_g+Gj_#(LAi3{i@Yig8BefzW?+e_3T0anfd6l*Hrheu7Lvtf&$8mRU z2imi0KzjSR=sGM=s+&?Bitj@V--8%Q%*lM6K(O=G(pki2)aef{KVz~n#?Y=|eDpo= zN4=3m=*FNcR?}IZKMXkhOkfnOsC71Vk&ghAqLDI(UETM?;siNlpbHdqNh75GNkER*HSHv?t2E$J zsxhnXv?|RZeuot*>|BQg)rjlh$z?WmvaQHq)%xAufw=jRG zX+%LxSH{C{H=qUvrcsC-kib6fr0g3Ix>~q$Y#r-K2*b(peGjsW)5k>ZIEL31L#ZZC z2ZICw0$n6E!fV>W(t9a6&zUq|rC`;|avd!M1H!d&*!-=1U}T09&ai1zOxe$hlZveO zAY7+$&J?q#)70LCh+8Tc1@6D7`WylJO=X{;EAP%k>7!OrpWQiLrssn%^-KngjO;@b zWe00lrv*S_<`KsUNg3=vBRKebN7OMDiD9}CB;HC&L|;AI|GYD^PGP0`ls^OFntdI? z80w*YH~lMbh%cYB>|}Ugi`9qw67d-VQ{rH#5dg`Gd3t^Rj5lsQR}lXabYlZvjKOvw z#_#Uf2(KSw7W9?JI@q4E;bPHTgldU^hhHY3 zl!{VhE%dCRak;*>UDr-xgU=H3k%^-$jjv}q;QC@ps-mFapIe;z(y-d z@>D`e&MT4v&-*pB!~T{2zd6|`&N6ou<&<%@BTSGsD&ij-Mt#$h4G1VJyXm5fP43(X z0;AvfIJ&d#`Gx4P9nt0_P_oNi%QW5*%)VaFuesL(YKiHb|2iUB%CmxmCvjiwA@@}H zEqC|T40r_KQme$7Mnt#-whs(!aaKK@bxtL zYNFr)Mw(xgVdWpi&)oFJZR;SLQG0&b-<=mazKDqmSX!dgsFtD_TvK`7z@E^!+#P$l z+>)F{@ zll!?-!+uCRIrc>rTOelRm%)UZ(M!1}KwPF0nkFkq47`nZKLc37{vBLm9>G137tT#R z4&~cRVU?37gDC=V64xxOpbSGMUsztByUuZk(EE$Gw6Q@EwK4iAb1?0iLgtL^=98C3 zW9A8(L}=C|0e*5jiZ9h5ojJ+6aQTA5QahF`FOFTCE9Tj;H;m-xhj2YXwT7cr>$&;z zhVK{CLhPA9C~jYS;NUz(isJLW8^NkoA^}hvgXX>zJ3w%hL>;w#Z^;3Q)hkL#&9(C9 zRCSx|GP$X+gHg3<{k+BE)=HZOnBdfAYQep4fiF>GZD(%%2-38(C}ms}kaW?(1-4oE zbSE73(r3cmp`CZb>zTytk%?T=R2b*fRx-2 zd*VbW{p`ACeRV!9(_OW1$eA5JD}?A5Pg8%JUw}3%NCHL1-NDqsD!}=)ugzBmXsZRw zYgj;hCkomySGI#$LCpekM;zE-e`d;-UV}(&R#V{@`u)h_+Sr0j9?;4uzwXnQW7XWg ze+v9!HBdnlob;v16C^umkZSo&!LBFd{p_Eshgvsrf$vD6_Qb|ac;liD3U-3rnQ>5# zkRXTcUc$dtQ-b8Jj{_7degQxGf`D3K>kDxTrs6CPssbPsMaB!T!Nt|^+Y5YdCe(x9 zoK2M{4hO1@9Z(wtm$M!~8n-=zArhjiybU|Ozy3iQ&n!*ewNAVQS+_mb~vqZ`Bjc8jp{z6r+y^C!&oxl@t*JDu4nZ4D*1{F;iAJ}nwlt} z+_kd)qB4Q~#n^a*{uT9BKX~h9X$l;~Coqb1_}BU9UZMLXv@l%OV3@>jKC+qpalMqZ zKi`5^C~SfYozLx3l?0@21@#V5@beWAdc!K5p?pqFTJtXg*Cm<#om1P%HcBxUm(f%S z1r&G`Bt(^!F!hkd>GzQcC{p&8%i8lrkUtQ=Hyjp8`F1;t1CqTL>q2_GSs7K6iW7k~ zhpdme=I|P;3|GE8)awVkQJor+7^(P43f(y5{O8~P22{CRZ);)za$HBkuOiqYg~DJf zvAyuoGj*L8W9K6pFuBq_^4wK!gU&>F=UGdab0Qqc6`wdtfx&RGBIY~A63Z*XV;!|&8@FZ5RWLzrsVk)GzNf>hRdOwhGFlaAAh81T z)nsSre}Zs;km5bTG&>aHvAKYzWIXNxrKl*%CpsbT16E_-(>zNT zn!jftw&dW}8mxq}FAYS@t~Wq<{f3dRpFTi5x2ZDBriW|A#^jeMf0WrVAPi#6B%ls; zN`YD;QgCUUh+z>+M-dW}+&#bcQ0$6q{ADPhmJ0)z)gKkEU(^Xt1(-lSwmrDLVl{ze zBdK6E6q!HHJ@UqP>7wUWJmTma?thX)gY$4e$evI8!GPVH#ViuBV)Fqm8_S3$s*;9` zA}Hc=#It~HNq>wF#8(ppZ+moWrMO$FGei7wDAn}Yz?t}E-fl#CbJ3Ta+G{XvBVdW( z7U~er^gcWFxDFY{2HT~u@}fg0G}PfOkdr?sV21YWZ`K1$lzZqeyCxK{!~~Lwz~rmR zgm;eNbC(X_#q?^(-cC7HPMr+H6pJe0rkx~eM=v?oG6SK1t`5w1~WI3SJdx zJRBsO+^zaO$Fp^?^e+UqiGBiQr$IFYjImDX{1<-ONQ1$R@pTpv`iy9ba&|p1-RNAE zmyg1Li+WI~{cx|yMZwJY*lSXt-}SZE_^Be|gdiTw{Y%9?PcOS3sxW6f`L8Mz-f-Uu zaseNt=zYd4e8Mc?9`M&el9KBNY;}h6XH+Z|zxQp*W8f9ru0y<;IV;G%qe0pvK7mPL zEE0_ZIVSy8v?*=@p%j3;b`Dvg+U(fF7w-h?J-;le z2i^U0aXB>_9BFlUWVDM32mGS!>4EfNmijY4KR{qfd^JCilfbbE<0#V-WokUl49?;9 zUnKc!wZV!Uykl9rZ*Lsbgcghm+*~$lmXn2n;)HQOL zmJj)}oZCb`FSdk~hSq&zlk+4)Kxc_TNVI%+r>I^fp-!R=%1n+v6zC z*`4jaaeE-kXMJLA3bVo3&hv{XUH`DQYx{Mv`1ZJ1<3@6zS>*ogxLt4&4_DP0Z%OD<$y4^Dzl%~JQVb2?~DMuTgY1A z+!*di;=nb43N|4X>5;(zXzUr~*2-fdNa-{S!O$CzAP{vpF<9y$(a%m*&%riT$FGymeEdZ(lYAwOl1*~&msris3xO2#Plpw*cXtlMTvS7W! z0o2fDAJc~~#*|{fuJbE9C@bg+SIaC3c`Im&qiPO?<4p21BqE@x+!wLRi{g)S;-G(1 z@tVZNPeD0CJJYNu*7>H-=6=%^M_QClg|`d*s$PCR@Rlx*3saC6{LRFx1=>j_xAj^TjTJ?>k-KBwvkl-Rl%fW{4blK$P%$9EH^MU|IWXl5*#{O8|dS84_KA!|-42Q?epc-tQ&lyZbRT@TiWJa$-Z)qz= zKd-vJXV*Se^))ccY&)a0!vqb9{w^%6(8nUt+H-IL`pKB79z|ql!nL_;WCYr@V33l( zk5I(LJox`J5`k8o<{$g!v^W;bbIv%qXUl{)M_3m)etfV)$=!pWz(P0w*&a9CzkUa3 z)*FQnn+L?aw$m!zb5I!l1^@*4h|KR8inA#e<1eI8^==GZrNSNL69LxAad=zr`W<`p zWzTry>w#xno=%CWqi=H%(8jQDG0{-o1Yu67b0A=ia_IAuGmgG`7=~892cG;v+OIYC z!L54|*Hgqz`MGd_nXP!zb@fZDMC5pJ3*0oS@zsB7-^f0ybF$+WiLtH}|0VxKUMruy zHEtoDvw?Zs$?`e`dy)v^KF-ZfFa$Niw)7kAmgS0r%WFJasLCV;p{J1J+68Km+%bF- zeT8$x8~g0FL-(~R*a9Y9Bu(1HZ~OOcxXdu{?LckB!*U8*1P`Yc_<0Ab*XlR>$Q5CI zFb?s31p#*r1W@asI2sNRi7+1xry+Ex% zHN@33{qoxnha#o^m$hmpQ6wQBb?LBFG?pdM^qG>ZgKP9LL2u zq>V5G0Ut%vtzP?e0s|M@n#n<2ivb730pDt^S*h+?u^-3Ba~gG?&%j%Q06&Itv*5ue z3&2-B>HT4M)zI7flO`YTi&cz;tBE@gDJhPB>H3IIe5y>&8A7GL#K4&#tlb7D|$(|4QcS?oYycet1N^683-R7~HQuAQ| zNOHL>i3(99eZz2k{~J!c3EM= zjbr8N!7pG-PE*NAYOJnu3RMztOwOr;qsS{t#F7;oeXt#eJ|7=nYac=-D7^APG|ypN zFRUlGT|jSk+WxeYI~{&Cwu#OM=zIIuony3PdcK!zqTg1+6o!36$#{^ZGo7Xd)EK>5 z0Z;*WM@f#}X+$y0Jug}{p?E%tO-qvu}r1Vw-3Aopd0Nse@rh zRw$}~!1j*h`w1yWY3$u4$$1VEIebAcWefWw_HB0pC$cI6e#DdLjaaH5AnD~tTF~so z83zkGQ;=pfm{hRW7GEiLW3NrWF?g-rSGxLVYGx*W!-qM3{X=(&8PMVEQ}nhoqchP? z^(d6Ow~OJePPt6jtYlAYy6w-$YN&VMN0i#&l0grWdV1sGw2rQAGo{hs2?{WlRzk45 zoQgvKaMKvaOdEc-Vo%yiic0mK1;)LRDmgc2OX+kER+HL4OTPqI>@En30p|(`3X&dK%ie4 zYz*gEm83+^eaWixjWfS=D`ma`xju}ku^}2`rQc5noF{%>sxrsHFu6u|XuY&823Lq) zg9JgNv4GQuqv^eWD^8O|MvuY2VDD*FB;;X#iqu?L`unb8)!yusS99%!zLj_;A@d|& zdUJ7|$90r>x#5=tB;^@2M-^mcRlNchuIKI zR~Ij&yKUzeQcJyIW@e|p=VdJ$-}hL!)i0<~gT1@19NhCL(B2{5V-5+k=>)^|CYElQ zp=N%CM;rl>lomTbQW3MyBtM)1hcDG!n~WW%haOW_-zMsBEqn@qWgx8f=&1O#>RZ{f z-25Ldr^L!0ctUqbsO*yuse*rxrLlW~G7aXkI~E-yyx0)RV2oC_M=?F>0DG;1^wIe+5+xO^F& z%0P!PXj2b|f))FbmUSmjnhro(fX9ubG`JqS*~k>asudS3mJlRiM=MLoRZyj1xt5fc zRz{(Ez>~R3FJ~-ONW5VF$#Y#%&jOLiek!0l*b|KNMhD`bV1#_s!7I3&Nh0EO9~k=O zXxnq7@E1&F&5Jka-27IdQnSVY(Jl2Iv#^e=&jmFZ-0?1M?L^1b@9xXl^U^P<}`_?IQ1r$P77vxhUD7a$xg50X^qEh;_c^0pxP30;+J3tLx#Bw5XPx5Ot zA>_iZ9Hg>NKzCzs-EM6qiL9b0_}%3OrYf4%CVj&5;lek2Jz8ap_tnw<^LI5*lDO$0 zR;T{gAABZ94K}95+8N$FQP#xr62HBV%Xj1W^6x$p;k7}^8>C>Vgu+F`pM0_ecG?AY z`i2vs9C(bG+v*wL?o1G4pwn3-1}E*^O!Lgmc1z1NeABXStoiG*j?LJS)8hN#HTT@H1KI?urjJy^ z+Qfn+M_Ct#Qs1Jq9IsIl`i+NN7LYDWGDrGW3_en@7^{^|xY!;?enE}PUJW^nYJtGE zwWYC{dEs$`G#hwvyFfkOCL+~zaH)8gTr@d+VVUJ>&sjEV?|pTZ5CV@U-2RvO8sq}9 zrHVd_9Av&{Jm7O)WUyX1I1%udTw6F6*jyIa?PGIzK!r+O5BF1n7GXg+WqrLMES z_DLQ)%6yuUzGWlvK*>T2_C*UAFsgRsfmYpwF9j$#?m}krUnV*z_hjI7amX^z5#co< zeni{#xn2&oyo;e!H#|7FFoHSH1v(c0TL>8fH!ayL@sB*QFn_ejjXt}-xn_EP9uNk} z^STH2D9dZEfK#mkLII8;3&v>0n-?+fKkXNAWcv{q#wBpt8W}T!h6x&MI+ND+l*gYn z`ApLHW%Tki2cYZ{$i8@`Tw_RIY^SWEM+zdgDa4+EB-y{K&_cWv{yRMi=AAgk4zLr2nI>2+BB|75Hj^`eZ$~# zXYa`sS6x`WgrFBAIIQr2;|YP>y$R^Nh%|1w$@VsFMF-8#pR=#AMLm;X0pX1vRM3V? z*ZlKO#e^C8-Jfn;=^Xcod2Vef)})&@{5v}a4y%k-w)UPEf9LH9yc8A=>FOPAG4A$) zwf?)_I7@_cNfCeHsrt@PNck`o@L1MG(8nV&%CRAGx)O#S*Tw5LfC0Mua@@-t(oz=3 zKZ>L-*L2wK^x-lN{Cs<`{M#_9)arX< zd%xO5nDyv4bI5)JIJ{b9WG8t2tk~0%$yPAI^++#ut!Z??LAC#=a;6@ zr_nhJ45h+9ddA*! z(6HtZ2Uk1K*WDpjTnI$i{JSwGop7s9L0CcRUSG5b7L4*-JoM#soVnIMo8$T|N3CsZ z;7FiFZD0~Xeogt(=fM8@1=LK-FU!>X7yOAbZEfxw z7V21)6z-l|EJ3gUsAJvMVaC2&#W8BIS4E z*C07OUqgy6Q&UG7puFcdLIM4Ee{OZVIFur8XV^YFVXJk)4dWc`pKAztD|&EaOO)|T zS=JXHrmK;Z-xRNo4k|j;_ic9B=2Z1s(xFDhU&3|%^?5pO1U&Q=?E09)m`9w-1WLoT zc`enK#7uW{s=h#s|C!N$9}viZ`_5!8RRXaNWh5;JX0|=7-eJHbeg8o;mi`^z*-E_p z@PBFnjywpl$X)%6qj!{N$J+k2$rJNkSc-rwgxzDXY=KkwF(MqFxG;F#@^QF80aLZ6xkUyto=Yi~2Vxl-CE5F2#7k7F0>Wnq*s4z8@E z5f*dJLH5wkKm}Dd`K)Rt!wdcO3za4>7k@8V?+50;t`lD$#_1gl){_S(=hp0x>SHIm z%j^vvMov`fX0BZd&XlQ@q!?h1wCq|m)?>-qG0I*Ppbw?31uTA)ptTpHjsl>Bq|xuy z%zDPYzVP+fU_hv;BZIW*!yvG%s53K+2XlMZCt^Ig2egJgAJ7&L@TYNx`iK;X za6}e(DsSP%RMkw_iiZGOB;GHi4cdpP!&1wvp%6j)J0S`K34NGuOxH-g)9@iU<&WtDewHAE5#>@2zAIK$k{CorCa?GON1par0cpbK%5A_R#d*_5+amP8#)rE^~g;R@-_a{7tK` zr>v^~{k4zjGeL`|6p=r~{|xAdRckwd+{&_A^iBtwDnlD=Wt5u&sxCz9v8~1U|## zb*Gx+=n2zq5&Ep0c*-P^2+*EU`%uFKTI&ECCj%H1h{Nyb+I@9lWHRS^PVu~^N~FEO zmfQ2d$H&J(tl9K(0Ej~UAoq|(G2sDPmWp>LCwpTNp_y%$7l}bGMFa4JMSYLUc zY~qI4fnb-U>cc!eW>LK11)heID-Qv{a}A3~mQd1OJy=-1<1IP`arCw$Df^`C;&A*sqiH9jb{ zHTG3E2sUXUKmF;1&YE8G4QzTt<>jE%RyNOVYtZ>i(5>HBWViN#!}Q>pX~Z0Z$Z8j~ zQ}57+`^n=Hn_!hoC9V$NH@BePCuesEf6ofDQQGZg;Md!G@pJ&gp(UPHKhl+T2xI+l zFqNJA;-srd&(HsCm|KAF?*^yJoz>!BRcP|j0E?9i>=JY$1CwmNyIJ!12F^TULk*&X zP^yflCtKFTBsY(Iw8`p%YF|4@+Js<|0k_qx^o#DZQ)n$)T_kOdlzt~Ju(blC$8!v? zn>E7s>vviH_a}WqX+uuGXVuK5JCFhUp>RKuwhSJ(EP?4Kq{WvO(V*)wa>Q1hMc0li^|4csFUF1&rhf34=_hX; z{7`1O6H+(T3Tx!D-W_gAUcZagUDN9U7qxxwp(h+h_I}(^f(gn&99sUc&^J@3$oC;f z9aMk6_)*tnftc&H#hn_~{#QHkc45)2DPVl(=Lr69w;8X6cf&<5n(H=h{lhGFZODON zV@O~so~1zB>?6`sT7DEJ=!h(3SJ0s}^ydTa*VvbD@) z7X!vi)dzY=vnmU4Qhn+n!C105%rx>=LaL9cAr8)L>$+%q3~65sa>svBC-g?m(&?wK0}W)-nz4 z?Vi#VIRxwh4~n+_DLx^`g;=hohvUf2 z%6h)Lwl!+(?_2rcH)O#%q;ybO$p!OR=!$F2jeTNV{ARY)lO_0i7DVj7Ru8%Y1wiH{ z){r&@2`d=YmO8nuQF@#lH7nh4l_1h)lykBtsvY^qICuSq_u^#D;>T8)1Y=DAOl}jR z_ecf%?LXIGv*;=|ym;}Ztp7sg3g+ZLcObykROJ2)7UWi7P8$P{%ROc(wl5;rmtWmBus4jjC@JVI=pH9x+Zh^RMz5tKWAo9W4`${>9-K8wRlURTgph z+91Q@rY>OwYu~sio0Av-7cJ!g-R?3*QUw>}yO8_Iyi=sbP-)sIc*3RL7VM_cZE-it z<92-)CkoXweByOxW+|E1*9ms}RNex!7$(_ubVn>SiHE+Sb$0ig5pLc8oRJ_`;PG+x z$tD^)(tOJsZT?dNY9X7O>zn>EnnL{JB+cE%QUOREGsM{JZ-;v)Zqi|)HKmh*N&!$| zSvOM7n+Di$=HfO93i<9DoM5D`BH%Yd7+8e`0Y3U2i3(hQC`n0J4&Qx0>!%n1LEPrG2@S{`H z)CU+<%E?2{RC9+=2UhK0)tXY#gFUMwU;p@hc2IFJxvGjK1F(04wvfYg@m#+sk}egl zIX2X{SUbs1>%v7F0~qTr16ZNQMe$~AyoS9^7u|7Bdys321uk@krd7Eg?F)1WA_TeJ z<{NL!k8)5_M{$=bZI!^yV1S(a8Mf4jQn?q)cqE(eTUaM6%W5iM&^R3KE6QIvBWB;` zHz#q_b{J>Jt*2w%GKZxqCrJcKr`&plte_+|D)QPK_wtVf3UG2-r-<6MG519uUU(61 zJvS8&d9su~ti8r1=Dt1@4-OM3C?kpDBvAR;p!1t5CmMtUO!G`k|MT9RH&CTO&%N>e zMx|}tR)(GPOhco%*Ax1X;qKY}m`Pxp*n#QUvh%{guoHZCN>kq`-1@FWdAy z@#Kc7p&qjc)rT<7ooRcK$a$ML)7F64j|NuArT1BR6|LuCD^a3GCJOlKiYq|$#I&i|0>|%FiD`OPTM4K2C&#@K zOqi%$%w%Jc&x;hL-1&@JbLyRUw)}SOX;{>IuVdC+ZT(7PWOzw&OerrJK#d0Y-#5hG+yM&`!Mak1&-anprt6_-oi5#D3O zoJ9d;wTGH2+x8;?GZ%(a9~%S(7tuiUMcTVrJ$i8|jc@ONtQ>Z`v(T{h2XptCOloJ7*ODc@S8QjX?y@5~~O(UqQ$ZSjWX+~*H5EpJbYpou9#%M(NTL|T)&ETpuoJ(F4!+=i~XL$DzK~s zyJnA|@76rWp>y0np0a|deg~5jm009+I2^rQLN*hCkBGx;3H%iXxjlbXi6j3m9aRwO zIf@_t!9N-OSe!_Ic4j&7vmQY`8FRR}(<-WaN0N&-1Hy6;VVv9eHGfwBoF`SeXYn{=^H>Bq%fi`}2zu4@H!PX#GruHA<`{8`&x+&$%QL;Ws+FE8mO zkM_9T-mxI7#KKG?GF;atfwaq@Rszs|p7}*Pkf~|FNt>@m-#88KnQVNj3X9Juk-T<*#}7qqXe)@As!xT)3yXP){@Fj39Qf>C5?oc<_MHBLXP#L|UQOrk)n zrae*2?tOkiCwRa)^7Xvm+Yq4T4zFdCn=i{nc2RAvTo~{`rIiw<4Y^V%8GO}b&L)dp zWxv}At2}y4&w%j3Qe*vMx}L=`n8jNw*SN6BPFmT`fN?2JE=z_}b`4dmS4UJH#P%lY ztZFkBz_70D%R!R8kPgj|#cZyvL#8FD$Q{8!@iTYx60?Ed9_G-arcz#1<44$R3&0i2 zdUuYjO%&@dv#6sOI)oC0=z4XBLTn^sJbvn_ha9U*=xt(oECB{2Dirt>t=Y1L!o#^U8I~2rA@}=JE2xWUN$C$}E zGOs!Dql+=KjFzv04yu1u7hLBt%Int2 zxy6mFQN<&HTd`xm=(z+J3xvvI=2OAC{^ngCz4=Kuat2D_Hw4B_fwX?js-cRORC&;R z%1IlU@|QBn3W|k~VaZz5wS$j#X;$HBgD&ZLzW#IDSs+-!S(jrs6fLu&DEW{i;bYSkd93kl~9|jfzX30an(-&huhDP>EG)c zTK`@fSlu1;qK36{eVkr+)Xp4TG!EC*9c-$UE$zrWn8(CTx>Y&(FWLq@Kx%o+y_u4O_knjLdySe*+vjZjo#9nPJ+BwxY%}%k@L;q00yz;5y$l`prW;MwS&u z6aQO-_DX!H|HMZZm&WrWBcC-)JjXTu(WY}TnrA~cA zBWXi><2m!y@biao`+}QGoGIdino;|g)9_0U!TJSuZcIyqhrz?W5jWhJu?9$sWSfmq z?WhCSEV9teSV+HaszjAgxZ$uXHZskN1MX zBDeaHL&ER;Jt#@s+es)WOmG%dkJ5Q%OYNJY7rn?`zM6HK{QkXg)PkwbIoH=R7iqSJ z-|!#mHLjyh&KQ|9DwFZ9tCu;#`ydUweGaLN1a@pyd-s*!ZD3j=ZW?{Yo11@wt4mW; z5>J|^#P>eCuaJli7rB!+m3@PckOrzXelf}d8BZOgUpZo3SIsv~+E?SkZlm>J++Xd^ zF7ft}0?l5FxxkB&G>85fJMX0>GHP5H8cR8-o$yNorf}?$*)9dnFfXQinUBjNM`1hD zI{+xU%Baq7@e^#s8rmq_*3!F%0v>3Hnc#E+?gRW)N)7tzOdLlX?pk`?&ek_y9L{5I zATZ_(-V;f>**kCom_ICO;Yt@z?irQgXHQ++xD~lg_%GB$G6O%~ZM+U*Gr`$666kaY z+@s>d+_+0dQ!QJNUGfNAApx_D&bGX0*stTF`U7^^zheO%)GfGIMYfjC*Z3d|cSg%q0(HY5vZE z5siDDNEUpCUno#LqB>I1g65x9Q&yI$a^Hm6RHu)BUo}(jnHl}kXDq=^-hthfYq)u; zxrqK^y>jZ{Yk8wZ3D$N$&&3CUk*m0l%E{tPYEaE(+5dxGFO#h)X75f$c=LtT=E~nO zmW=9W-{A!^6gNv+M|oxytKDz1K`0JkGR$6HO&!1DtHWx-gjJgQh|~miy+}QVNpih8 z|Csr@SVBdd4q?EP#oJ(&R4lBja0+&jw}Y|C+$M$&6QHiq>K*de)s7N{d{n||i@AYq zGYRiS9C0#b46Uz}d&Q4D1MsE9+uuMpD zx{dZe$uv-&A?RQRJ+3p3gV=p}PTUE-e~B5@M%xkl@wbSKZ>B(iuJ~lsVb{t_>l??- zbXJ4jZ<(ZAJM6PSU*eH(WSg#W3a}60XqpcDa+M@foxdH@XspZCJaK`XJ4I*7ePs8? zp^bKx^@R}*NzmLcD12Ft&O9l5lHE`4c-P83SPB=6h7N|f3~60iCXzkb5Lr6kAM3K5 z59~8)hA&%#!}?H|=0Ex@u}X_bMt=*RzbJ5ICs)&t6!%>zjEwWbya?^okxHn zF3-##{>!erE}R^o`Y!Gx&Flvzp&y@CLo2a_W(N(w=F{c?MH-k295(}TvlJs=c%@o+ zC2qc;?0saJN?}Rvqs3*n?xbZNzf;xow$SBn$CZTaAYE@B zOl&$l)Stqa8}gy6;oU#Ld@DalLt)<>qQLPT!?ZK0gU)a`tZFama8z~Xcqv#JE2^Mg z@3-=?bE~XwAG0?zk^A;5`VA42f$sBed2c0K^l%<73mGFtY)%zKl&&E5ScM2oje@Nc z(>4&!U|06K%GoMw_th91FnlG2S|kyE1Tr&>fjWIZxHmQ}SY9NQjv>UlrdhU%-4qs- zeg;fN(|GBtaZNMIWaY@(?P>38p`Kb^E;9st9~esbI(!*@dHgTN6rL7?EY-?#TN~#a zCd+{fVexnzpb~v_+;_uQ6H$E5yQI;+*epy9Ay!=jesoa^=-+q@(<9#vSz3~~NT+5s zHYgoSDTKYZ*milYcam%SE@j)3s6jW<=lM`KRfU{m=&`U8APguXiEh)OCXu2z&>{r` zc6u{Ajc2cE04dnQe1`Ko{)QXY=LMhU_5~BV3X6I6&q5{6iJOI+h17jzrX-lZ5h*FX zBa;Cvsw`K!*h2_0OjrRyug0dHa#BF+7(l+lDxhA2iX6BDSma+1cY1I$&PD_Qu*F`` zvoQr8L=|$7n*XLdOgG1>=+5D>!uTG-WsVv3dc}IsBr=qelVJE!AQ$P0 z|K@RN(sgYDhT}+T0*mjPpKGGs3gUCa+jY3k;cCS0KgE`N#@XLwcEW-%=ts_eVnzH# z<-^g4@T)c2>3T%oY-*s@Msw~E07Gof(VUk!_urX^nyNw>y4cYicu&(!A+H9_d2md= zY>_}CSepFT6Fo|htw)#^a zO@4dBoT%_lBG5o&yqIp>osF+Z5`LtUIN@72g~FO@1^W_#CGlt;N;sqgiE>w-*r0Th znfRQf%TL&5lM4KLzbGX?bn&~s$ovNEf8}3Gg5MWH>Z#1PK+k82!)Acd7j2Q#n^asl zPX?65n9e@;V*=HtM_HiJbp8d^@_G-YyBh@a(HB?j3r65(ie^&Z{ikKkj zA2pvS(<5Fpf(kxR8tr58^vF(n@^!U$kP5)mfE|gu?~bu`pAGhGpVZrEs%?ZaW>mDd z_b*H9KJC>7-ZT@J`)VR71g(@ZVH%m-mOHt}$QQ6?U!vIKfgh}??*RjD8dkZ6rfY`k za)1KMmuu@IaCLUB??Am*ghr|<+`m%r6tRFOOfQ4W>z~=6;DuZLT+Sl(%UV&Yn6|de2CKBNF4$%~1h<^hV!lDh6Ythmh zD=1~u4`F1z+lheQE{dKYiUo=Ww8SKD)fqwIVC;pFXLMq;y^hpIT% zS5C=i*#~=*o5iTVFT8B|D^4u9J=;WS&{2`tBtk{{{Yp%Gm;85V#1dVKS-De6-1E*K zjx!X)ET6Nu|Gq-^MBd%Frg=Kt|U-;+5guxD-0IiN$#LXL zNS|@MdLwra(M)GlIL0l$=dCgk{6NzY*S{MsSUA5b?G~_96(4`ViRyi-u9jf?pFP65 z_JkRK&;IY8VLB$ze1^n^{5}r#h_kwe_%XthnCI%0z3E(je%wuYI7I1iRo;0|PTXc! zu;3aSYBnUUKc)FSK4&Acz^PQG`}*(TYP9T~L2Xi{x9i-bQZl}*m{N(?JGtG?%v-82 z_a5!+X$IBDNj)T6pr zL%QZTDNGfr%+xd{D?(u{5qvZf@Iav zWs0D0CH12ILaHW5r@{Y~lPz>JXq(BC{fwXa_=SkxIy{Bv6P1Y3a}UOf`)rDhn9kln zmAjp5M-qxC>O3+Yd3TD}Ih!%WKCLo$X1Z*O9NG#peSMi}|BJb^ii$I8)--Ox-Q60e zad!yNXyfkg7Cg91aED+Gjk~)`a0v+ncPD6&WH__dKXW~EbI#3oQR}ToWi;S|t_)FwycK#jxM zwi}vVhDc~YiV1#|Bh{e|g8lfz1}C zb#bb|RDN3i1h3tm&}LR@STPK@s$XP4Q7*f_+{lu1lj|9Ba4AEQ z+>X(XFgnVJrM?V;Q#`HzHDZUKpjn)sf@83AWoMpB&C&DcQ$7lw#>Gs+grrQ&M}Ke8 zH7I!-Hkw?9>4D;ef+?^WQcsk{g6tfN&}<#cMQ;jH0U9yKC@`hOWeRu1$Rw5Y#6#?m zpcxJdUHWJijlft0Zmfz@+;yh9@oo2SC@w)>SR&c@< zMG-Ys5)y~a8DfZ!3noGqK~r!8D4>0r#Hk?ODr6D;`5!Gn>Zzz5s|?dJrf4ksbgqa+;V!Yb31YHAgdy9_>I2Hp(U)RjB~| z8MerVJA1n3L$QpE_;li20x}n67+RuyYC4SU&@UG&v4rHy>cGgbF-D_VE5+cwnQPe> z%hq7)xhX@ecC9+v_Oby96;E~p@^v*Myba*RcWDcq`4m!vd^8|r0duFQej-#^w5Zcm zbW~wT{n78c*^YSl4fahi9&R*^(cIdS)t2>g2l`bAz>aVC~mf z|JU}os+Zy>!GGUn8v=k0wq8q!3%^*SM^ZqBYkpS2;e(+-S)6`E0Z(c(l3 zFmf3C4rjz<*bM`0M6CbtMLh9mOq8xAL>?kWu9Zz&VURA$OlmTO54&ZilM{!*kH)?Z z*kG$>!l|y{FhU5OcL!d-w}Nv;(URWu1OVkMMu~!iG?V3pF}*Y58blfwek&9w>dIkE zKj8?5KJl@4S+juT)aQxU0mwOVDmJnO<6N4ZPE+ZH19^2X#M!i(^8Khupi%C2xCTTN z_Z?qi+|pz;$QMFk(oaL_`KS@d;jOuVu{?CxOfc!6EReo?qkATRyyM)(YnN5aTq!au z9Z`hVUwuQ=3T<3Lt~rq;ux8SlJp;%fLbKchm*r2JP`7+74ib_Ku^uKF<(C0{jRs~+ z!J`xpS@7f2ge3B@u;WvY^RTlZ^%`8r^Gqf>>y<0u@W0c32P1`pg_IqLmSbF5x;-N_PoW+jwhiBN?R z7-S70{uwi%FFr=TF;CIK$d9;IG8v+FXM|y^yzoaq*R?51SM}#EdZqo@lT|ZeK`Fh# z{zno?jCS9joy8RmNZDLQgC-ACKMW&yg5sHQmo*zGjNRPZa0z#i)%!^hgdLwR!>fY4 z^a%5j7x?n0c}Fw`tB$bTcC{s=eUx)A7k+3pbY>Tf81}`>^d=01u8n;ys-Hh-wa&T( z1SFOGs)!8_SBP!C22;}xnR;R3yly*jWhP-!s<0`1G#BZzdr|$v&4}N=?fS|o+^2s{ z6M)vM-4VY#l(Fk%nzn;a@M)s*8a6@dC?j?ZfRj+Kb7k0pzDaqQvg+^kzpq@1RDk^2 z@ZGgRvTAZkfBmXJ`TxmToM~{C@2^{3>3{lq3^QCSfK9boJ!7BMwB#jv9rZzgEbLv+ z^1UIF5*57Tf>~Cs@QFw`B*IrVClxN9VOQ|OAWeBREyc9G1Nx2tf)TNp6WhFAv~Apu zo(I}imSytsh>CnVGdLl_Q*wu*t^=+{@=BIFDSH%FbRVTE>DwIxfo?(-EgQ#iJZK>- znoAdbj=;13B-ui0hi=Hcv>3ahiJBrs>he~04j#6TZ|6iy+2n`9-w_gm?=!#A#N9;U zxU`eh4m;g*Lr*>zvbJ5LTcZh}lE1Mi486_XZG*V|FH_B3fQp9)*Gxx8KTw#OnEVP^ zvKbjL+Uc?XI<=?*h8etaUA3No}lJ`mlZ-pAlUFvASUU%B*u(53f2amUrrYX=3 z?c05=Y0Dq5kRBtV=4`&(1fMC??5eP6Rs^KPW4cUq%_wiWA%EBuT+o{gmJP%HL=tr{ zY792!7XY_rEct~*?v8ZybxQ1?%4PMD1ofooNs2hiTjurzQT$p_O~0pN9J=HTbMf>N z5LkzaBcOvzDmC}x2usuU!ZPbCiio7#u0Fz= zp48Cbi$bLPGwzHe1P(P{CIOm4v}`u*6}vKGYr9cILCwTceKSE&Hq97tPY_{EdW0Ae zd^xZ2K~~XEco(*L!VDLasP6mQoGTbA=&*^(rIvVs$Fv`_<0)-qWd|$5fKr;R?U~GA zaM|n@?Nnk_e14SDH+MWWcvB8Fu}0ekycXq>-`F`-{7G;Xrq{7w6j`@C$ws7cm!|YY zg4IQ89C}IOfB6YQbrF|@sNRZBH_7t-UUYWXNu6S|;bon`rAq{sC+dk|l}^Y&5Xgaa zOt`>NA`p(4O*FDwke3%@lIIN~R^gLqoJAJia0ywU5coIqP9)dd-pjX$HFd8$B?}I7 zC3<%>CVLvN5gUR9HDg!=UG&TsJWbe~-=P4G#NsuWr0bS!4~WmyEW1O6JYYt^<^Yd! zppgK8tN*Q^xjeD}m`bZcK#-ghxr`%VeH!zz?}XwjZGDI*qf5vi2MWaKwQYI(P(TrI zR0GmN4u18J`ui0};EZqNn*^ORv|xx{vmAFx2u-DExOiy0xmr!$tBFPVflF3Z$DQSXs}4 z;)1UY%uvQbeo2DnQ*jKCe8xR`!bZ!Obs4ucx`Kq9T^I!c{54qR9FN*^PxY($ot&^E zUh)vSTlm8G*QF)%!t9g}W6aY#3smVis7DF%lxnIo8V)=P!di_XgiM(7m^P+y&6OQ~ zHA19=rK9V@Z=54$oLVvSaU@s)1XnhI!fNSZ6TZnolDLBy^UV*w;vu)u4u!Bcesww9 z?HCe^a16l$EoqZ%s)j1@Q*h5#B!8=IU2te0&n3*e3NCj$iX!kPHAfY)T?r& z#l#_c-r38YbRrkFAx3$rEZdt+1;SXi2L-D|ApoxpO4);A} z_Op9Yh1Qw|P*B>6#yOjjJ3W2KCKlrM)7Pgp_oEh#+ z=x|5QUfqrhE7i9e#f(>^9bDB~#0CB%DSmcwWzs%FJsW*dtDaeQfY{02|5=*j({4Sy z`#qjKF&1a%K=Ix$76f^I+6k&P00+Hlxitd03}*2CZf=hZT6Ko$D-g`g^Fa?ReqEjTeQaKOYK?%p69=Hgb|2C;xj?Jm;*L+)??OLsB zXKb4C0-9L=QuL!y3p*a2J>94d?LJ-2VKM3jTXNVYn%B>W%71UO!~j6O1Zxg+Mc;Tp}vG1xH{Xy4pz8LhCRcy$srvOOMMf9$f_}{ zo_^!mP!h2w9l`Z;6oCv`l#BI#mAm`Sb0E$E$#z(E6;F=MWg3~MKT2;Fi|5ceHxJYL zWhMuv+|`Wr$^vU+_uvRiVrDUDBhq4FU@nyp!^`(0+5SYUV-rP?_cP|Q##m}^NDyYj z&Eu|eCivPEPE%)6DM-plON60%`t zabHnGWtv1fq_Au)o+JXHW?~r1>X%SeqZc56i2%4bJG?tG_^Qfqu^n}yWhB$S5^Z`5 z6vQ1qg0}c%uq{I$xx18!yzs5Z1rM&zrg3+?@`7>XJ>8g?OI10lZMYXCLucG5)pNBY zLg^MZtbzUrGsViFxF%=SD>0&oyQL}+z!%3VWsr4zXeWx7ugW^395^|!K8o&i9qA^2 z7k84G@Ilp)zqdrQF%Bkq%M8Y}Fqm;e$fjXa%4HOv=!gIu4s!RKN|Y~6S83)-R&$ry z4BT(lm^%BzJcXxPu7+^s*dwAT^bH2%k!hz@tJyNDHCmP}?L$Bn1J#e>!#uN7QHm_J z6Xp86+i<6NM0V7(5;^NQ@b!ivuL8-uBqS|;fH||7qaQogs^6LdR zY>XITG^F!+hHKQ(O$%&{n=d8B&#=QVU=J&@6!|-+N(D0@Ep#I4pljrt^=by6n!2Sa z{cxb!0zpzJAPr|%Juxcc-njSU#dsv;Ce|3mZ}AY}Z&7h{X_C=&7$~fa9V0s_SCbqY zW?Q&Jlc~`qwSU@barx#G^%%p7FkzZQXP9AtH%^0*WX=qQyQ*2bZTlZh%%(zV#YKOP z;0R@W<619_Ia~}89rXyy%&1%pIGam5#vJO~;#oz2uiry|8TlXZ(jw<)4~T`m zxI}&YQkZX{*+P>(Vp#p$lWLI9nuF~y_?Zt@S@2GU2-8IpoBsFB$T~orm@1w+!AJ5g zgf67X7ALZcZ|UGpi)g1}ykMyB_{F!#CYV>Wfd;liI1630FrDOwUY-p7W~aXsuL!h)C6P{pWiHlrH|Ul+!O!GcJtATLo~ zDBqYG{dlpZ85B#bH5zx!)d(=8N7!>EK}dw`WcZ+USThJV!m9LEMzA5PNj!=Bj0_W5 zlsl34MUZkwE6@qv$o}F68@;N1evFoQO_LC#9s}o$H|i@9BkQ71L=!-`CawLJAn%tj zW82`M%*4;jbU;bjNyx{}D>?3zL2_Ue)_1iDY0i?YFRgo(6I*~Wy7(CT2-lbnk7UZG zq}X{qV#ux3X(X?CcRD3E3nP5H2Nu;DvA6=^6n%3K*{B=g06yfskWn(+ zj^JgSOq>mmM?NWe>opAPWRpz_%7(iR0eIs3(zW-9E2xir9HvH-)vObw@gE9_5>E%z zckt@KSwm>Pi0no|2M~eQ5sy&LmEFJz3%Dz0l)(-3+8=o=PY^}U9X7DAyvpVFgf9Es zvLZRMlm(8FzDeE)cmV&&ofA`k5UV6R0~a$Vb#VYoQzveG(|bGhFH|3IJm>%0j-xu_4!qlyk12 zpl1y&jv7x;hZ>qvs-PHiEE8k0Bb>8!5{eEE;HwPJ1;`97Wa#Sg5LY5KgxWU^@>O;G zg6m~xc+ON!}h<@1fgzjI6nAQ~J|8DtzIyvC=*pl=3QPGo{GjNFpZ7oz3T`FU+!tN51fr!LUIEH($oGN;|x zS`+kup&pp?bn)qQ(l~O3??EuO)Me>_4&)9M(g5Tki1bh@c@in+yxm0t;L`M;go;e% z-y`0#A>TNBP-u5t3xa1i9(OWd=oq*-6GH2%8$@MZOAUi{yin|CWq%Sc5FuWRb zj&SOLB?0SWi4gD?7^l#IQq}rfIzNl%t0siYv56W7wMRt4SYaY88l=k^i1c8( zc{6#S;D>RENLN#9v~U2%8A66H8W+w$nLetc6|IUsd*k+^AMO(v(y^4Hv`sdohL^C6 za)~o?JQ=d%JC&~AGKN?<{AIubVGR|uLT$Qb&;|f+^#5Jj`bQ>x|Hz~4?@rRHZ$w^P zJ@q?ctfD5bBA3WLTy$0*31Q4PLr9m#p>s7CjuAstE9#`UoY%*mJ?6Fvf7d{WB(ftN zy_eff1*V6sgi;Mfp-v_3cD+=CTC%1nG(7EiN}a_BV;hFUF|%8tCXZoMB^~V64^41n z*!iW!o!&s+kqvib8_PYZR7-z?osga*qnB>IZR6EZK1{R2-fyI!7(IO{*%AJzGDo`^ zHb22Wa;G$d@xI6lp9m4Pi(y21fH9#mo}1 zLvIA`D!PAhjb%ca+6{3&T`-cfk^yxUWgD2ieKW!wIiMIZ&f?AtCY5(4Cs!8 z&4!uml8gYuGcXf`NpG(|>)yVT?zbA+EiUr8$s@XaBp zh#^Y)7CTLwTd7bd3@DPO4mfHyCeqc&F3%GplK0BLhdN#FK`=3n56s-epu22u;J%*< zyCfWhICPxuTJ~Xj#Xz4RX_3t+We9*UCC`(zoNZMs@_##`RlrW8F7%+3ohB335b}-CmP^`(CFjj$Fe7f>BOky zfXr`RV0Fx+q!eXuW^PJi>{WnOT6`6btbG2F&f`+Jrtl}tePWNu9o^6Rvb~T9Sa*x* z6(mI?pTCGM^ll3iQf4!v@6527QZRtZnofHnD91-GPEnlnWMt-c16$rNGtUae+A|qN zG1H24P)d1?kC}lk4~)xnM`Dp!0_y{x&@e4X1?Oy6cQ=A*r>Mq=)8j=!@lgr26C z3M=L|RCt9*>%KVfPI_Xv`26pe0qbZY*+r+Ga1-264BHPfDx6{;Zj!cU~jEFU>KO zri^o83^&#GjMnoL9Re?eP;Ttv>9~1jDB~_nA%g@{XN;^ZO=oD60GK$~tL-PiO;v8U zm{87;Ju2ck1kXr#l1gGVqQIPOG~_Y(vt=?0cjn{L92~I*dj!I)C|ng1DO3cGeO9~4^3|2{Wop#O zzcuZvnY#)$@>XM5);3m@K^JK_#b4TjgDh%WKeIEm?y#uJL#!Ck`OXpd0HqA_R7mzJ zpoHx#_b)8!m4;gPQGg;}vKLFIKI;51)upsdyccmhvs%rba0&z zUGXZSS0!~*?HOpQqqE2fCfJ7u3vwX_BrFv#`I@2C*b(l=V|sr$h+mqIg=6xV84AIB zP{i4`W7v>ej0(n+FsQg4J$8Y(pw3w*4}LKOWBxUt!KcYJM8@aZwx1x~Y5^UxM9D*Z z@w)`6y@u1B4UmFA6dC!(mvym^E)2hS7>pbxsv$x2QZL`j$N^N&X}=zauMG~hgLX>- zz@USUD2zVrY^4pDU9s--6_D(EJ{<1K8cpGsRR@G>EGa7rk^>LkuJEL~(8>&7s%Bft zq!&3R*_qR82U`1lemgV${L55e&+H>}5)9!5A$S|q!Zi--(!}4&M*HF2MTg*#=Fs}I z=X#c8r)DI=H>UtlgVU;hz?v)GIphIQZuZhgWJ<$K@z^K%`&`YcJeSJ%9st!WR7?># zCm$-*zV$UZ)1AV9Ko-9*{=v6+W_d~cZN;1<6Be{HAxiNe@h%4hmUCB<(N@?P9IH~e zn>^;RBh5xM=phnMb>j9vJzKPn?~aLIk^Li*ln zGj)YVk^r)%cZ%0Z{ADgT<3+A}%1c13DhwQDi5b~8!mygs@0$+7w4HUfRWFZ{z)!$V z0)5vCvJI6n_ajw52(BcDTn!?(NOqtlk2khln}_Pe?rb<)7kzEe2B))VJF_&nvCw1Q zerKw_%>Yd)9MHl(3>+LEe=-cHfOQ}?LAa-#Fv-4W0|5z1Z zspR<}tn!AF=St`z{Hb)K`OrwJ8M69qxdzI|!{_KQ1DeS--~s=)neOX&bq{p74VQ0djiQX><0AZTCq$47XiXQ?$qg za)FvnX7$kOy+Webjdy!FJXj@Ahh^exK~7gy4%9OT%~r%)g$MjzEURlJ-cgs3vc>L(BrAZfwe1ZfOZ?R4jRe731F5nxz`QuEqH*|0=>K*zzz zs~S@n7t;RKL1*zqOir{;Ngjwota*SI#aN?>MYPQJ?^kf(?{CXdfCiBfIMZymKo*z8 z`X^lIcvOT6o+oW6lrXQcrIKV*64f$69QmyD(k9O1W~1dKTmzKRsTrm5rAZCq5%k1% zy#S9JD6Cs>_MVdxGeW>H=vcFva{OAkmJ(n6{pyc#-+GZiFcbLO@8Kf|^9FCgmXq?e zfmblGfK*JxY9$M@_5|s3pMm!%!UZ#Wr|?V|nezHddGCahDj|kpYOQ{p~(ux0HL$mV+kqFH<~vJ=l0$sn&(^y0GoIG>r86r8Vxhw8wgNED_PGOQV?6E8CfT( zi!9{oDS+1Wtx`s6kJwRoGD89%8`T1&6BpE5+QplS097?wW(|lz;akfTrque&~BQNAX-(B)JiafjlB9$ z^kGM><_t9Hw3OLEdIr~GX86R#tdv-<6eIzsp6?84u&5*@px&>FpTJYctGONEcVce( zCHm>N5Kt~w3*w-L=*9^~7w{-^C zy38X8ulB|MdN_ml?GLwHtfWk9#RmsYupQ)eT>Ng*y8z(jk|(d`YNWI5-Nk>ty2h3} z5&E@pPi{^}=0-F!C0fmk>cxJeR%&7{4WI;S5$f*#`oP_Kt!?*jEn2+Qg-edNbMpf23WSROp?5K;4^0t1KGDPIPdzK3Ni z5=-oh5|PNJj2CTXXlYBhHlC$Fa+fR2HLNP!91#qP^;HvjN#|$~i=6*4o{Y>+0zeFt z_6h;xi&Q5S$`MpzWw(2jT-IM~iLzBE@Y{{N)J;hLqXht?1-F%*2>#}-6@#11f?XHiH1PrNehSEE|a61v;NZq-q|4=`PA7l}K_1kP`w1^Wrw303MI>I?! z`(QB;lq7u%8AE&1(NN$pqR6GH*VKKvplrGq;YH@vvngj=>g}o7f@K} z$^vl;FesB8@{9O@sa~tuxzS(9s=35v&CH6ZfjyD>lUH3aS{zR616?3>Rmss>!dG5I z@P-`HlWCvATRNMLmf#)z9RDXCiVE-y_S(CFkLihHCD4h)AT?E8{ih;=@ zb3*_#2Tr5Q@e;2mvlB{q_Fj>I#FrTr$bh<7{~*>?1f!V}I;=3T)fpn2i*SsTs9x3y zU+u=kDJ|7mz;B(9sU#~Gw|;4kM*HqaD=Ja5f$3*t=gU+>?9rJlnj7MeL$hVyoK<*g zQFw-hy(y}0xLRL-(!FFa!mN^1F}?p!>gfN@4g35iWB}g51hIRwG{szZL?k!VF)C-( z3|70CPx)u6gw2`Yaan)h2j0V3dYuV_DHdc?LxN6ov8%mvYw`yTr7>9RA9+S=ZGVQ` ze&eG7Z_Y`WCN3yIex?BQO7+GfH1w;Pl?cnP7-qgLdoFqPxi)A?xaQ*4@kF-D*aD6x z@NY>=c8UzMbAz_P%U;~V!29T{UJSfNSCa3mpvfs~QHM&T8!blTJYkCO=a_+1S>`ee zYpB(Yf?IJ5MV_p)w<`#sNo@o~&|75v41R=~3I*<=q}{AcAo$Uk(cQS(_)z#@vS}tf z?7Gr97xH!4XvopJe)p5Ji?VO-`wkq|T`a4mJur|ZFADLT8L2D?G^15M75xR$Xly?p zx}7RIpg~6Fd0{ALvll@p4++a@%k-AUY?dWA?1qaGJbBOxsABeRQZ^}zq{F3Da7nIB zeuW!Tl+xa;(Mdp6u3ZxRV+HA^P|W&j!ZLV8%d@e=@}^ruNGqyZVz@K?Dh`sze!)p@b#K`|~4PI4rhi(?*|`BcLis05KbKZjlc^n% zQN5atc0&gnq=|-hnAx1Z<1@HT5NVw;i4gxvZqoSLcoQ3f~L#Ho|D(Qag3v(FAQ%5U$zn3Ewfct^4hNpQjq!~!GL?0vJ#spuIj%^wIWyQ z-%#cudA~T>j6rLclO0@6-#gZd3r8wnT=Yo{K{Pb-L__@udzI{v8gUq^Oc)2Lc*l0) zHcpgk9_LZ~h4i2)78`bBW>(@g5A&c_WFr-BITqhfjgku|*^9=O()s*G`jd+ z_U9?vj<+G)T}eOYT!Gf`Qg>)zmn)0?<#j{QALsrNhrKv}e!G6Ak6D%(4;7(JP)a$0 zQ|SYCO%AZC50$?zd1L*D#q{hR_d7zxpwb!jsAHk<14}{x$op&k#UbX_Co(W4u(gFB zB-g8E*J@p11@@~ul4&Sf7G)Kj%%T~?-6aK^ZQXUueaC=e4{hzCl4%BzLqM+2uv(?O zmuu06{?t<~jEbyXkI~)M6>ZsZu8%>CZ2_q*D*~VlhW@E^9fI&18Xdf4Y$b+i?)k1U ze2%!xv!b6tKLH#&$ShRhfTbMK@*jj+L*i?1IF(GqSXwj&JO^xI7Tz<2V0y%8>)em1 zOHux&n8oR>36oJ!au`p4l=ko3{wSG_p%^Cd7Wy)g^F~AMnVqBfP>(wIIbsJ`EYI9; z4GDWj+w_*v(XZgT@TN=HDjD$M&L0WAsa-xW+gX;M4yhq1w&&_4T`ID+zC02%S#s6z zx8HoqsS9(6DO%6Do`b0v6+w?e&-&{J9b@eFa0}_S(e(CnGLeh*gTY9#Y$y7CTNJ+0B+2hy<&h~QMM zr*aU=8iX~}GPor?**)zf+jE7fDWq0+Hp-&E9d)11}T0#p&`gW7)c3<)b_5?wjxMj(Idx7gCGrCxTrc!U3;Zqn^OMg1?tTUEo}xA~88zyELYvv!aV(lkKg4)6=5Doy)buE= zY_N%NS}JxHeUdxHNkrBUn@&u3%)M4YW7UeqeBfZsvJcBKttmlkXD5`^`lNt`T_jPd z;9Jqc^=%kq1=1Rt zC54+WS~<=q;w}4X;T~$qNE4wtIr!7KP|gkv#zNx1AG6?4ncpQ%0DBKHR>?5vv+k7RvJ&Ryj~hJEJuO9IHHQz9(- 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 J Date: Sat, 3 Dec 2022 09:35:52 +0100 Subject: [PATCH 02/21] Remove tags --- .../api/service_worker_api/using_service_workers/index.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index b4e100c64fe09cc..41e86659b3fc9ee 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -2,12 +2,6 @@ title: Using Service Workers slug: Web/API/Service_Worker_API/Using_Service_Workers page-type: guide -tags: - - Guide - - Service - - ServiceWorker - - Workers - - basics --- {{DefaultAPISidebar("Service Workers API")}} From 20e9fbc0f9410b91e5cb1c84611109397da3aa26 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Sat, 3 Dec 2022 20:45:46 +0100 Subject: [PATCH 03/21] fix indent --- .../using_service_workers/index.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 41e86659b3fc9ee..e4f88397a955010 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -178,41 +178,41 @@ Let's look at a few other options we have when defining our logic (see our [Fetc 1. The {{domxref("Response.Response","Response()")}} constructor allows you to create a custom response. In this case, we are just returning a simple text string: - ```js - new Response("Hello from your friendly neighborhood service worker!"); - ``` + ```js + new Response("Hello from your friendly neighborhood service worker!"); + ``` 2. This more complex `Response` below shows that you can optionally pass a set of headers in with your response, emulating standard HTTP response headers. Here we are just telling the browser what the content type of our synthetic response is: - ```js - new Response( - "

Hello from your friendly neighborhood service worker!

", - { - headers: { "Content-Type": "text/html" }, - } - ); - ``` + ```js + new Response( + "

Hello from your friendly neighborhood service worker!

", + { + headers: { "Content-Type": "text/html" }, + } + ); + ``` 3. If a match wasn't found in the cache, you could tell the browser to use {{domxref("fetch()")}} to get the default network request for that resource, to get the new resource from the network if it is available: - ```js - fetch(event.request); - ``` + ```js + fetch(event.request); + ``` 4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using {{domxref("CacheStorage.match","match()")}}, like this: - ```js - caches.match("./fallback.html"); - ``` + ```js + caches.match("./fallback.html"); + ``` 5. You can retrieve a lot of information about each request with the properties of the {{domxref("Request")}} object given by the {{domxref("FetchEvent")}}: - ```js - event.request.url; - event.request.method; - event.request.headers; - event.request.body; - ``` + ```js + event.request.url; + event.request.method; + event.request.headers; + event.request.body; + ``` ## Recovering failed requests From ff2394c5a3790041bfb3b1ac691535e187ab68f7 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Mon, 5 Dec 2022 16:37:53 +0100 Subject: [PATCH 04/21] Redo fetch diagram in SVG --- .../using_service_workers/index.md | 19 ++++++++++-------- .../using_service_workers/sw-fetch.png | Bin 20662 -> 0 bytes .../using_service_workers/sw-fetch.svg | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.png create mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index e4f88397a955010..2e33c61ad7c8996 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -30,7 +30,8 @@ With service workers, the following steps are generally observed for basic set u 2. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. 3. The service worker is now ready to process events. 4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. -5. When the `oninstall` handler completes, the service worker is considered installed. +5. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. + >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). 6. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. 7. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. @@ -38,13 +39,13 @@ With service workers, the following steps are generally observed for basic set u Here is a summary of the available service worker events: -- `install` -- `activate` -- `message` +- [`install`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/install_event) +- [`activate`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/activate_event) +- [`message`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/message_event) - Functional events - - `fetch` - - `sync` - - `push` + - [`fetch`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/fetch_event) + - [`sync`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/sync_event) + - [`push`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/push_event) ## Demo @@ -172,7 +173,7 @@ Now you've got your site assets cached, you need to tell service workers to do s `caches.match(event.request)` allows us to match each resource requested from the network with the equivalent resource available in the cache, if there is a matching one available. The matching is done via URL and various headers, just like with normal HTTP requests. -![Fetch event diagram](sw-fetch.png) +![Fetch event diagram](sw-fetch.svg) Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) @@ -437,6 +438,8 @@ Note that in this example we download and cache the same data for the resource w If your service worker has previously been installed, but then a new version of the worker is available on refresh or page load, the new version is installed in the background, but not yet activated. It is only activated when there are no longer any pages loaded that are still using the old service worker. As soon as there are no more such pages still loaded, the new service worker activates. +>**Note:** It is possible to bypass this by using [`Clients.claim()`](/en-US/docs/Web/API/Clients/claim). + You'll want to update your `install` event listener in the new service worker to something like this (notice the new version number): ```js diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.png b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.png deleted file mode 100644 index db70305dd16a9f0de28fa04907b58521d378c67e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20662 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

Hello from your friendly neighborhood service worker!

", - { - headers: { "Content-Type": "text/html" }, - } - ); - ``` + ```js + new Response( + "

Hello from your friendly neighborhood service worker!

", + { + headers: { "Content-Type": "text/html" }, + } + ); + ``` 3. If a match wasn't found in the cache, you could tell the browser to use {{domxref("fetch()")}} to get the default network request for that resource, to get the new resource from the network if it is available: - ```js - fetch(event.request); - ``` + ```js + fetch(event.request); + ``` 4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using {{domxref("CacheStorage.match","match()")}}, like this: - ```js - caches.match("./fallback.html"); - ``` + ```js + caches.match("./fallback.html"); + ``` 5. You can retrieve a lot of information about each request with the properties of the {{domxref("Request")}} object given by the {{domxref("FetchEvent")}}: - ```js - event.request.url; - event.request.method; - event.request.headers; - event.request.body; - ``` + ```js + event.request.url; + event.request.method; + event.request.headers; + event.request.body; + ``` ## Recovering failed requests From 6b4ed4440043c4c2a9b7d02a579f7f4ee3b51be2 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Mon, 5 Dec 2022 16:37:53 +0100 Subject: [PATCH 12/21] Redo fetch diagram in SVG --- .../using_service_workers/index.md | 19 ++++++++++-------- .../using_service_workers/sw-fetch.png | Bin 20662 -> 0 bytes .../using_service_workers/sw-fetch.svg | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.png create mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index e4f88397a955010..2e33c61ad7c8996 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -30,7 +30,8 @@ With service workers, the following steps are generally observed for basic set u 2. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. 3. The service worker is now ready to process events. 4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. -5. When the `oninstall` handler completes, the service worker is considered installed. +5. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. + >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). 6. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. 7. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. @@ -38,13 +39,13 @@ With service workers, the following steps are generally observed for basic set u Here is a summary of the available service worker events: -- `install` -- `activate` -- `message` +- [`install`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/install_event) +- [`activate`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/activate_event) +- [`message`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/message_event) - Functional events - - `fetch` - - `sync` - - `push` + - [`fetch`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/fetch_event) + - [`sync`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/sync_event) + - [`push`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/push_event) ## Demo @@ -172,7 +173,7 @@ Now you've got your site assets cached, you need to tell service workers to do s `caches.match(event.request)` allows us to match each resource requested from the network with the equivalent resource available in the cache, if there is a matching one available. The matching is done via URL and various headers, just like with normal HTTP requests. -![Fetch event diagram](sw-fetch.png) +![Fetch event diagram](sw-fetch.svg) Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) @@ -437,6 +438,8 @@ Note that in this example we download and cache the same data for the resource w If your service worker has previously been installed, but then a new version of the worker is available on refresh or page load, the new version is installed in the background, but not yet activated. It is only activated when there are no longer any pages loaded that are still using the old service worker. As soon as there are no more such pages still loaded, the new service worker activates. +>**Note:** It is possible to bypass this by using [`Clients.claim()`](/en-US/docs/Web/API/Clients/claim). + You'll want to update your `install` event listener in the new service worker to something like this (notice the new version number): ```js diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.png b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.png deleted file mode 100644 index db70305dd16a9f0de28fa04907b58521d378c67e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20662 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

r{c4prsoE=eWF%PQlH)SmUFL=-!y!0^JNb*BAk zz;(6Q{=35TmQ=^pm2OfdF9bD6#(jS@2rpeoa~ow;Z#*;|Fcl>qI@98mSHY^&oK)a) zC!6&fqfO6=;0C7G`oMwd(SzR=cNruA<1pyDM3X!T`W8KCE(H(_5@KP-LVkumrU-P! z(4qOc)(wM)ij}$Z=xq5PP&Y4%yB#??m6A1b{C<>F&OX3JgL=5TVsr3 zXPw8JGSi|Or+vYSL4|m8L0VJ;=K?iYQTDU|Zw99&KP`3S@ZSuVZz_noy&zFio6ts! zB1;E$movY_p9;fo!lK$tQDoD3vb#H7LyYQ8E9=+JCDavU`;RH|4#sXrpT3s-bD2NL z2JU0reYehWn28(6J3FcaNDfv0%{lrX%Ku;fnU8vSO+0spe|NIr+0spxAc3BiktSBd HDf<5ajxZ!h diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg new file mode 100644 index 000000000000000..d50a37adaff3455 --- /dev/null +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg @@ -0,0 +1 @@ +Pages in the service worker scopePages in the service worker scopeService worker installed and activatedService worker installed and activated1.1.4.4.The service worker sends back the custom response.The service worker sendsback the custom response.event.respondWith()event.respondWith()2.2.The page requests a resource (possibly located at another origin)The page requests a resource(possibly located at another origin)fetcheventfetch eventThe service worker intercepts the requestThe service worker intercepts the request3.3.The service worker fetches a custom response from possibly different sourcesThe service worker fetches a customresponse from possibly different sourcesInternetInternetStorageStorageLogicLogicText is not SVG - cannot display \ No newline at end of file From 6f7af097208ec24f48af4f325e1167cebf6ed817 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Mon, 5 Dec 2022 16:53:13 +0100 Subject: [PATCH 13/21] Fix SVG --- .../using_service_workers/sw-fetch.svg | 669 +++++++++++++++++- 1 file changed, 668 insertions(+), 1 deletion(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg index d50a37adaff3455..fcaeefc21dbf0db 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg @@ -1 +1,668 @@ -Pages in the service worker scopePages in the service worker scopeService worker installed and activatedService worker installed and activated1.1.4.4.The service worker sends back the custom response.The service worker sendsback the custom response.event.respondWith()event.respondWith()2.2.The page requests a resource (possibly located at another origin)The page requests a resource(possibly located at another origin)fetcheventfetch eventThe service worker intercepts the requestThe service worker intercepts the request3.3.The service worker fetches a custom response from possibly different sourcesThe service worker fetches a customresponse from possibly different sourcesInternetInternetStorageStorageLogicLogicText is not SVG - cannot display \ No newline at end of file + + + + + + + + + + + + + + + + + + + Pages in the service worker scope + + + + Pages in the service worker scope + + + + + + Service worker installed and activated + + + + Service worker installed and activated + + + + + + 1. + + + + 1. + + + + + + 4. + + + + 4. + + + + + + + The service worker sends back the custom response. + + + + The service worker sendsback the custom response. + + + + + + + + + event.respondWith() + + + + + event.respondWith() + + + + + + 2. + + + + 2. + + + + + + + + The page requests a resource (possibly located at another origin) + + + + The page requests a resource(possibly located at another origin) + + + + + + + + + fetch + +event + + + + + fetch event + + + + + + The service worker intercepts the request + + + + The service worker intercepts the request + + + + + + 3. + + + + 3. + + + + + + + The service worker fetches a custom response from possibly different sources + + + + The service worker fetches a customresponse from possibly different sources + + + + + + + + + Internet + + + + + Internet + + + + + + + + + Storage + + + + + Storage + + + + + + + + Logic + + + + + Logic + + + + + + + + + + + From efc3ccf487e3e8567d85e10eebcdd45656f38ec1 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 13:30:55 +0100 Subject: [PATCH 14/21] Redo lifecycle diagram --- .../using_service_workers/index.md | 15 +++++++-------- .../using_service_workers/sw-lifecycle.png | Bin 42662 -> 0 bytes .../using_service_workers/sw-lifecycle.svg | 5 +++++ 3 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.png create mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 2e33c61ad7c8996..befeeb83ed5b39a 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -26,16 +26,15 @@ Service workers are enabled by default in all modern browsers. To run code using With service workers, the following steps are generally observed for basic set up: -1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. -2. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. -3. The service worker is now ready to process events. -4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. -5. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. +1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. +2. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. +3. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). -6. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. -7. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. +4. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. +5. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. +6. Whenever a new version of a service worker is fetched, this cycle happens again and the remainings of the previous version are cleaned during the new version's activation. -![lifecycle diagram](sw-lifecycle.png) +![lifecycle diagram](sw-lifecycle.svg) Here is a summary of the available service worker events: diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.png b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.png deleted file mode 100644 index 9f1290446d70f16239c4731e4b7deb24a25e954a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42662 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≻eU$gyq~J;}jy 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 diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg new file mode 100644 index 000000000000000..0b91db6e1471683 --- /dev/null +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg @@ -0,0 +1,5 @@ +Service worker fetchedand registeredv1v1Pages loaded in the browser (client)Pages loaded in the browser (client)Scope of pages for the service workerScope of pages for the service workerregister(workerURL,{options = scope})register(workerURL,{options = scope})0. Initial situation, no service worker0. Initial situation,no service worker1. Registration of thefirst version of a service worker1. Registration of thefirst version of aservice workerService worker fetchedand registeredv1v12. Installation2. Installation +installeventinstall eventevent.waitUntil()event.waitUntil()Setting up caches, offline assets, etc.Setting up caches, offline assetsv1v1Service worker installedbut not controllingv1v13. Waiting for clients to be closed3. Waiting for clientsto be closedService worker installedbut not controllingv1v14. Activation4. Activation +activateeventactivate eventFinishing setup, cleaning old resources for previous versionsFinishing setup, cleaningold resources for previous versionsService workercontrolling documentsin its scopev1v15. Activated5. Activated +functional events(e.g.fetch)functional events(e.g. fetch)CacheCachev1v1v1v1v1v1Using cacheUsing cachePrevious versionv1v16. Replacement6. Replacement +Old cache:purged during v2 activationv1v1New version: will control pagesonce installed and activatedv2v2New cache:populated during installationv2v2Text is not SVG - cannot display \ No newline at end of file From 582577ba24e359f79a77242fb0f1486638abb717 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 13:40:29 +0100 Subject: [PATCH 15/21] Fix word spacing --- .../using_service_workers/sw-lifecycle.svg | 1757 ++++++++++++++++- 1 file changed, 1752 insertions(+), 5 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg index 0b91db6e1471683..8ea0465f515f153 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg @@ -1,5 +1,1752 @@ -Service worker fetchedand registeredv1v1Pages loaded in the browser (client)Pages loaded in the browser (client)Scope of pages for the service workerScope of pages for the service workerregister(workerURL,{options = scope})register(workerURL,{options = scope})0. Initial situation, no service worker0. Initial situation,no service worker1. Registration of thefirst version of a service worker1. Registration of thefirst version of aservice workerService worker fetchedand registeredv1v12. Installation2. Installation -installeventinstall eventevent.waitUntil()event.waitUntil()Setting up caches, offline assets, etc.Setting up caches, offline assetsv1v1Service worker installedbut not controllingv1v13. Waiting for clients to be closed3. Waiting for clientsto be closedService worker installedbut not controllingv1v14. Activation4. Activation -activateeventactivate eventFinishing setup, cleaning old resources for previous versionsFinishing setup, cleaningold resources for previous versionsService workercontrolling documentsin its scopev1v15. Activated5. Activated -functional events(e.g.fetch)functional events(e.g. fetch)CacheCachev1v1v1v1v1v1Using cacheUsing cachePrevious versionv1v16. Replacement6. Replacement -Old cache:purged during v2 activationv1v1New version: will control pagesonce installed and activatedv2v2New cache:populated during installationv2v2Text is not SVG - cannot display \ No newline at end of file + + + + + + Service worker fetched + and registered + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + + + Pages loaded in the browser (client) + + + + Pages loaded in the browser (client) + + + + + + + + + + + + Scope of pages for the service worker + + + + Scope of pages for the service worker + + + + + + + + + register(workerURL,{options = scope}) + + + + + register(workerURL,{options = scope}) + + + + + + + + 0. Initial situation, no service worker + + + + + + 0. Initial situation,no service worker + + + + + + + + 1. Registration of the + + + first version of a service worker + + + + + + + 1. Registration of thefirst version of aservice worker + + + Service worker fetched + and registered + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + + 2. Installation + + + + + + 2. Installation + + + + + + + + + + install +event + + + + install event + + + + + + + + + + + + + + + event.waitUntil() + + + + event.waitUntil() + + + + + + + + + + + + Setting up caches, offline assets, etc. + + + + Setting up caches, offline assets + + + + + + v1 + + + + v1 + + + Service worker installed + but not controlling + + + + + + + + + + v1 + + + + v1 + + + + + + + + 3. Waiting for clients to be closed + + + + + + 3. Waiting for clientsto be closed + + + Service worker installed + but not controlling + + + + + + + + + + v1 + + + + v1 + + + + + + + + 4. Activation + + + + + + 4. Activation + + + + + + + + + + activate +event + + + + activate event + + + + + + Finishing setup, cleaning old resources for previous versions + + + + Finishing setup, cleaningold resources for previous versions + + + Service worker + controlling documents + in its scope + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + 5. Activated + + + + + + 5. Activated + + + + + + + + + + + + functional events + + + (e.g.fetch +) + + + + + + + functional events(e.g. fetch) + + + + + + + + + + + Cache + + + + + Cache + + + + + + v1 + + + + v1 + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + + + + Using cache + + + + + Using cache + + Previous version + + + + + + + + + v1 + + + + v1 + + + + + + + + + + 6. Replacement + + + + + + 6. Replacement + + + + + + + + Old cache: + purged during v2 activation + + + + + + v1 + + + + v1 + + + New version: + will control pagesonce installed and activated + + + + + + + + + + v2 + + + + v2 + + + + + + + New cache: + populated during installation + + + + + + v2 + + + + v2 + + From d207815fd219a62f6cff3af3343eb3bdb34e1edd Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 13:47:46 +0100 Subject: [PATCH 16/21] Remove xref macros --- .../using_service_workers/index.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index befeeb83ed5b39a..b77979d93763d3c 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -26,7 +26,7 @@ Service workers are enabled by default in all modern browsers. To run code using With service workers, the following steps are generally observed for basic set up: -1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. +1. The service worker URL is fetched and registered via [`serviceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register). If successful, the service worker is executed in a [`ServiceWorkerGlobalScope`](/en-US/docs/Web/API/ServiceWorkerGlobalScope); this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. 2. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. 3. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). @@ -84,7 +84,7 @@ registerServiceWorker(); ``` 1. The `if`-block performs a feature detection test to make sure service workers are supported before trying to register one. -2. Next, we use the {{domxref("ServiceWorkerContainer.register()") }} function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) +2. Next, we use the [`ServiceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register) function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) 3. The `scope` parameter is optional, and can be used to specify the subset of your content that you want the service worker to control. In this case, we have specified '`'/'`, which means all content under the app's origin. If you leave it out, it will default to this value anyway, but we specified it here for illustration purposes. This registers a service worker, which runs in a worker context, and therefore has no DOM access. You then run code in the service worker outside of your normal pages to control their loading. @@ -109,7 +109,7 @@ This could be for the following reasons: After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — {{domxref("cache")}} — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. +The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/fr/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. Here's how our service worker handles the `install` event: @@ -136,7 +136,7 @@ self.addEventListener("install", (event) => { }); ``` -1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a {{domxref("ExtendableEvent.waitUntil()") }} method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. +1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a [`ExtendableEvent.waitUntil()`](/en-US/docs/Web/API/ExtendableEvent/waitUntil) method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. 2. Inside `addResourcesToCache()` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. 3. If the promise is rejected, the install fails, and the worker won't do anything. This is OK, as you can fix your code and then try again the next time registration occurs. 4. After a successful installation, the service worker activates. This doesn't have much of a distinct use the first time your service worker is installed/activated, but it means more when the service worker is updated (see the [Updating your service worker](#updating_your_service_worker) section later on.) @@ -174,9 +174,9 @@ Now you've got your site assets cached, you need to tell service workers to do s ![Fetch event diagram](sw-fetch.svg) -Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) +Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about [`Request`](/en-US/docs/Web/API/Request) and [`Response`](/en-US/docs/Web/API/Response) objects.) -1. The {{domxref("Response.Response","Response()")}} constructor allows you to create a custom response. In this case, we are just returning a simple text string: +1. The [`Response()`](/en-US/docs/Web/API/Response/Response) constructor allows you to create a custom response. In this case, we are just returning a simple text string: ```js new Response("Hello from your friendly neighborhood service worker!"); @@ -193,19 +193,19 @@ Let's look at a few other options we have when defining our logic (see our [Fetc ); ``` -3. If a match wasn't found in the cache, you could tell the browser to use {{domxref("fetch()")}} to get the default network request for that resource, to get the new resource from the network if it is available: +3. If a match wasn't found in the cache, you could tell the browser to use [`fetch()`](/en-US/docs/Web/API/fetch) to get the default network request for that resource, to get the new resource from the network if it is available: ```js fetch(event.request); ``` -4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using {{domxref("CacheStorage.match","match()")}}, like this: +4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using [`match()`](/en-US/docs/Web/API/CacheStorage/match), like this: ```js caches.match("./fallback.html"); ``` -5. You can retrieve a lot of information about each request with the properties of the {{domxref("Request")}} object given by the {{domxref("FetchEvent")}}: +5. You can retrieve a lot of information about each request with the properties of the [`Request`](/en-US/docs/Web/API/Request) object given by the [`FetchEvent`](/en-US/docs/Web/API/FetchEvent): ```js event.request.url; @@ -315,11 +315,11 @@ self.addEventListener("fetch", (event) => { We have opted for this fallback image because the only updates that are likely to fail are new images, as everything else is depended on for installation in the `install` event listener we saw earlier. -## Service Worker Navigation Preload +## Service Worker navigation preload If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManager) feature starts downloading resources as soon as the fetch request is made, and in parallel with service worker activation. This ensures that download starts immediately on navigation to a page, rather than having to wait until the service worker is activated. That delay happens relatively rarely, but is unavoidable when it does happen, and may be significant. -First the feature must be enabled during service worker activation, using {{domxref("NavigationPreloadManager.enable()", "registration.navigationPreload.enable()")}}: +First the feature must be enabled during service worker activation, using [`registration.navigationPreload.enable()`](/en-US/docs/Web/API/NavigationPreloadManager/enable): ```js const enableNavigationPreload = async () => { @@ -334,7 +334,7 @@ self.addEventListener("activate", (event) => { }); ``` -Then use {{domxref("FetchEvent.preloadResponse", "event.preloadResponse")}} to wait for the preloaded resource to finish downloading in the `fetch` event handler. +Then use [`event.preloadResponse`](/en-US/docs/Web/API/FetchEvent/preloadResponse) to wait for the preloaded resource to finish downloading in the `fetch` event handler. Continuing the example from the previous sections, we insert the code to wait for the preloaded resource after the cache check, and before fetching from the network if that doesn't succeed. From 5fdd1a9fe47027f11960c87879eb179496fa0c10 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 14:48:20 +0100 Subject: [PATCH 17/21] Padding for SVG --- .../using_service_workers/sw-fetch.svg | 338 +++++----- .../using_service_workers/sw-lifecycle.svg | 626 ++++++++++-------- 2 files changed, 504 insertions(+), 460 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg index fcaeefc21dbf0db..6d6d5f7f8de7f0b 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg @@ -1,11 +1,10 @@ + id="defs144" /> + inkscape:current-layer="svg140" /> + id="path2" /> - - - + id="path4" /> + id="path6" /> + style="stroke-width:1.69348" + id="path8" /> + style="stroke-width:1.69348" + id="path10" /> + + id="path14" /> + id="path16" /> + transform="translate(-42.395 -1.5)" + id="switch20"> Pages in the service worker scope + id="text18">Pages in the service worker scope + transform="translate(-42.395 -1.5)" + id="switch24"> Service worker installed and activated + id="text22">Service worker installed and activated + transform="translate(-42.395 -1.5)" + id="switch28"> 1. + id="text26">1. + transform="translate(-42.395 -1.5)" + id="switch32"> 4. + id="text30">4. + id="path34" /> + transform="translate(-36.64 -15.31)" + id="switch42"> The service worker sendsback the custom response. + id="text40">The service worker sendsback the custom response. + id="path44" /> + id="path46" /> + transform="translate(-42.395 -1.5)" + id="switch50"> event.respondWith() + id="text48">event.respondWith() + transform="translate(-42.395 -1.5)" + id="switch54"> 2. + id="text52">2. + id="path56" /> + id="path58" /> + transform="translate(-42.395 -1.5)" + id="switch70"> The page requests a resourceThe page requests a resource(possibly located at another origin) + y="434.5" + id="tspan66">(possibly located at another origin) + id="path72" /> + id="path74" /> + transform="translate(-42.395 -1.5)" + id="switch80"> fetch - event @@ -390,15 +382,15 @@ event x="422" y="287" font-family="Helvetica" - font-size="18px" + font-size="18" text-anchor="middle" - id="text2385">fetch event + id="tspan76">fetch event + transform="translate(-42.395 -1.5)" + id="switch84"> font-family="Helvetica" font-size="18" text-anchor="middle" - id="text2389">The service worker intercepts the request + id="text82">The service worker intercepts the request + transform="translate(-42.395 -1.5)" + id="switch88"> font-size="24" text-anchor="middle" font-weight="bold" - id="text2393">3. + id="text86">3. + id="path90" /> + transform="translate(-45.848 -36.026)" + id="switch98"> font-size="18" text-anchor="middle" style="font-size:18px;font-family:Helvetica;text-anchor:middle;fill:#000" - id="text2411">The service worker fetches a customThe service worker fetches a customresponse from possibly different sources + id="tspan94">response from possibly different sources + id="path100" /> + id="path102" /> + transform="translate(-42.395 -1.5)" + id="switch106"> font-family="Helvetica" font-size="18" text-anchor="middle" - id="text2419">Internet + id="text104">Internet + id="path108" /> + id="path110" /> + transform="translate(-42.395 -1.5)" + id="switch114"> font-family="Helvetica" font-size="18" text-anchor="middle" - id="text2427">Storage + id="text112">Storage + id="path116" /> + transform="translate(-42.395 -1.5)" + id="switch120"> font-family="Helvetica" font-size="18" text-anchor="middle" - id="text2433">Logic + id="text118">Logic + style="stroke-width:1.69348" + id="path122" /> + style="stroke-width:1.69348" + id="path124" /> + style="stroke-width:1.69348" + id="path126" /> + style="stroke-width:1.69348" + id="path128" /> + style="stroke-width:1.69348" + id="path130" /> + style="stroke-width:1.69348" + id="path132" /> + style="stroke-width:1.69348" + id="path134" /> + + style="stroke-width:1.69348" + id="path138" /> + id="path116-7" /> diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg index 8ea0465f515f153..b59c94fb5e236a5 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg @@ -1,9 +1,8 @@ + inkscape:current-layer="svg434" + showguides="true"> + + and registered v1 Pages loaded in the browser (client) Scope of pages for the service worker register(workerURL,{options = scope}) 0. Initial situation,no service worker + sodipodi:role="line" + id="tspan1292" + x="96" + y="53">0. Initial situation:no service worker 1. Registration of thefirst version of aservice worker + sodipodi:role="line" + id="tspan1310" + x="96" + y="288">1. Registration of thefirst version of aservice worker and registered v1 2. Installation - + id="text108">2. Installation install + + event @@ -495,7 +517,7 @@ event x="918" y="555" font-family="Helvetica" - font-size="19" + font-size="19px" text-anchor="middle" id="text120" style="word-spacing:3px"> id="tspan118">install event event.waitUntil() x="1071" y="618" font-family="Helvetica" - font-size="14" + font-size="14px" text-anchor="middle" id="text158">Setting up caches, offline assets v1 @@ -693,7 +715,7 @@ event font-family="Helvetica" pointer-events="none" text-anchor="middle" - font-size="14" + font-size="14px" id="g170"> id="text168">but not controlling v1 font-family="Helvetica" font-size="14" text-anchor="middle" - style="-inkscape-font-specification:'Helvetica, Normal';font-family:Helvetica;font-weight:400;font-style:normal;font-stretch:normal;font-variant:normal;font-size:14px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14px;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000000" id="text190">3. Waiting for clientsto be closed + sodipodi:role="line" + id="tspan1306" + x="96" + y="773">3. Waiting for clientsto be closed id="text196">but not controlling v1 x="96" y="983" font-family="Helvetica" - font-size="14" + font-size="14px" text-anchor="middle" - id="text214">4. Activation - + id="text214">4. Activation activate + + event @@ -939,7 +968,7 @@ event id="tspan224">activate event font-family="Helvetica" font-size="14" text-anchor="middle" - style="font-size:14px;font-family:Helvetica;text-anchor:middle;fill:#000" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14px;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000000" id="text234">Finishing setup, cleaningold resources for previous versions + sodipodi:role="line" + id="tspan1322" + x="918" + y="1028">Finishing setup, cleaningold resources for previous versions id="text242">in its scope v1 x="96" y="1178" font-family="Helvetica" - font-size="14" + font-size="14px" text-anchor="middle" - id="text264">5. Activated - + id="text264">5. Activated style="font-size:14px">(e.g.fetch + + ) @@ -1140,7 +1176,7 @@ event font-family="Helvetica" font-size="14" text-anchor="middle" - style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:14px;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000" + style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:14px;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000000" id="text280"> id="tspan276">fetch) x="1071" y="821" font-family="Helvetica" - font-size="19" + font-size="19px" text-anchor="middle" id="text292">Cache v1 v1 v1 font-family="Courier New" font-size="19" text-anchor="middle" - style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:18.6667px;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000" + style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:18.6667px;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#000000" id="text338">Using cache Previous version v1 x="96" y="1393" font-family="Helvetica" - font-size="14" + font-size="14px" text-anchor="middle" - id="text362">6. Replacement - + id="text362">6. Replacement pointer-events="none" id="path366" /> pointer-events="none" id="path368" /> pointer-events="none" id="path370" /> font-family="Helvetica" pointer-events="none" text-anchor="middle" - font-size="14" - id="g380"> + font-size="14px" + id="g380" + transform="translate(-1.1122807,22.192983)"> id="tspan376">activation v1 @@ -1614,40 +1650,47 @@ event font-family="Helvetica" pointer-events="none" text-anchor="middle" - font-size="14" - id="g394"> + font-size="14px" + id="g394" + transform="translate(-1.1122807,22.192983)"> New version: + id="text386">New version: will control pagesonce installed and activated + sodipodi:role="line" + id="tspan1316" + x="725.5" + y="1513.5">will control pagesonce installed and activated v2 font-family="Helvetica" pointer-events="none" text-anchor="middle" - font-size="14" - id="g422"> + font-size="14px" + id="g422" + transform="translate(-1.1122807,22.192983)"> id="tspan418">installation v2 From 532770af34ed7b5752b592fae8c6b35056f42045 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 15:08:10 +0100 Subject: [PATCH 18/21] typo fr --- .../web/api/service_worker_api/using_service_workers/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index b77979d93763d3c..35631abcfbfdc49 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -109,7 +109,7 @@ This could be for the following reasons: After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/fr/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. +The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/en-US/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. Here's how our service worker handles the `install` event: From f2812249e4aec565190f0c326d73b15533d75b0f Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 15:10:37 +0100 Subject: [PATCH 19/21] Apply suggestions from code review Co-authored-by: Onkar Ruikar <87750369+OnkarRuikar@users.noreply.github.com> --- .../api/service_worker_api/using_service_workers/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 35631abcfbfdc49..b3cce0369b4c145 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -32,7 +32,7 @@ With service workers, the following steps are generally observed for basic set u >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). 4. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. 5. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. -6. Whenever a new version of a service worker is fetched, this cycle happens again and the remainings of the previous version are cleaned during the new version's activation. +6. Whenever a new version of a service worker is fetched, this cycle happens again and the remains of the previous version are cleaned during the new version's activation. ![lifecycle diagram](sw-lifecycle.svg) @@ -138,7 +138,7 @@ self.addEventListener("install", (event) => { 1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a [`ExtendableEvent.waitUntil()`](/en-US/docs/Web/API/ExtendableEvent/waitUntil) method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. 2. Inside `addResourcesToCache()` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. -3. If the promise is rejected, the install fails, and the worker won't do anything. This is OK, as you can fix your code and then try again the next time registration occurs. +3. If the promise is rejected, the installation fails, and the worker won't do anything. This is OK, as you can fix your code and then try again the next time registration occurs. 4. After a successful installation, the service worker activates. This doesn't have much of a distinct use the first time your service worker is installed/activated, but it means more when the service worker is updated (see the [Updating your service worker](#updating_your_service_worker) section later on.) > **Note:** [The Web Storage API (`localStorage`)](/en-US/docs/Web/API/Web_Storage_API) works in a similar way to service worker cache, but it is synchronous, so not allowed in service workers. @@ -149,7 +149,7 @@ self.addEventListener("install", (event) => { Now you've got your site assets cached, you need to tell service workers to do something with the cached content. This is easily done with the `fetch` event. -1. A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross origin request to embed an image, that still goes through its service worker.) +1. A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross-origin request to embed an image, that still goes through its service worker.) 2. You can attach a `fetch` event listener to the service worker, then call the `respondWith()` method on the event to hijack our HTTP responses and update them with your own content. @@ -218,7 +218,7 @@ Let's look at a few other options we have when defining our logic (see our [Fetc So `caches.match(event.request)` is great when there is a match in the service worker cache, but what about cases when there isn't a match? If we didn't provide any kind of failure handling, our promise would resolve with `undefined` and we wouldn't get anything returned. -After testing the response from the cache, we can fallback on a regular network request: +After testing the response from the cache, we can fall back on a regular network request: ```js const cacheFirst = async (request) => { From 9127b523310c3d522a74fd1eb6244e509d5dc002 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 15:13:05 +0100 Subject: [PATCH 20/21] Installation as a noun per @OnkarRuikar's review --- .../web/api/service_worker_api/using_service_workers/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index b3cce0369b4c145..c4201f56b6baacf 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -6,7 +6,7 @@ page-type: guide {{DefaultAPISidebar("Service Workers API")}} -This article provides information on getting started with service workers, including basic architecture, registering a service worker, the install and activation process for a new service worker, updating your service worker, cache control and custom responses, all in the context of a simple app with offline functionality. +This article provides information on getting started with service workers, including basic architecture, registering a service worker, the installation and activation process for a new service worker, updating your service worker, cache control and custom responses, all in the context of a simple app with offline functionality. ## The premise of service workers @@ -109,7 +109,7 @@ This could be for the following reasons: After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/en-US/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. +The `install` event is fired when an installation is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/en-US/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. Here's how our service worker handles the `install` event: From d0d73b76f4b7e4d05b03ce9c7cfb6b14b0dffeda Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Sat, 17 Dec 2022 21:28:01 +0100 Subject: [PATCH 21/21] Apply review suggestions from @wbamberg --- .../using_service_workers/index.md | 87 ++++--------------- 1 file changed, 18 insertions(+), 69 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index c4201f56b6baacf..7ec364bc596b864 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -12,11 +12,9 @@ This article provides information on getting started with service workers, inclu One overriding problem that web users have suffered with for years is loss of connectivity. The best web app in the world will provide a terrible user experience if you can't download it. There have been various attempts to create technologies to solve this problem, and some of the issues have been solved. But the overriding problem is that there wasn't a good overall control mechanism for asset caching and custom network requests. -Service workers fix these issues. Using a service worker you can easily set an app up to use cached assets first, thus providing a default experience even when offline, before then getting more data from the network (commonly known as "offline first"). This is already available with native apps, which is one of the main reasons native apps are often chosen over web apps. +Service workers fix these issues. Using a service worker you can set an app up to use cached assets first, thus providing a default experience even when offline, before then getting more data from the network (commonly known as "offline first"). This is already available with native apps, which is one of the main reasons native apps are often chosen over web apps. -A service worker functions like a proxy server, allowing you to modify requests and responses, replace them with items from its own cache. - -> **Note:** Before service workers, a previous attempt at fixing those issues was AppCache. This API has been deprecated and removed from browsers, and should not be used anymore. +A service worker functions like a proxy server, allowing you to modify requests and responses replacing them with items from its own cache. ## Setting up to play with service workers @@ -24,14 +22,13 @@ Service workers are enabled by default in all modern browsers. To run code using ## Basic architecture -With service workers, the following steps are generally observed for basic set up: +With service workers, the following steps are generally observed for basic setup: -1. The service worker URL is fetched and registered via [`serviceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register). If successful, the service worker is executed in a [`ServiceWorkerGlobalScope`](/en-US/docs/Web/API/ServiceWorkerGlobalScope); this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. -2. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. -3. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. - >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). -4. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. -5. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. +1. The service worker code is fetched and then registered using [`serviceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register). If successful, the service worker is executed in a [`ServiceWorkerGlobalScope`](/en-US/docs/Web/API/ServiceWorkerGlobalScope); this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. +2. Installation takes place. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. +3. When the `install` handler completes, the service worker is considered installed. At this point a previous version of the service worker may be active and controlling open pages. Because we don't want two different versions of the same service worker running at the same time, the new version is not yet active. +4. Once all pages controlled by the old version of the service worker have closed, it's safe to retire the old version, and the newly installed service worker receives an `activate` event. The primary use of `activate` is to clean up resources used in previous versions of the service worker. The new service worker can call [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting) to ask to be activated immediately without waiting for open pages to be closed. The new service worker will then receive `activate` immediately, and will take over any open pages. +5. After activation, the service worker will now control pages, but only those that were opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. To override this default behavior and adopt open pages, a service worker can call [`clients.claim()`](/en-US/docs/Web/API/Clients/claim). 6. Whenever a new version of a service worker is fetched, this cycle happens again and the remains of the previous version are cleaned during the new version's activation. ![lifecycle diagram](sw-lifecycle.svg) @@ -48,7 +45,7 @@ Here is a summary of the available service worker events: ## Demo -To demonstrate just the very basics of registering and installing a service worker, we have created a simple demo called [simple service worker](https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker), which is a simple Star Wars Lego image gallery. It uses a promise-powered function to read image data from a JSON object and load the images using [`fetch()`](/en-US/docs/Web/API/Fetch_API/Using_Fetch), before displaying the images in a line down the page. We've kept things static and simple for now. It also registers, installs, and activates a service worker. +To demonstrate just the very basics of registering and installing a service worker, we have created a demo called [simple service worker](https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker), which is a simple Star Wars Lego image gallery. It uses a promise-powered function to read image data from a JSON object and load the images using [`fetch()`](/en-US/docs/Web/API/Fetch_API/Using_Fetch), before displaying the images in a line down the page. We've kept things static for now. It also registers, installs, and activates a service worker. ![The words Star Wars followed by an image of a Lego version of the Darth Vader character](demo-screenshot.png) @@ -84,10 +81,10 @@ registerServiceWorker(); ``` 1. The `if`-block performs a feature detection test to make sure service workers are supported before trying to register one. -2. Next, we use the [`ServiceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register) function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) +2. Next, we use the [`ServiceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register) function to register the service worker for this site. The service worker code is in a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) 3. The `scope` parameter is optional, and can be used to specify the subset of your content that you want the service worker to control. In this case, we have specified '`'/'`, which means all content under the app's origin. If you leave it out, it will default to this value anyway, but we specified it here for illustration purposes. -This registers a service worker, which runs in a worker context, and therefore has no DOM access. You then run code in the service worker outside of your normal pages to control their loading. +This registers a service worker, which runs in a worker context, and therefore has no DOM access. A single service worker can control many pages. Each time a page within your scope is loaded, the service worker is installed against that page and operates on it. Bear in mind therefore that you need to be careful with global variables in the service worker script: each page doesn't get its own unique worker. @@ -109,7 +106,7 @@ This could be for the following reasons: After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The `install` event is fired when an installation is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/en-US/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. +The `install` event is fired when an installation is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/en-US/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. The contents of the cache are kept until you clear them. Here's how our service worker handles the `install` event: @@ -147,7 +144,7 @@ self.addEventListener("install", (event) => { ### Custom responses to requests -Now you've got your site assets cached, you need to tell service workers to do something with the cached content. This is easily done with the `fetch` event. +Now you've got your site assets cached, you need to tell service workers to do something with the cached content. This is done with the `fetch` event. 1. A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross-origin request to embed an image, that still goes through its service worker.) @@ -174,46 +171,6 @@ Now you've got your site assets cached, you need to tell service workers to do s ![Fetch event diagram](sw-fetch.svg) -Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about [`Request`](/en-US/docs/Web/API/Request) and [`Response`](/en-US/docs/Web/API/Response) objects.) - -1. The [`Response()`](/en-US/docs/Web/API/Response/Response) constructor allows you to create a custom response. In this case, we are just returning a simple text string: - - ```js - new Response("Hello from your friendly neighborhood service worker!"); - ``` - -2. This more complex `Response` below shows that you can optionally pass a set of headers in with your response, emulating standard HTTP response headers. Here we are just telling the browser what the content type of our synthetic response is: - - ```js - new Response( - "

Hello from your friendly neighborhood service worker!

", - { - headers: { "Content-Type": "text/html" }, - } - ); - ``` - -3. If a match wasn't found in the cache, you could tell the browser to use [`fetch()`](/en-US/docs/Web/API/fetch) to get the default network request for that resource, to get the new resource from the network if it is available: - - ```js - fetch(event.request); - ``` - -4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using [`match()`](/en-US/docs/Web/API/CacheStorage/match), like this: - - ```js - caches.match("./fallback.html"); - ``` - -5. You can retrieve a lot of information about each request with the properties of the [`Request`](/en-US/docs/Web/API/Request) object given by the [`FetchEvent`](/en-US/docs/Web/API/FetchEvent): - - ```js - event.request.url; - event.request.method; - event.request.headers; - event.request.body; - ``` - ## Recovering failed requests So `caches.match(event.request)` is great when there is a match in the service worker cache, but what about cases when there isn't a match? If we didn't provide any kind of failure handling, our promise would resolve with `undefined` and we wouldn't get anything returned. @@ -322,15 +279,8 @@ If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManage First the feature must be enabled during service worker activation, using [`registration.navigationPreload.enable()`](/en-US/docs/Web/API/NavigationPreloadManager/enable): ```js -const enableNavigationPreload = async () => { - if (self.registration.navigationPreload) { - // Enable navigation preloads - await self.registration.navigationPreload.enable(); - } -}; - -self.addEventListener("activate", (event) => { - event.waitUntil(enableNavigationPreload()); +self.addEventListener('activate', (event) => { + event.waitUntil(self.registration?.navigationPreload.enable()); }); ``` @@ -464,13 +414,13 @@ self.addEventListener("install", (event) => { }); ``` -While this happens, the previous version is still responsible for fetches. The new version is installing in the background. We are calling the new cache `v2`, so the previous `v1` cache isn't disturbed. +While the service worker is being installed, the previous version is still responsible for fetches. The new version is installing in the background. We are calling the new cache `v2`, so the previous `v1` cache isn't disturbed. -When no pages are using the current version, the new worker activates and becomes responsible for fetches. +When no pages are using the previous version, the new worker activates and becomes responsible for fetches. ### Deleting old caches -You also get an `activate` event. This is generally used to do stuff that would have broken the previous version while it was still running, for example getting rid of old caches. This is also useful for removing data that is no longer needed to avoid filling up too much disk space — each browser has a hard limit on the amount of cache storage that a given service worker can use. The browser does its best to manage disk space, but it may delete the cache storage for an origin. The browser will generally delete all of the data for an origin or none of the data for an origin. +As we saw in the last section, when you update a service worker to a new version, you'll create a new cache in its `install` event handler. While there are open pages that are controlled by the previous version of the worker, you need to keep both caches, because the previous version needs its version of the cache. You can use the `activate` event to remove data from the previous caches. Promises passed into `waitUntil()` will block other events until completion, so you can rest assured that your clean-up operation will have completed by the time you get your first `fetch` event on the new service worker. @@ -500,6 +450,5 @@ self.addEventListener("activate", (event) => { ## See also -- [The Service Worker Cookbook](https://github.com/mdn/serviceworker-cookbook) - [Promises](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) - [Using web workers](/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)

r{c4prsoE=eWF%PQlH)SmUFL=-!y!0^JNb*BAk zz;(6Q{=35TmQ=^pm2OfdF9bD6#(jS@2rpeoa~ow;Z#*;|Fcl>qI@98mSHY^&oK)a) zC!6&fqfO6=;0C7G`oMwd(SzR=cNruA<1pyDM3X!T`W8KCE(H(_5@KP-LVkumrU-P! z(4qOc)(wM)ij}$Z=xq5PP&Y4%yB#??m6A1b{C<>F&OX3JgL=5TVsr3 zXPw8JGSi|Or+vYSL4|m8L0VJ;=K?iYQTDU|Zw99&KP`3S@ZSuVZz_noy&zFio6ts! zB1;E$movY_p9;fo!lK$tQDoD3vb#H7LyYQ8E9=+JCDavU`;RH|4#sXrpT3s-bD2NL z2JU0reYehWn28(6J3FcaNDfv0%{lrX%Ku;fnU8vSO+0spe|NIr+0spxAc3BiktSBd HDf<5ajxZ!h diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg new file mode 100644 index 000000000000000..d50a37adaff3455 --- /dev/null +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg @@ -0,0 +1 @@ +Pages in the service worker scopePages in the service worker scopeService worker installed and activatedService worker installed and activated1.1.4.4.The service worker sends back the custom response.The service worker sendsback the custom response.event.respondWith()event.respondWith()2.2.The page requests a resource (possibly located at another origin)The page requests a resource(possibly located at another origin)fetcheventfetch eventThe service worker intercepts the requestThe service worker intercepts the request3.3.The service worker fetches a custom response from possibly different sourcesThe service worker fetches a customresponse from possibly different sourcesInternetInternetStorageStorageLogicLogicText is not SVG - cannot display \ No newline at end of file From b1143e0a8dc4ca126fe3a85918eb74c8ff49f69d Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Mon, 5 Dec 2022 16:53:13 +0100 Subject: [PATCH 05/21] Fix SVG --- .../using_service_workers/sw-fetch.svg | 669 +++++++++++++++++- 1 file changed, 668 insertions(+), 1 deletion(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg index d50a37adaff3455..fcaeefc21dbf0db 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-fetch.svg @@ -1 +1,668 @@ -Pages in the service worker scopePages in the service worker scopeService worker installed and activatedService worker installed and activated1.1.4.4.The service worker sends back the custom response.The service worker sendsback the custom response.event.respondWith()event.respondWith()2.2.The page requests a resource (possibly located at another origin)The page requests a resource(possibly located at another origin)fetcheventfetch eventThe service worker intercepts the requestThe service worker intercepts the request3.3.The service worker fetches a custom response from possibly different sourcesThe service worker fetches a customresponse from possibly different sourcesInternetInternetStorageStorageLogicLogicText is not SVG - cannot display \ No newline at end of file + + + + + + + + + + + + + + + + + + + Pages in the service worker scope + + + + Pages in the service worker scope + + + + + + Service worker installed and activated + + + + Service worker installed and activated + + + + + + 1. + + + + 1. + + + + + + 4. + + + + 4. + + + + + + + The service worker sends back the custom response. + + + + The service worker sendsback the custom response. + + + + + + + + + event.respondWith() + + + + + event.respondWith() + + + + + + 2. + + + + 2. + + + + + + + + The page requests a resource (possibly located at another origin) + + + + The page requests a resource(possibly located at another origin) + + + + + + + + + fetch + +event + + + + + fetch event + + + + + + The service worker intercepts the request + + + + The service worker intercepts the request + + + + + + 3. + + + + 3. + + + + + + + The service worker fetches a custom response from possibly different sources + + + + The service worker fetches a customresponse from possibly different sources + + + + + + + + + Internet + + + + + Internet + + + + + + + + + Storage + + + + + Storage + + + + + + + + Logic + + + + + Logic + + + + + + + + + + + From ae210bd32baac39b3a80b91548c0a5be705aace6 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 13:30:55 +0100 Subject: [PATCH 06/21] Redo lifecycle diagram --- .../using_service_workers/index.md | 15 +++++++-------- .../using_service_workers/sw-lifecycle.png | Bin 42662 -> 0 bytes .../using_service_workers/sw-lifecycle.svg | 5 +++++ 3 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.png create mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 2e33c61ad7c8996..befeeb83ed5b39a 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -26,16 +26,15 @@ Service workers are enabled by default in all modern browsers. To run code using With service workers, the following steps are generally observed for basic set up: -1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. -2. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. -3. The service worker is now ready to process events. -4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. -5. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. +1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. +2. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. +3. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). -6. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. -7. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. +4. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. +5. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. +6. Whenever a new version of a service worker is fetched, this cycle happens again and the remainings of the previous version are cleaned during the new version's activation. -![lifecycle diagram](sw-lifecycle.png) +![lifecycle diagram](sw-lifecycle.svg) Here is a summary of the available service worker events: diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.png b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.png deleted file mode 100644 index 9f1290446d70f16239c4731e4b7deb24a25e954a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42662 zcma%ibyOU|*Ci5xFgOGT%^<;TaF>DL?hxGF-ED9uxDD>^?k*D`xFisQyIa`&_S^k- z_rE=T&v~z2SKaEW(|u2O)$2$l1xfS|L>~|k5YVNi#8nUwkRS*M$R;Sr|01~prwsqh z8w*i+Q3Qngc(iAuxBtqBE-I2@2sJY#2mflTE6J%zyuQBv`SWLUbJOK|RPE&S?(S}J zaq;x@bZTm9Z+bfBHoNlKg`J(fxVZRVa~~g{?(Xj9=H`ryjN##76%`dRF)=ziIuHni zg@pwK0;{X5&CShSTwHW?bYfy+WMpLc`1nFYLsL>xP*6~8Y-}14#%{N;?oLmS7Z+3R z674RovhSgr&o9R3o4bFvbj}Wcz5F@<``7QL+4$nZ@?ueMx+LtjeE#|Q$Mb#g^>yTJ z(b@f~`m$Q_cTeD@Ch36yq^P=s=%&)&Q-OovqYwIWX*MDAa3h(ZkAA2eu>bQuX}BFeTKJ-22xTMY=25kOtm~#ye9EWNv4O)VJC7OOdk$d3`IdK;@d`zo2v{wA|CQJ;bM2q*~|Ihrb zu+_}d(LY>oUxE93GRkt4HxUKV<{Q;(wFuq(Wg^}?&-!uQY38+hn|xJp#$C&O{NR7k zUq8{aRq*`t$@fnVMz;H)V%KZb8MoudUUjmp!Au@>U%}R)u=%6gU+%H&&05KyhOu^0 z9{gW$$@526`FY~E%Hc~c@Sj&JsvigMHf+#&%{EO!5Wy0x&atBT<#yN6*SO?;1YZk! z6iLDggjByowsZEn2m&4uAe@}3YQk*6dB$ZiSNGKwkKh`_`FZ6p<-fL~+ly5qEg^EFyvn~FOPB-(NBPpud z;F-4uepR?RZPf#*kdtV%rX9+T+8G$KII~JWtdxwbb5oo@20Wjy80e?J28q9Ya=c`gzx`uD;0c)(RcRAJc^6o)F zi`4H03GMgCipu5)JaWw)l_u82b(U>&Eh6o@J1f#N2?oy0!wW%%QZtXlEPr?@xL-izib`HS+(cgy3@cCXC{6R7p4~$O z%v;`pfte*~je%ngVTjw&-b>h8UebSSKpMaB4aBLUK!I|$k%7BJO`_=iTgA^;XM{)y zm0k6H)MJ18NP|ph-!YisA|-*&$K*F9j;Q$gxK8r|c)Uor6yfu-{o?X7NCo+{=yDQz z9J^nA4#SDF<*20vouL(ALL4rNL{r+fWSDu0lXiNh8h?<4YS%C{Z)GAG;Kr_JN(grT z0PW<*UVYIVLxiv4)CqR0(BIrNe7XB{twZ}e2$T-{BF~GGUS1KwQ#C{`t)T$Cyho~F z0UedHhsLw2jTMQ7(Td3tN0I03FV=+ltRLSJVW71sy5}%3a-BmE(mSqPQBQWHE)s&AK)WG~kmc|Qs zF&-@IqUa7f6f>_^GfkfYd`A*w2>HFuQZ~gxq+4~IA-}Uhr{NtfTDh8&Eu`0#e+zqJ zLUbAU+_kKnYzACVH&lAHt1pDUVxIzBea}3!&h;xl^M0w{W?55!pWe^JVm`k-a?-6| zwLk;mxZ{Wr{QBunISFG}K74AIHre%=Oo){w+4u~Fb6Q^IWn3vq{{cQZy~s6wR@{xNnDAwsTu@JbkFEtIpe~d-VGbT{I)3 zJ?173(br4q`1W@t6`3h2F56!s0jKF^GgZ|nR#xH!x^7(l{rD}%?z^Y*)@4(N34S1r z?bU@|5*jqOZ|v)x>MXZS`e4F?bHn%n`9%;-Yc^2nRt{ihna&Sg{Toi+y_GQmKTRzK zr}~@x>Zw>AB|q@wsADTlQKGKh{1)Nck~gZAU# z_`t^qR8F=7M|FF_=b`wR4BSK$sGPk2U*Jaa1OzH{y@|da`hZKc(OMh`@UtvNQml&! zi1lyCb!VBqv$LaskaL{BMnOwDPJG#^whsd!$=IUMzY)2gU*Cy-4)^o2h)6K#9Cy5b zPQF<#JR8HJ4-kVYjbVKNih&@srYQf*gaKd)AXAk8Y4E_IVo-k{kGsc#0J|9N)sv}! zsMTg6Chk{2EX^zMS!wHN%rcndjKOp_3-99!C)fD`mm*3>d>o%P? zzJMpLu$@t^=t$4n^;dn3cgh8_5-T=-E6m}6w9DO^9EN9N4OQyb} zj3>Hce9@xCa%bxuzh*|^B)rModSNA*R`bU?;pMVSW@lGaggxHk%s2h+<=17c35R5y zg}!1y4(xk5KA+q;1(Xux;KSB?5oK%c=$kj8F>iurH@_i*`vs9-ccg-nUdFA};jzMT zIboVCj?#T01TI+1r+Z|-M6{#H{;J$N^R~D*oy!7{Ga~k#pCNm^(Dai(WvINvn~1Jz z&C0hBD{@lqc{+-gDd>fE zX^FGI`PwTHdwU??6H`kj41ZmJm=0Sy45cpHl2l%`q8F|UpR z%=~H*VOxj?Io5eco0z>8A^)saz_u0q3kl~>Jezo`@&J}YOBBn{FB21>GwG!J^6Es3 zo^hkgtu^*&3(3TU-BR$H(j=(ngon$Cv1~+N8@(*k0s1A(1`rz&6M_R(f&NMX1sbCM zwIvlCzzQS#lL;cU;p=P~2w+PGi3NfDC#Iw9lrQw6l`MIm`_hfS!ItZPK80vy4A)Hv zLOLq}Osy1DG7sQOq3FU%K>gaW>ld^BZb0>IO1O9uXi*41%ECGJ9s6%qj-U7<&Om&w z-X?sAV^*-b3INgixYle%;}q!KJpuOtuq4Knw>~q-6I8zWH(bM@<=-wg908%Q`y76j zaV+t*%81g4HWi0yQ~uv2#|d_5I~1|#%b>sE5A~}2Ltk@~J)rtE?0EGEY4&?bFtH|s z2y=(YD^IBbb^{rHXKqNMV{j6z*pzm&R%8@UoO0eTBPN_g_Z}QgOzfrGw<7~p6L|CI zpp>1%0>heJ6>xF9MeNYVmkZ`dwy1iWBRHgF)M6yBcnnvLNuHp~n8X@#r8xrMn_FGT zFC4ZAf&LXP8~wDY1Qz7jhBQq_?_zaiiwT1tkJ5Sb2E|0q5g-XQUymCB)0j^?pC=RA zZF~khz;q@4@ADeWT{4YPDoC^(yCWL`LDdClSlHa;hA7Sprc5T*QeqOT{5`|G5#_IT z&@bFTBuV7$iv+o)zHVITCtmR{3H7)QpeTP?-C5T4`wN$2***MqpdM8xHDPY=bGmro==Ir7v zbmSiaWEV~hII#y)$q+(VI~~qM#$~AMaG|%V_!Jjd)*S>3jQ88tURXdYKev&Db(_sV?(bdoB@$(2AsJTqqI_41?#bHTLH{m}+362|sd15rIy0TBHUD>Yx{J4b z42~sZ#afY3#Sy({9q;>2o!hC>I+w3$G^`m$FpH8Yo4#!oyA4EWM3fo`GG!)2`-^p|sa3zV^q5CB*c~J3sF8c=Fem-L67- z&pT)zE1A)L4QJqzKaU@0LjmnXa~>YOdgxtM z{6OoQNu`D9(OCZ(j&~=OhEm+*CMf=|=KiXOQ*b9h|JGmcQxv~|nluk{%j&3^i~@(A z7n&(Rjv(ZEb@QzEr4wg4qj+ofQLmF7;=^b=27#_+<3P!A;Pkp+Wg9;3b35yPmR}Hyz|B3C1vwILqK?za9l&d!McQ5pMhJ z%>bqWFYSbLb~i>W@!gwHKg~D0slsKP9!D$R-I*r4TXFRl`3+EhyWU~O==M*+tq3of zWKI#{wYRKR{Z{i^wcr9No5s-~?jBv1w)sYvSD(U)s+9+_yoF6c>(p(oOHFAfG{lary zH>{$mh+qOK9>of#Wx{`v0CFkMs8=c(ORZ*oD2RKjAsxoJ!099bViF)V7$fP`cG7*b z%&sNGwH%PYt(6Jq`8M<%DC7BIoF~$i`6ETCLn0ILSh2|b{wT%4^~ef|+isH%O;Xfb zEznyM5K9pwqKs`zdM?a^BPYP?VvPgflo@zrl73YWuqv4eJg9WQWOsc?C+k=buCgfO zG&+D-i?$Ehe0h-gf|*dsuY=rZ*7XDAl0VjebR+duBqJU04ap**Q0XIV<~Rb4pdvF@ z(%=C0?hva##`@LQ zN?qb_t=Z%cy$eK_1CvF+#};y}DhwvF3osRj7on2IiQP_r?*9#VarX-`%R}FaGn3+8 zfi}gPmC=~`0++r6Hd@RmA+$#YpQSsbSJo<3?tSY%=p3?ekWPLBHRaZ{TGQ5-G7^-h z_syKwN{FCKj78#NLd}}YwBQDZ-oUt)sc%Y}9l3kH{pB9R35Y>T16*daN>ClTutmZ; zyE;x%U1Ffv9gVANcLOqGo`;&hptXtUNZ(D`OcZF&S-a-z*>YAk?1-S7%bOn^GGe|o z&-%s(d|k%0RvoSZ2+E+IPzlte>Ph-SFXI!$?fo4kjj4bY&`L;8(MbvAupXl??`FMd zA*83)aQy-e{^%S8M0fob&nhsaMEa1bVrV8&ZN&hEfBo{2YrDRTp`Pg5sPdX11O+3W zpI?Vve1c|HVG_O;NeC`68}s}CNgD-otoKidev~0nM+HzX{rIgM{bSgGP29Ly@}G=w z6wK9um4nv)xsjnDnXQNk5P$^w|ZxC+^-9A{6|ev$v_sRhzyH-&AB zvGcPI^-w^erCiXoq05gU^?}Ox_}I6tHRQruOHh* zcb5u3JH~L`NWAU3QMF$D=+4xf2s)6PfUiYcTwgqH1G54_ToFF^JV~&N?&ZO~-+&8e zEuw2A9qZp_nzt{DdLf#Fv&b6m_CJx(x*B#9+}(sf8EF3SMUPqkPK2SRxcde=zw%;d z??G10rqZIZcUzaA;eMTV`aAT?&xdM-=xi;6!3TrFa&;+N?!G}TeewB5T(_vMQiBC4%6(eN6sGD#Ab;afJ z_F#Gv6PL9JJ#&yy|HX5&#dd3m5@a0UjTj~taoLX(hPQ3hS;*pKOZS`zKQiRqODmLA-T4ZF&bl(jmpwvw}0wnA$Xj#8MonhcIU4B z^7EI8>I(-ApP0o=ne2`lK(Mo|C&)2$)HE}tF>`q8&vsyLGnziB-Yq{QLBg@Shs(wPs&ZPsKxXRgce+4_$)h4WLTP-yM9FeqAH_Hiw_hyBD&B~J( z1^6BJ2ueobN0q6-4Kj{D)sJyzR6GGUKp;8_g z)7qHQ!5<#zB9OkG4hS|hhNf%%T;N4yN_tt}5J!}ZrM8RE0ap0pYON17N$o`PBsUp= zASC+CY2SjW?9JYLQ-xP!8Ayc009GiXydeS7JHs8%jgaNRUp}C`Lrg~#Ah%`tK9258G2+HYuv$KN zYqdNQ3FO0q`4IA5gT`|JKt~EFt>M&?1`)YBh8+(!#INbScART@pP23+X}#7oJh>*L zNsd+4MsHQTWeE`6A*SYZnpwMIWgb=xo7La zX4-c^h}0^T*$JqZkoZo93~{d_l);@kN?~0D0P(In)Z|0)CGgMzyl=x^&N-SU1!98} zVT@-UzsmO*%livhF+8$hDqafu-}vH4y@?(~)a5hZzh8vu**+%V;O`aHv?NZ7v4swn z9~f3|L%D!anN~n=|0l$yBTB3SyYFk5ZA6lvnvQ@H$O_|FQS>XYaBoxqAQ6rn30ATH zP@cpI0oZ+%B6$2n9x$8`&o_{qA34>0)kDE1emLGbf@+B7=cqi3)xzKd1>?{5C$C?D z$JJ4=yg39RL`1Xt$s1Amf6zh*2bfPbB@f&6*;Cx+!LBrosv}H8xxc4|`+kpze6hKZXBf#qY`U! zNxW2UwUuw9j8RDTUE7Er`C=@Z6<|b-F^vTV;qI%Y5BZJGR^=1#E=ZI|*hXOsbO^|R z-JP~K$C0X1ItYllg?lNr0O@z#>}~n0!mLG=&a_3&7C9K97VL-e`PC#Nlu$LHn7bp@ z*Q-v>n%54axoH2^k()DVLMJ9jFA1gx?4v}iY~MaBOTh;`Ly;wvVO%^uipo_JRYy-U zVr4dCj*ovyD$H;ae;~)iX>5#@y!*~s>K176#Xw`gY3({D*Kfg}adb|?0p|zVdc;sG z$)1$zIb^3xLHV8Iu~sJXMKSdz+gIhHNRA|&W{Iy}JeUAlRO@GbIBW!o{7eLGz>xfK zMeSsxR`G@HxNw9I`lnj5;yEtO2LKZOv6SSfJ#=@q+2Eac@1}fA` z*zuYJ2&;{({=w?Z*2F3jH5XlBmXZo1-wF4}gS2~_9a56(dWLFCY56IWcpIm}{2pLS zgkYN@qrL^bs^eC`3myQydfx6al2Mir+t27Dh@rqc`v;TGHhx(60EQ&iyW-Emz~X;v zF*3LrPGZR|AqeCc7xo3$1UCK423 zs(3u#P%UD{-dF&*VA2WZ-3+RDI{7!8})@2H2ITH{=CoLQ-#%1=W<@86v6}cwW#4U-^ZuA}# z_!Q+R?F(4=;W;u+X@vRqL)hoOnuJuCq$%ylSm}4gYdw+FpFY2Y+25Qfgw#`?egRB~ zC2JyAIm;+$K-(A=TNrhyqbdnu@QA3DA8W!*Y$`otCz9o`r#IfO4lRpDL znE;fco|14U;gn#tWG3qOZ4RQW&TkMcy+VuZ77+4T?d>yG`WvGkKt| zyBEws{4m^vS~4lGaN-t$EaM$mVggMVTnW9>9em5z(7`*MfE~lwGdU*q=(tje0g!n3 z6Hoy?e{U2)y(Mn9TY_}QKZhaUuyxJ_Aa@L~ZI>LWGwMbE=`eq!`qv+jkwVgQES6(6 z=W4cYv?*73Ap#9elo6SHv*tx>LfIHGI(H$p@%DlW##r@&46&W#lSMIqE&Es^w%}+B z7{(W56*n)nO;cQtbfc`Carm6Kpui)^04b7$p`HzZNr&+S-a%GhzKnfTI7(hDj)W9& zt96CW(5fDL$piP&=T1sk&;>0Y>Io({BSDRSZN4ksbN>1DvvB;b-ddn#ooJwpxePlZ zok5xG&*@Ld^tnT10^hRytKZ~OB$8!HdoL~546#J+tGkeje47nsWxfIPs4Z}CNJk&VdA3dDq$29 z3Prz>+?8kO!hfM99v{B0f>KS{zB(soIq+ug#7X9mKbE=2fp$l{D=4`cIps@|ntuJH zAH?$Lo~st~l`g#cy-oC9vxo;bRA!mAKP=(=kD78t(GXMjVk3x14V4GqlP9e7TVR=C zur8D=1VrdP#KEu~s0L4ctG;)L41wd#R#!>|&_U!x)~H#LSr?iq-ccG84lrpnw8eoS zF<&)S*j;dnWcn~>(#`gj31wg|W#(zqxY#x3EWi&Nfu`fb_Q-^=frX~$IM9dK@8A5# zP|8-EAJ8C+`V!)=o}eCan3xFQ(@s|5p_?~5?x2v6=wT6zyk8u&rFcBDXhkS@@9V=Sw^~E zSO@4X9gjbY_^s^o@-S}$@O!)-2fH>GT42(?{`6oUj|=xrg?R+;7ezj$KVG<#%)J64 zw4j^6_*v-q?YO@WZkk`8d{$iLo`07LvT4mU8~ZP;)&L8ROF+Sfa~gd$Kx2QcM}OCl zhoD95R=4wCz(?OqkWQ-1raeak-pMymaadRKL*}aWG6>>NcV;orxKZ%JhKGKc`&sNL z@^&Nve%bT6=>+#A8dL++cy>@6!C;oYPs7Ib)Q{-R*z>YI!F_1?>^`j2RCjre+4M@* zXLadf|7Q*RE30dyk>&Y%wfGwI_Zq^v>pu8v?(ZXiTCWv9q9ixd*C{2um5OC-2xG!~ zD29E+2P2}-6Gb`(zuvcnqgrT1X<_A1Bt! zzicQUBcdvmnp4X*mr8A6Tf>G>^Rr&(@x|yjDOK~!WDbs1mj@Pp^e~&WO;SwDp#ffo zRY$+DHo1obAO<~upW@R1#Wt8@lcV2Sp4p46@QbF65$PmTw{q8Lu2~{$}0tF3quTD83cL_RmeRPEn z#Y{ao{Oj_^?$d{3GQ{A2b>1Nm|`kzS@@HO9$++;ZH_*-ab^JExtzm@_&yHmy1CSC0zOv>EUegdf*+8ApBu<_S{ zAnU%+vMoz_@>9ZSWOK{%6CDXZ)!m%3+a(%@&EvA?-<_6Z z!Ul+!DMx~3ivK$o;5kr!(g-htQ9mW@$BN4=St2uyo!>2PC+keaUXdW>g&1YnApKe9 zY(5&Z>HbnD81J@Dx<>nGCwByae%Of)sCQ4x?tyy}zMsoO(}$I(a?Wn=6>HKa|2e<2 zQR2cg7uLet50^#DP6Kq;QD&&m{GHuwXOxUHM#PKwSuYYul>kTXF6_T6s069V|k=Jmmrh(j^d=5T8g&i&Mo z27EmKg%7Q`)P{1e z#%Dli(efb@N2u-77@oQ7rx)xAFd&=t+)VY{aCG7!JN{)()M{_g^?OdZH(~l%bwdvH z^J0QXC*;IJi9z-%6-du<{ngD6;d?~ZAZmA3-S6Z6s#R)U0%IIsfJ=Z$S*_vy1Td3I z7rttN{l_cGDvyD%*3igQbALg^nmkIk+D88HL+4jWPE?>T4FvM0Km1}WM_6KdX7m02 z#-BNv6iikT*W*Fad4Np)hdgamGN<}ybby~{B21C|?uHkd`At3eJ_KERe1dUah<~Ra z`CCZ+X3A9h0+B~LX(#eUJUet2S{uGW`QD&KVrSzU$Y$F}rpoN?5a!lu;f%7XH!Gz>D2JD`?QXZ{#1JbF|ZkaM3|+ zMziqlb5RXHiK8{ausY+n8NNh47FX%HF+TbMS`ijoWSa&bbL1)S$+#&jei2gZRy@3+ z0#&^h;vaHtz~x`#q1zMX%7L-89^Ph_@}Z~sQz2@Zi`7%m>Bz{+?$QKBS}f-rvlYh= z%`NSc#0f2UMG^QmKJCp)H0kHbpdT7BfE-nLXwFK?`?!4xJbuGP``}?Q#*aim?LvI_ zw;fA%wuPqkj4K3KUbv9FzYmivy*0C}MVRTrb5evYRi>(AhNj06an26K;7B042tI+q z$P}wpp-w{f;wo!QIN1}}hRc-ZsUaDLpNnPPfJykXyp@o-AFgKEG!BNVCLvMD;9AL8 z?xZAs$SGywBP0-&q1_5bJZAvLGjgQ+8jeZCj7g@y8FaldGZC9iI?LZgM>!U;(w1kM zvIw*z7-~j9e_c;oL2Un2*v%#`T|1sSEa(Ts*Lz6^VG;I`JEADzb?n8%r+eh0IFf*w z8^dpYFJG`hK(Z-*E3vRFmXObNE$KVR=r8skwnghuJN7ylIb+hIGGHHtg|bC0)UI*} zlX|x$5ByBKzYv%-@~Lbub*}i*Ig2OWW+(=Iw2<1s3lGs^P3`~62|6b$7AdObS2FzAcWRF16Z&cf8henH(XheNDFc29=$NN zgol4YD=vY?(2f%T$wwn-$g^?yu?0Xh(`uhbAg=tP#&U*dPfk3GQg9iR z4ItpZCV?z&{aHnZD5*~YV6irNMiDlh`tOrQl8ymYZzQ$L$uu+2$GrR)ARF>VD;PH! zFxzknuL&%`j`8q}!I$6h?AHf7TZ$34;cYtZ$;$=5HR=t=v$ZzzI`$dMQvPjYQL)Fz zc7PX%wz#3yBeZD3%~tUncwP(ZoYOVjx6yXX{2p zA1q$rzab=NYdSdbB~bZ3#;0H*pjP(~3SAESmj6NnXb(>9RQp~ppL-R;)`rX1t1}Yy zF_^pfSO!cItji?sW){(eE4Tv+O#O}qF=kqDF|%rCZ1&QhM?3yE4C~z=rPwrj;j`Io^LexA@)by|AfW@Kp^oCSrOT@rIMgI=Bn{ip@Cd(@$<)A|p`mnF1O=RlKq^Fql~D zL^+trP$t3)*u--as(F;YLo9UIZ#G$5FzrRc@nI!##!LH~LuGITVrTH|Bi3To8zB)& zKP_f2Z9x`FCRhpCJAVum>=N|^Db%q8H54@F}_Y9wH^{u9RSeOc1OGoM`IyBTRkMf*EQ z*a5n};CAlayt$DCc2K(ZZjQmxP}&_L;`Z73Zw~+VJb4VmWi`s~YFqh=S@Ndu;%|Hv z0o^N!8$jQ0qwv}4Ar_{Gw>&) zeSC%m8x_ui8Sy%vJKt+tbW^=_2C1#Z8kaFFd&BVH5fzR&+gRG29N4P`^zW??3D6#) zIjyj63PtR^Y$k5h1a2fBx*Q6K9NT5CMBv*0H0ge4b`}W>=)yt!_2s&xv+FUk(?fuq z-B5tsvG3*CZu}y_eOQi>Oo#9?_aO)7F$&ilJh)M% zWZM(?3kSR$of(e(w6}5bNvuTSUkvr(tfuw2pz*sJrfb(Xz51ahe=%Vnc+Ccsj%aPx z6BwURfO3D1o=ecm5;lENe5fpi;66ZzY{YsU`W~2I1V0w_=XvoxHdrTL<6)nqRs8+L zT2d2~x0(d9@(s23Wp$K0(uR&1o&%^tJZQyI8ah>(hxzpPHSc0r6);2#SfYL5Vh3h7 zOGIT_ITgZrGgILY;d5a(>Ry1vXHjEe9q{cg+W#^s=u6 zT7P4Es)p#EqN&ggBaWc+l2H2)9Q9iwmBWKYNPJc!`6!dRgp#yNZAQ>BLlR*;z|KLs zJD{cC%8x0}{-C#7P&2c!mCclF*A?i;4pAh3`NIy~RM>sbT69?op!RFd7q5(el(tQ{ z8v3c4V!olHVHGZudtm7o1fbqYiemsm)gRx0t`r(Y35q3A^IaJyHJ-q^1%IM&lvmuZ zXjSDOX+N>6Av8tzul5uugWnmbKtvm9f%+QeaEBXOzKohqWj$ERVyhm6hZ8K zpyo*ymsF_1@gl*QIX970gr@zoL7~35!nw{_e)b^nQ3AFteXSlbi?>evqq)*jhSxXy z6Y@ddl+2iY1ti^#)3EbfxW?Rug)2JuieKKp*W4W&%YiycsKyqta=X4E@rRVIn?{N9 zWg#S$7=I(j$*xu2I49v@poMmEAWRIq=Qk@7ZC)y zrdB8T-O2daF6;WPOlm6LpUi6rnMj!*q$Jf7n4lQB>)o)cp0g~cR`2Tb@4vBX z>Bk&X>PAJzn6y4{lP@x#E|Vxuwp!nKcUobft5@k6m2=al$G?&>ZJAwSS(74awDjX! z!L%x?{6=;h+zBtmrn@W?yv3t!oj5G1J7XN&cq?;FIoT|OQyL=y)Up&L*)X9f2Gho; zwo1U}tfwvzhcdG9d2E|6Olz+`0sly{IXkcpB}bR$`@WhNR9I0$jlJE^V1R2i1UnUS#{)odkW6j4yYxlTANZ=yTD;{E{% z%fSVokxS2Zrko)*d$SKdIXT(e8wF>1eK7GJ!J;5@H3}Jwa+#4%a&apGzgRDX zd)N#(1tOaHwp4zyo`;1}ZUwVIs>RJB;i&B-vCT6092SKv$WQRNLtK|*<2uK* zqY2oE)sW(uF(oA}LBbAGyLQuxGoX$n4rl!-@B?yW0F1|Sp?ri$+3Tz2WqjHl>yXCZ zr##Wo!&`j$@Kja+Z|&W=tA0U?cA5s7%t09Fs}ndsf{QPl_HiH~!~!xKr`C8Hc566* z0UaWRm^yP3zF=XVh%Vt?#r$D_SlO6ghQjzo7m(g6YjeEo#|XL#4#xqCNl))2CWwkJ zD&7ImGtPontZM+&C>Uyg$FOFe)SKMW;JFeFH14$E(4n{>P#{}3*t9@Lw|8rJ!P;aD zO9!csF7N3ZOzhlDdVnqd-VnvdaT#>{BNl`cwn@1|04?KpEi*7H>sf)(?`!wQ!?yfi za^6J;&sKwm765 zCO0XE?oQqkPE2`gxK7u`7_^FH;+CUFh_ofS_a54{ z=k>Ke^Ia!8GFL)CPdF$d>@NUIu;>G-LwC?_ToXSf-lAR*h_jWI)zD1$-qB8wkZw*k zbESpLv`Shh-l`knlV5aV$a|zHA|a&44KM1SiaM>|0#zR~e+B3<>1r)=GhyL>NsV=onGLh@Z7S1@=2jQ=7wEs=<%v?MQ?iLi z52wvs1ar5UO8U$&{7XfY3s?7)R?+sA9kuWKI}$z)apfAn*MGO)8`hb|z(F@$vM;*$ zeNof|y@yD=fBYjwK~d^RzM8%0=X~Q$Cvmn~`bKpi{baWU-O`3Rd`e$*xeGwaNCWnv zT~vU3&eF;W$3c^tqiz{4+z;b54AFd|Sun>fvda-4dvq}r&AeayrL^Pm7f4u)I77k) z88KbHuc0otBKr_P0^ux(1qQ;*>SKr8GTL;6>WB<&Vk`}Q?$c_CLmUyvRjo#)dF;7{EshTy}0bj0crs(Hv+9_bgxp-8WcaGF>U|D z%WgmpO3rQ$zzN`E+1c^8wZ(5d7-GnQ zZ_N@5#FY!A4ntTHf_HPIce_MXvd8OGVLHqT0SxWVdxd6vZ z{yiz)jmw-Ct{(rx^u-rD^mX9Ezhry6C<8Vq%LQIg z8tD6LN9YX%@qS)GiW2g4#g1Q|O7mP_ZlFvdG6kt=teFU0c<*;uSZ%@ZFO^xyw7*OI zuD6fL6_uNh49Una?#+Ay?4)%%a>V&M=0#^0;Rr(7B`9nW%42Jt6sOAIrXR-EZ>Oox z*!p6JV$CK6Map}>d5JQNV{Cg@=F?zuzfNg+f?<)%J*_1<@UAx8stHHRG1x7H^Gc8M?QyI z2kAu0oOjUPh(HB8Mst?U=@oKe?^uQ;-J!r`Z~p;h<^D%KY?-g3b%LD)>>lY-GHFC{ zyHrNfd1+`|up^J5{ei~i2r{y)n<^?ZoFBORES@N@6pIHU%@?-YAG{LBn+B^K|0tF; zbuEmCdi*j%@5FE!3>6)0KH=gSv?{uj`%*W#zz(pJ7^E-SC5 zoWB33HIwk0jSaEAY%JzA<{!*3|KvCemJm?J>1ttjy*jw0t5_9XrYKiZ{ zdIGSGDthHZ(_gti#IxZ^e6>LN0(E>KF4Hu-hW$XthwN7?xp9bENe~P=UyNa`$CftZ zrZnhS{MfLN+KZH!k%c~b%Ca-@P(ZU!DIqBmUd)HouJy(;P%3?MF^6X7H}oN7Eo)20 z#6C1Fyk^k9*5_ghJ~Uy=Y*b=YpQ*5aB0?r2`P6^f&QgOB3`}h)PQ~H9!pv(^V9DYA zv0I>+RTw$hJ%~#I$ug6yJ>@4Mqy?9{!WhN(4IT|W)D`C^1nT{WNs2*u7(;2TT4)Brs$#hcR#TJr3L)8Y#c;VKQ`D>%u>^fgU1c?qccn$2hWYFT)$!~>ESpG1Y_=q zequimdoDnm5Z4@qoCGlm?lZg{fmnrBBgB$6dxhBjrnD zqNXWQgtDOuzcT)8ZgLFmh*K@;4D;XmBKn0<+EH}w-Bg+^(wpo*{n?$KLLF}{tudKp zwj(fXXxd7{Cjg2z5H+M?+^$6V%W$cL4$*i|5=*CV@5Z&}%405xXyT9|WQ4@qPR`rQ z>p=~lclo&29plriBMu9{Q|r;QrWfQz!1`YrK5b%}*Q+Zi_gDJ_g;!u#r)$N%H}SF2-Npmnp(KTa051?yYLe;oFOpXUEMz2$-m`94D5`|`1|pSUvv z{GQkO)SpcJwn^xiw`{-W@I%OTOYQO$GbpUq94t^Ku=b|lOXQcLlLfS?0sIo=ii9u^ zuc8=BGlIk_@Lw*EZ;(oYNCZN?sGo-aL*9dx>W^=7ZrsEG`IaasW^QQ?mS;R@Qe zwJW<2C#8Q3N43rDX^u>cH<#XiX#^H;6Mb8MTdjZGn}8chYOMEjyI^^LTj*0G73aqc)7xnZ4^QU7a_`!gK=F zXk~B|uQfqYoVPesaeO+tDWv3YQlyzo_(}3^@5d{TlIDl-=Z`yW@@Ij|sNBJ9vT&nd zvWv2X&YgR1_66?@ko&hY_Uk(GnqwXEfN=KHgWhd704ZJZazoBPB8PuONn)?aTt(C= zhU+*gsGlZ+31kO^MIvMc@ZgATKUqVi>8HXyHUTet5>PH~sbNY8*1f*{EmXk`dTDdb zv>$V+$>yrt4)dnd8gujaZMX;ps(c)MMI`Q~ucO2$}M$2(nGi;mi-)*9`{ZNtun_2~#z>vsUn3hAI| zN=RxLAgB_whm?~+3v8fT8Y2O}>CF~|!8T0PQS7Y}=gf|hgx7T|w?{UpIr> zn^v;5JSGTv7NIq^uqHqBx-VCGzi||c>+c~3pftvDPce4#nq;AU81iZl72*Upt?v_} z04x63*`HPR&zl_W`RG%;N<%FxeEfuxW1z7A!Pi*@#Swk$K3K59Z3Z6*65QPf2=4Cg z8r*{o?vmgP7J|FGI}=<31cv~D;F4Var|!AuJl*Q`(7n5QS3h*G+O^jA`*zs_*x*EO zLmR-#XU!Od=^WgB5%t>*_PRO?D~nF#Y;v+dQw(-VyxhH*NfwdcEsBA8(L#i#B9(`c zI=e=jZvrvJ4s8m+xy$XQ@c3D&fcH#CH3m6bA-Zuc5P|HC_HMg`n7oZ)(K%?8l*j%aGf8~zaZ+aSjadRoWPI#le^x^~e_?~62GKYkF*QQ#=o&2&lcZ~O-D6qHbj1pSTcr?W)aG2vtFW*@_3u=l!1V~ zenE^-rj!!=uQnhlT{Iu$H)yP>ow$DHdRM{DX6i`$T$%KH(-vuX_;A_3<8kqjpSk_^Pv7M5zE9y-tE zTE^ke@zKc)%r)0n;$}Uh87CXh@N?OB_P@R#H+$Qkef=cAvMq}__$1cgFrHM3H(5O0 z?~PWArEaMLf~xyAo`7Ld9Rq*wi2}|4-Qs)!3YkM?<82sPTXruvI6d(J)u!YN|E&cO zU0!O=N~TASv2Fi&S^ zM+Q4ZK_6E(x0L{SKuBT`zaA>b_0{0!?_gKxeWEP`wC5E)K5XpdymmQk{5qo6v;KoP zapT)ZU*XJ1;e4xglS5YGO50eM(O0?_4;#%~gws-!dKh_Gdxys2PhJ!E8=$o|Tw_eW`jTBFo3 ze&!vW0G2?0(ULRGA`N821Exq+wz>4fh+E4S!*Eu$Q4n=mkuIh{k9D4B8q89$u#3wB znSrrr;Or;VYAFvZFqanK)A}k-wQJiKI~J+E&qVTI>Yr^`7(r9>-loq;mHohH59O3D zDDlYo$$pU3k6ZoCw6;l_y*VO zvvY{?3o^+F2pOYD5gz7B4b`4Kg$~_75KRc1b0T8-aldf~^Fu_50ry)2_sEG6_VhFo z2SI7P3Sx_{UOA-63-<$fK_|zM=_Q^ zm&^MM@i+TeP!0dL^M!s9VKs`L=&85vo~v*%Y+-!Jq3-p+&DGwd0l37N#QiSUkPZ4< zQG)YZ{TK=t5r8@6u}Sm=0c0s&0nXG_B;2R2{y}D2kh7iv#aED1nyXNWQw7z!eLVS$ zh^C+X&pU!*Kvpg)6hB6OkIy_H98CV;mtTW^@D=@<{_87HVv3~c%(e`eJ{`4?TVAX4 z+T8(k{|o&aa{m_8@R@Aa)pi7PUVahKTqoFtTW!jZygEX7 zp}Fj%xas-j&7R*TyFQoqIjFl2;!f7dM}tjegUr6lm;k+sG=3$SL5Mt3zT6hMXXOYQ zWfXmM;k06nlp`5a6l0eKaS7r8>Z?i-?@dgs9HH4o9%OjO1b%dD@i>C$?~Pgr#cs!U z_218_s49M|lj-NUdI>|l7!N}C`nsLq3?h&Rd@HQ@E2 z5bD$3{ywxl&NzcOPf$X|%_ zTGw*yBR|!i2{d0U=nHv6Nr0(*wo8CgrSpeM#Wvi@yqDzDz1d2dweGdH_};gW7R4tC zV*;<=A~)+ke1ZNwLPE*l^Es80^WP&`;rsA;!{pVT(jfZhv$F-1J`aLFD#^k82F4zt zyJv2RLaG0c>_Ay*ge9r*=$@5^ zH2ZiTMYCdbxPwC{0hBBH{)(qo_Qtxld-)0P4KO4}aRBY6s&h{HNYDrLQ z5B8EnP6-SRj$wdmRkgN9PbH}A^|(2}I`MC{aQrmOt|}hg_9S__wFkAL!yHJy&PvTU zmmQQf9O(RwS}^_VhD#t?rtI=!zO!QiAHzJ~N(Z73v6T92O5>|qL8Ht0g<~!CG`UL> zpp$0LZ1BmM#Znu^X^g?-?H&uhne58?H!USzg0j6EJhIv(6O`NyD-y)t`844EykVT? zc#0%g_m(f;3_Ksr+1#$m?SnbmsRGtp4u(j-!^U(LObV%n@nqMo==*IOX@GXAEbW+* zsTm$t2LSZZ1{;&GP2u#N#n|^A(q#bp;ts7nQ~)$RrYtY~)qdV(uEtA$6=KS%)1(H1 z{BB-GC9bF)yLHgldut^Znaw$pxD(Wk19|G@aZQH>;gQwp&U(m;ZX7=%h+#)f7(Ey?d~{Bz*z!rmYEBioAo+|4+ms9 zcvy%%W≻eU$gyq~J;}jy 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 diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg new file mode 100644 index 000000000000000..0b91db6e1471683 --- /dev/null +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg @@ -0,0 +1,5 @@ +Service worker fetchedand registeredv1v1Pages loaded in the browser (client)Pages loaded in the browser (client)Scope of pages for the service workerScope of pages for the service workerregister(workerURL,{options = scope})register(workerURL,{options = scope})0. Initial situation, no service worker0. Initial situation,no service worker1. Registration of thefirst version of a service worker1. Registration of thefirst version of aservice workerService worker fetchedand registeredv1v12. Installation2. Installation +installeventinstall eventevent.waitUntil()event.waitUntil()Setting up caches, offline assets, etc.Setting up caches, offline assetsv1v1Service worker installedbut not controllingv1v13. Waiting for clients to be closed3. Waiting for clientsto be closedService worker installedbut not controllingv1v14. Activation4. Activation +activateeventactivate eventFinishing setup, cleaning old resources for previous versionsFinishing setup, cleaningold resources for previous versionsService workercontrolling documentsin its scopev1v15. Activated5. Activated +functional events(e.g.fetch)functional events(e.g. fetch)CacheCachev1v1v1v1v1v1Using cacheUsing cachePrevious versionv1v16. Replacement6. Replacement +Old cache:purged during v2 activationv1v1New version: will control pagesonce installed and activatedv2v2New cache:populated during installationv2v2Text is not SVG - cannot display \ No newline at end of file From e299e192aabd12ff60373ae6e58ec70fbd25aa63 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 13:40:29 +0100 Subject: [PATCH 07/21] Fix word spacing --- .../using_service_workers/sw-lifecycle.svg | 1757 ++++++++++++++++- 1 file changed, 1752 insertions(+), 5 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg index 0b91db6e1471683..8ea0465f515f153 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg +++ b/files/en-us/web/api/service_worker_api/using_service_workers/sw-lifecycle.svg @@ -1,5 +1,1752 @@ -Service worker fetchedand registeredv1v1Pages loaded in the browser (client)Pages loaded in the browser (client)Scope of pages for the service workerScope of pages for the service workerregister(workerURL,{options = scope})register(workerURL,{options = scope})0. Initial situation, no service worker0. Initial situation,no service worker1. Registration of thefirst version of a service worker1. Registration of thefirst version of aservice workerService worker fetchedand registeredv1v12. Installation2. Installation -installeventinstall eventevent.waitUntil()event.waitUntil()Setting up caches, offline assets, etc.Setting up caches, offline assetsv1v1Service worker installedbut not controllingv1v13. Waiting for clients to be closed3. Waiting for clientsto be closedService worker installedbut not controllingv1v14. Activation4. Activation -activateeventactivate eventFinishing setup, cleaning old resources for previous versionsFinishing setup, cleaningold resources for previous versionsService workercontrolling documentsin its scopev1v15. Activated5. Activated -functional events(e.g.fetch)functional events(e.g. fetch)CacheCachev1v1v1v1v1v1Using cacheUsing cachePrevious versionv1v16. Replacement6. Replacement -Old cache:purged during v2 activationv1v1New version: will control pagesonce installed and activatedv2v2New cache:populated during installationv2v2Text is not SVG - cannot display \ No newline at end of file + + + + + + Service worker fetched + and registered + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + + + Pages loaded in the browser (client) + + + + Pages loaded in the browser (client) + + + + + + + + + + + + Scope of pages for the service worker + + + + Scope of pages for the service worker + + + + + + + + + register(workerURL,{options = scope}) + + + + + register(workerURL,{options = scope}) + + + + + + + + 0. Initial situation, no service worker + + + + + + 0. Initial situation,no service worker + + + + + + + + 1. Registration of the + + + first version of a service worker + + + + + + + 1. Registration of thefirst version of aservice worker + + + Service worker fetched + and registered + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + + 2. Installation + + + + + + 2. Installation + + + + + + + + + + install +event + + + + install event + + + + + + + + + + + + + + + event.waitUntil() + + + + event.waitUntil() + + + + + + + + + + + + Setting up caches, offline assets, etc. + + + + Setting up caches, offline assets + + + + + + v1 + + + + v1 + + + Service worker installed + but not controlling + + + + + + + + + + v1 + + + + v1 + + + + + + + + 3. Waiting for clients to be closed + + + + + + 3. Waiting for clientsto be closed + + + Service worker installed + but not controlling + + + + + + + + + + v1 + + + + v1 + + + + + + + + 4. Activation + + + + + + 4. Activation + + + + + + + + + + activate +event + + + + activate event + + + + + + Finishing setup, cleaning old resources for previous versions + + + + Finishing setup, cleaningold resources for previous versions + + + Service worker + controlling documents + in its scope + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + 5. Activated + + + + + + 5. Activated + + + + + + + + + + + + functional events + + + (e.g.fetch +) + + + + + + + functional events(e.g. fetch) + + + + + + + + + + + Cache + + + + + Cache + + + + + + v1 + + + + v1 + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + v1 + + + + v1 + + + + + + + + + + + + + Using cache + + + + + Using cache + + Previous version + + + + + + + + + v1 + + + + v1 + + + + + + + + + + 6. Replacement + + + + + + 6. Replacement + + + + + + + + Old cache: + purged during v2 activation + + + + + + v1 + + + + v1 + + + New version: + will control pagesonce installed and activated + + + + + + + + + + v2 + + + + v2 + + + + + + + New cache: + populated during installation + + + + + + v2 + + + + v2 + + From 7eebfc091cf18cdc53e429a072644bd307ef3a84 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Tue, 6 Dec 2022 13:47:46 +0100 Subject: [PATCH 08/21] Remove xref macros --- .../using_service_workers/index.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index befeeb83ed5b39a..b77979d93763d3c 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -26,7 +26,7 @@ Service workers are enabled by default in all modern browsers. To run code using With service workers, the following steps are generally observed for basic set up: -1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. +1. The service worker URL is fetched and registered via [`serviceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register). If successful, the service worker is executed in a [`ServiceWorkerGlobalScope`](/en-US/docs/Web/API/ServiceWorkerGlobalScope); this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. The service worker is now ready to process events. 2. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. 3. When the `oninstall` handler completes, the service worker is considered installed. However, it does not control the pages: pages using other service workers must be closed before it can be activated. >**Note:** Waiting for other pages to be closed can be bypassed with [`skipWaiting()`](/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting). @@ -84,7 +84,7 @@ registerServiceWorker(); ``` 1. The `if`-block performs a feature detection test to make sure service workers are supported before trying to register one. -2. Next, we use the {{domxref("ServiceWorkerContainer.register()") }} function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) +2. Next, we use the [`ServiceWorkerContainer.register()`](/en-US/docs/Web/API/ServiceWorkerContainer/register) function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) 3. The `scope` parameter is optional, and can be used to specify the subset of your content that you want the service worker to control. In this case, we have specified '`'/'`, which means all content under the app's origin. If you leave it out, it will default to this value anyway, but we specified it here for illustration purposes. This registers a service worker, which runs in a worker context, and therefore has no DOM access. You then run code in the service worker outside of your normal pages to control their loading. @@ -109,7 +109,7 @@ This could be for the following reasons: After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — {{domxref("cache")}} — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. +The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — [`cache`](/fr/docs/Web/API/Cache) — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. Here's how our service worker handles the `install` event: @@ -136,7 +136,7 @@ self.addEventListener("install", (event) => { }); ``` -1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a {{domxref("ExtendableEvent.waitUntil()") }} method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. +1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a [`ExtendableEvent.waitUntil()`](/en-US/docs/Web/API/ExtendableEvent/waitUntil) method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. 2. Inside `addResourcesToCache()` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. 3. If the promise is rejected, the install fails, and the worker won't do anything. This is OK, as you can fix your code and then try again the next time registration occurs. 4. After a successful installation, the service worker activates. This doesn't have much of a distinct use the first time your service worker is installed/activated, but it means more when the service worker is updated (see the [Updating your service worker](#updating_your_service_worker) section later on.) @@ -174,9 +174,9 @@ Now you've got your site assets cached, you need to tell service workers to do s ![Fetch event diagram](sw-fetch.svg) -Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) +Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about [`Request`](/en-US/docs/Web/API/Request) and [`Response`](/en-US/docs/Web/API/Response) objects.) -1. The {{domxref("Response.Response","Response()")}} constructor allows you to create a custom response. In this case, we are just returning a simple text string: +1. The [`Response()`](/en-US/docs/Web/API/Response/Response) constructor allows you to create a custom response. In this case, we are just returning a simple text string: ```js new Response("Hello from your friendly neighborhood service worker!"); @@ -193,19 +193,19 @@ Let's look at a few other options we have when defining our logic (see our [Fetc ); ``` -3. If a match wasn't found in the cache, you could tell the browser to use {{domxref("fetch()")}} to get the default network request for that resource, to get the new resource from the network if it is available: +3. If a match wasn't found in the cache, you could tell the browser to use [`fetch()`](/en-US/docs/Web/API/fetch) to get the default network request for that resource, to get the new resource from the network if it is available: ```js fetch(event.request); ``` -4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using {{domxref("CacheStorage.match","match()")}}, like this: +4. If a match wasn't found in the cache, and the network isn't available, you could just match the request with some kind of default fallback page as a response using [`match()`](/en-US/docs/Web/API/CacheStorage/match), like this: ```js caches.match("./fallback.html"); ``` -5. You can retrieve a lot of information about each request with the properties of the {{domxref("Request")}} object given by the {{domxref("FetchEvent")}}: +5. You can retrieve a lot of information about each request with the properties of the [`Request`](/en-US/docs/Web/API/Request) object given by the [`FetchEvent`](/en-US/docs/Web/API/FetchEvent): ```js event.request.url; @@ -315,11 +315,11 @@ self.addEventListener("fetch", (event) => { We have opted for this fallback image because the only updates that are likely to fail are new images, as everything else is depended on for installation in the `install` event listener we saw earlier. -## Service Worker Navigation Preload +## Service Worker navigation preload If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManager) feature starts downloading resources as soon as the fetch request is made, and in parallel with service worker activation. This ensures that download starts immediately on navigation to a page, rather than having to wait until the service worker is activated. That delay happens relatively rarely, but is unavoidable when it does happen, and may be significant. -First the feature must be enabled during service worker activation, using {{domxref("NavigationPreloadManager.enable()", "registration.navigationPreload.enable()")}}: +First the feature must be enabled during service worker activation, using [`registration.navigationPreload.enable()`](/en-US/docs/Web/API/NavigationPreloadManager/enable): ```js const enableNavigationPreload = async () => { @@ -334,7 +334,7 @@ self.addEventListener("activate", (event) => { }); ``` -Then use {{domxref("FetchEvent.preloadResponse", "event.preloadResponse")}} to wait for the preloaded resource to finish downloading in the `fetch` event handler. +Then use [`event.preloadResponse`](/en-US/docs/Web/API/FetchEvent/preloadResponse) to wait for the preloaded resource to finish downloading in the `fetch` event handler. Continuing the example from the previous sections, we insert the code to wait for the preloaded resource after the cache check, and before fetching from the network if that doesn't succeed. From c03b17ebed6590ecf475f1d17a9c5f443c2f86d5 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Fri, 2 Dec 2022 16:51:16 +0100 Subject: [PATCH 09/21] First pass --- .../using_service_workers/important-notes.png | Bin 13697 -> 0 bytes .../using_service_workers/index.md | 142 ++++++++---------- .../using_service_workers/sw-events.png | Bin 5783 -> 0 bytes .../using_service_workers/sw101.png | Bin 103638 -> 0 bytes 4 files changed, 64 insertions(+), 78 deletions(-) delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/important-notes.png delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw-events.png delete mode 100644 files/en-us/web/api/service_worker_api/using_service_workers/sw101.png diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/important-notes.png b/files/en-us/web/api/service_worker_api/using_service_workers/important-notes.png deleted file mode 100644 index 6e0c2120d938dd592e46249f08a4252c523b6ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13697 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 C^Ca^C diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 96196feebb39e85..b4e100c64fe09cc 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -16,17 +16,17 @@ This article provides information on getting started with service workers, inclu ## The premise of service workers -One overriding problem that web users have suffered with for years is loss of connectivity. The best web app in the world will provide a terrible user experience if you can't download it. There have been various attempts to create technologies to solve this problem, and some of the issues have been solved. But the overriding problem is that there still isn't a good overall control mechanism for asset caching and custom network requests. +One overriding problem that web users have suffered with for years is loss of connectivity. The best web app in the world will provide a terrible user experience if you can't download it. There have been various attempts to create technologies to solve this problem, and some of the issues have been solved. But the overriding problem is that there wasn't a good overall control mechanism for asset caching and custom network requests. -The previous attempt, _AppCache_, seemed to be a good idea because it allowed you to specify assets to cache really easily. However, it made many assumptions about what you were trying to do and then broke horribly when your app didn't follow those assumptions exactly. Read Jake Archibald's (unfortunately-titled but well-written) [Application Cache is a Douchebag](https://alistapart.com/article/application-cache-is-a-douchebag/) for more details. +Service workers fix these issues. Using a service worker you can easily set an app up to use cached assets first, thus providing a default experience even when offline, before then getting more data from the network (commonly known as "offline first"). This is already available with native apps, which is one of the main reasons native apps are often chosen over web apps. -> **Note:** From Firefox 84, AppCache has been removed ({{bug("1619673")}}). It has also been [removed](https://bugs.chromium.org/p/chromium/issues/detail?id=582750) from Chromium 95, and is deprecated in Safari. +A service worker functions like a proxy server, allowing you to modify requests and responses, replace them with items from its own cache. -Service workers should finally fix these issues. Service worker syntax is more complex than that of AppCache, but the trade-off is that you can use JavaScript to control your AppCache-implied behaviors with a fine degree of granularity, allowing you to handle this problem and many more. Using a Service worker you can easily set an app up to use cached assets first, thus providing a default experience even when offline, before then getting more data from the network (commonly known as [Offline First](https://offlinefirst.org/)). This is already available with native apps, which is one of the main reasons native apps are often chosen over web apps. +> **Note:** Before service workers, a previous attempt at fixing those issues was AppCache. This API has been deprecated and removed from browsers, and should not be used anymore. ## Setting up to play with service workers -These days, service workers are enabled by default in all modern browsers. To run code using service workers, you'll need to serve your code via HTTPS — Service workers are restricted to running across HTTPS for security reasons. GitHub is therefore a good place to host experiments, as it supports HTTPS. In order to facilitate local development, `localhost` is considered a secure origin by browsers as well. +Service workers are enabled by default in all modern browsers. To run code using service workers, you'll need to serve your code via HTTPS — Service workers are restricted to running across HTTPS for security reasons. A server supporting HTTPS is necessary. To host experiments, you can use a service such as GitHub, Netlify, Vercel, etc. In order to facilitate local development, `localhost` is considered a secure origin by browsers as well. ## Basic architecture @@ -35,20 +35,26 @@ With service workers, the following steps are generally observed for basic set u 1. The service worker URL is fetched and registered via {{domxref("serviceWorkerContainer.register()")}}. 2. If successful, the service worker is executed in a {{domxref("ServiceWorkerGlobalScope") }}; this is basically a special kind of worker context, running off the main script execution thread, with no DOM access. 3. The service worker is now ready to process events. -4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An Install event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). This is really the same kind of procedure as installing a native or Firefox OS app — making everything available for use offline. +4. Installation of the worker is attempted when service worker-controlled pages are accessed subsequently. An `install` event is always the first one sent to a service worker (this can be used to start the process of populating an IndexedDB, and caching site assets). During this step, the application is preparing to make everything available for use offline. 5. When the `oninstall` handler completes, the service worker is considered installed. -6. Next is activation. When the service worker is installed, it then receives an activate event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a Service worker script. -7. The Service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a Service worker and maintains that for its lifetime. +6. Next is activation. When the service worker is installed, it then receives an `activate` event. The primary use of `onactivate` is for cleanup of resources used in previous versions of a service worker script. +7. The service worker will now control pages, but only those opened after the `register()` is successful. In other words, documents will have to be reloaded to actually be controlled, because a document starts life with or without a service worker and maintains that for its lifetime. ![lifecycle diagram](sw-lifecycle.png) -The below graphic shows a summary of the available service worker events: +Here is a summary of the available service worker events: -![install, activate, message, fetch, sync, push](sw-events.png) +- `install` +- `activate` +- `message` +- Functional events + - `fetch` + - `sync` + - `push` -## Service workers demo +## Demo -To demonstrate just the very basics of registering and installing a service worker, we have created a simple demo called [simple service worker](https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker), which is a simple Star wars Lego image gallery. It uses a promise-powered function to read image data from a JSON object and load the images using Ajax, before displaying the images in a line down the page. We've kept things static and simple for now. It also registers, installs, and activates a service worker, and when more of the spec is supported by browsers it will cache all the files required so it will work offline! +To demonstrate just the very basics of registering and installing a service worker, we have created a simple demo called [simple service worker](https://github.com/mdn/dom-examples/tree/main/service-worker/simple-service-worker), which is a simple Star Wars Lego image gallery. It uses a promise-powered function to read image data from a JSON object and load the images using [`fetch()`](/en-US/docs/Web/API/Fetch_API/Using_Fetch), before displaying the images in a line down the page. We've kept things static and simple for now. It also registers, installs, and activates a service worker. ![The words Star Wars followed by an image of a Lego version of the Darth Vader character](demo-screenshot.png) @@ -83,7 +89,7 @@ const registerServiceWorker = async () => { registerServiceWorker(); ``` -1. The if-block performs a feature detection test to make sure service workers are supported before trying to register one. +1. The `if`-block performs a feature detection test to make sure service workers are supported before trying to register one. 2. Next, we use the {{domxref("ServiceWorkerContainer.register()") }} function to register the service worker for this site, which is just a JavaScript file residing inside our app (note this is the file's URL relative to the origin, not the JS file that references it.) 3. The `scope` parameter is optional, and can be used to specify the subset of your content that you want the service worker to control. In this case, we have specified '`'/'`, which means all content under the app's origin. If you leave it out, it will default to this value anyway, but we specified it here for illustration purposes. @@ -91,32 +97,25 @@ This registers a service worker, which runs in a worker context, and therefore h A single service worker can control many pages. Each time a page within your scope is loaded, the service worker is installed against that page and operates on it. Bear in mind therefore that you need to be careful with global variables in the service worker script: each page doesn't get its own unique worker. -> **Note:** Your service worker functions like a proxy server, allowing you to modify requests and responses, replace them with items from its own cache, and more. - -> **Note:** One great thing about service workers is that if you use feature detection like we've shown above, browsers that don't support service workers can just use your app online in the normal expected fashion. Furthermore, if you use AppCache and SW on a page, browsers that don't support SW but do support AppCache will use that, and browsers that support both will ignore the AppCache and let SW take over. +> **Note:** One great thing about service workers is that if you use feature detection like we've shown above, browsers that don't support service workers can just use your app online in the normal expected fashion. #### Why is my service worker failing to register? This could be for the following reasons: -1. You are not running your application through HTTPS. -2. The path to your service worker file is not written correctly — it needs to be written relative to the origin, not your app's root directory. In our example, the worker is at `https://bncb2v.csb.app/sw.js`, and the app's root is `https://bncb2v.csb.app/`. But the path needs to be written as `/sw.js`. -3. It is also not allowed to point to a service worker of a different origin than that of your app. - -![Possible registration failure reasons](important-notes.png) - -Also note: - +- You are not running your application through HTTPS. +- The path to your service worker file is not written correctly — it needs to be written relative to the origin, not your app's root directory. In our example, the worker is at `https://bncb2v.csb.app/sw.js`, and the app's root is `https://bncb2v.csb.app/`. But the path needs to be written as `/sw.js`. +- It is also not allowed to point to a service worker of a different origin than that of your app. - The service worker will only catch requests from clients under the service worker's scope. -- The max scope for a service worker is the location of the worker. -- If your service worker is active on a client being served with the `Service-Worker-Allowed` header, you can specify a list of max scopes for that worker. -- In Firefox, Service Worker APIs are hidden and cannot be used when the user is in [private browsing mode](https://support.mozilla.org/en-US/kb/private-browsing-use-firefox-without-history). +- The max scope for a service worker is the location of the worker (in other words if the script `sw.js` is located in `/js/sw.js`, it can only control URLs under `/js/` by default). A list of max scopes for that worker can be specified with the [`Service-Worker-Allowed`](/en-US/docs/Web/HTTP/Header/Service-Worker-Allowed) header. +- In Firefox, Service Worker APIs are hidden and cannot be used when the user is in [private browsing mode](https://bugzilla.mozilla.org/show_bug.cgi?id=1320796), or when history is disabled, or if cookies are cleared when Firefox is closed. +- In Chrome, registration fails when the "Block all cookies (not recommended)" option is enabled. ### Install and activate: populating your cache After your service worker is registered, the browser will attempt to install then activate the service worker for your page/site. -The install event is fired when an install is successfully completed. The install event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — {{domxref("cache")}} — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to — again, you have full control. +The `install` event is fired when an install is successfully completed. The `install` event is generally used to populate your browser's offline caching capabilities with the assets you need to run your app offline. To do this, we use Service Worker's storage API — {{domxref("cache")}} — a global object on the service worker that allows us to store assets delivered by responses, and keyed by their requests. This API works in a similar way to the browser's standard cache, but it is specific to your domain. It persists until you tell it not to. Here's how our service worker handles the `install` event: @@ -144,11 +143,11 @@ self.addEventListener("install", (event) => { ``` 1. Here we add an `install` event listener to the service worker (hence `self`), and then chain a {{domxref("ExtendableEvent.waitUntil()") }} method onto the event — this ensures that the service worker will not install until the code inside `waitUntil()` has successfully occurred. -2. Inside `addResourcesToCache` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function that calls `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. +2. Inside `addResourcesToCache()` we use the [`caches.open()`](/en-US/docs/Web/API/CacheStorage/open) method to create a new cache called `v1`, which will be version 1 of our site resources cache. Then we call a function `addAll()` on the created cache, which for its parameter takes an array of origin-relative URLs to all the resources you want to cache. 3. If the promise is rejected, the install fails, and the worker won't do anything. This is OK, as you can fix your code and then try again the next time registration occurs. 4. After a successful installation, the service worker activates. This doesn't have much of a distinct use the first time your service worker is installed/activated, but it means more when the service worker is updated (see the [Updating your service worker](#updating_your_service_worker) section later on.) -> **Note:** [localStorage](/en-US/docs/Web/API/Web_Storage_API) works in a similar way to service worker cache, but it is synchronous, so not allowed in service workers. +> **Note:** [The Web Storage API (`localStorage`)](/en-US/docs/Web/API/Web_Storage_API) works in a similar way to service worker cache, but it is synchronous, so not allowed in service workers. > **Note:** [IndexedDB](/en-US/docs/Web/API/IndexedDB_API) can be used inside a service worker for data storage if you require it. @@ -156,32 +155,32 @@ self.addEventListener("install", (event) => { Now you've got your site assets cached, you need to tell service workers to do something with the cached content. This is easily done with the `fetch` event. -![Fetch event diagram](sw-fetch.png) +1. A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross origin request to embed an image, that still goes through its service worker.) -A `fetch` event fires every time any resource controlled by a service worker is fetched, which includes the documents inside the specified scope, and any resources referenced in those documents (for example if `index.html` makes a cross origin request to embed an image, that still goes through its service worker.) +2. You can attach a `fetch` event listener to the service worker, then call the `respondWith()` method on the event to hijack our HTTP responses and update them with your own content. -You can attach a `fetch` event listener to the service worker, then call the `respondWith()` method on the event to hijack our HTTP responses and update them with your own magic. + ```js + self.addEventListener("fetch", (event) => { + event + .respondWith + // custom content goes here + (); + }); + ``` -```js -self.addEventListener("fetch", (event) => { - event - .respondWith - // magic goes here - (); -}); -``` +3. We could start by responding with the resource whose URL matches that of the network request, in each case: -We could start by responding with the resource whose URL matches that of the network request, in each case: + ```js + self.addEventListener("fetch", (event) => { + event.respondWith(caches.match(event.request)); + }); + ``` -```js -self.addEventListener("fetch", (event) => { - event.respondWith(caches.match(event.request)); -}); -``` + `caches.match(event.request)` allows us to match each resource requested from the network with the equivalent resource available in the cache, if there is a matching one available. The matching is done via URL and various headers, just like with normal HTTP requests. -`caches.match(event.request)` allows us to match each resource requested from the network with the equivalent resource available in the cache, if there is a matching one available. The matching is done via URL and various headers, just like with normal HTTP requests. +![Fetch event diagram](sw-fetch.png) -Let's look at a few other options we have when defining our magic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) +Let's look at a few other options we have when defining our logic (see our [Fetch API documentation](/en-US/docs/Web/API/Fetch_API) for more information about {{domxref("Request")}} and {{domxref("Response")}} objects.) 1. The {{domxref("Response.Response","Response()")}} constructor allows you to create a custom response. In this case, we are just returning a simple text string: @@ -200,7 +199,7 @@ Let's look at a few other options we have when defining our magic (see our [Fetc ); ``` -3. If a match wasn't found in the cache, you could tell the browser to {{domxref("fetch()")}} the default network request for that resource, to get the new resource from the network if it is available: +3. If a match wasn't found in the cache, you could tell the browser to use {{domxref("fetch()")}} to get the default network request for that resource, to get the new resource from the network if it is available: ```js fetch(event.request); @@ -212,7 +211,7 @@ Let's look at a few other options we have when defining our magic (see our [Fetc caches.match("./fallback.html"); ``` -5. You can retrieve a lot of information about each request by calling parameters of the {{domxref("Request")}} object returned by the {{domxref("FetchEvent")}}: +5. You can retrieve a lot of information about each request with the properties of the {{domxref("Request")}} object given by the {{domxref("FetchEvent")}}: ```js event.request.url; @@ -225,7 +224,7 @@ Let's look at a few other options we have when defining our magic (see our [Fetc So `caches.match(event.request)` is great when there is a match in the service worker cache, but what about cases when there isn't a match? If we didn't provide any kind of failure handling, our promise would resolve with `undefined` and we wouldn't get anything returned. -Fortunately, service workers' promise-based structure makes it trivial to provide further options towards success. We could do this: +After testing the response from the cache, we can fallback on a regular network request: ```js const cacheFirst = async (request) => { @@ -243,7 +242,7 @@ self.addEventListener("fetch", (event) => { If the resources aren't in the cache, they are requested from the network. -If we were being really clever, we would not only request the resource from the network; we would also save it into the cache so that later requests for that resource could be retrieved offline too! This would mean that if extra images were added to the Star Wars gallery, our app could automatically grab them and cache them. The following would do the trick: +Using a more elaborate strategy, we could not only request the resource from the network, but also save it into the cache so that later requests for that resource could be retrieved offline too. This would mean that if extra images were added to the Star Wars gallery, our app could automatically grab them and cache them. The following snippet implements such a strategy: ```js const putInCache = async (request, response) => { @@ -266,11 +265,11 @@ self.addEventListener("fetch", (event) => { }); ``` -If the request URL is not available in the cache, we request the resource from the network request with `await fetch(request)`. After that, we put a clone of the response into the cache. The `putInCache` function uses `caches.open('v1')` and `cache.put()` to add the resource to the cache. The original response is returned to the browser to be given to the page that called it. +If the request URL is not available in the cache, we request the resource from the network request with `await fetch(request)`. After that, we put a clone of the response into the cache. The `putInCache()` function uses `caches.open('v1')` and `cache.put()` to add the resource to the cache. The original response is returned to the browser to be given to the page that called it. Cloning the response is necessary because request and response streams can only be read once. In order to return the response to the browser and put it in the cache we have to clone it. So the original gets returned to the browser and the clone gets sent to the cache. They are each read once. -What might look a bit weird is that the promise returned by `putInCache` is not awaited. But the reason is that we don't want to wait until the response clone has been added to the cache before returning a response. +What might look a bit weird is that the promise returned by `putInCache()` is not awaited. But the reason is that we don't want to wait until the response clone has been added to the cache before returning a response. The only trouble we have now is that if the request doesn't match anything in the cache, and the network is not available, our request will still fail. Let's provide a default fallback so that whatever happens, the user will at least get something: @@ -324,16 +323,14 @@ We have opted for this fallback image because the only updates that are likely t ## Service Worker Navigation Preload -If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManager) feature starts downloading resources as soon as the fetch request is made, and in parallel with service worker bootup. -This ensures that download starts immediately on navigation to a page, rather than having to wait until the service worker has booted. -That delay happens relatively rarely, but is unavoidable when it does happen, and may be significant. +If enabled, the [navigation preload](/en-US/docs/Web/API/NavigationPreloadManager) feature starts downloading resources as soon as the fetch request is made, and in parallel with service worker activation. This ensures that download starts immediately on navigation to a page, rather than having to wait until the service worker is activated. That delay happens relatively rarely, but is unavoidable when it does happen, and may be significant. First the feature must be enabled during service worker activation, using {{domxref("NavigationPreloadManager.enable()", "registration.navigationPreload.enable()")}}: ```js const enableNavigationPreload = async () => { if (self.registration.navigationPreload) { - // Enable navigation preloads! + // Enable navigation preloads await self.registration.navigationPreload.enable(); } }; @@ -350,8 +347,7 @@ Continuing the example from the previous sections, we insert the code to wait fo The new process is: 1. Check cache -2. Wait on `event.preloadResponse`, which is passed as `preloadResponsePromise` to the `cacheFirst` function. - Cache the result if it returns. +2. Wait on `event.preloadResponse`, which is passed as `preloadResponsePromise` to the `cacheFirst()` function. Cache the result if it returns. 3. If neither of these are defined then we go to the network. ```js @@ -406,7 +402,6 @@ const cacheFirst = async ({ request, preloadResponsePromise, fallbackUrl }) => { // Enable navigation preload const enableNavigationPreload = async () => { if (self.registration.navigationPreload) { - // Enable navigation preloads! await self.registration.navigationPreload.enable(); } }; @@ -442,9 +437,7 @@ self.addEventListener("fetch", (event) => { }); ``` -Note that in this example we download and cache the same data for the resource whether it is downloaded "normally" or preloaded. -You can instead choose to download and cache a different resource on preload. -For more information see [`NavigationPreloadManager` > Custom responses](/en-US/docs/Web/API/NavigationPreloadManager#custom_responses). +Note that in this example we download and cache the same data for the resource whether it is downloaded "normally" or preloaded. You can instead choose to download and cache a different resource on preload. For more information see [`NavigationPreloadManager` > Custom responses](/en-US/docs/Web/API/NavigationPreloadManager#custom_responses). ## Updating your service worker @@ -467,7 +460,7 @@ self.addEventListener("install", (event) => { "/app.js", "/image-list.js", - // ... + // … // include other new resources for the new version… ]) @@ -481,7 +474,7 @@ When no pages are using the current version, the new worker activates and become ### Deleting old caches -You also get an `activate` event. This is generally used to do stuff that would have broken the previous version while it was still running, for example getting rid of old caches. This is also useful for removing data that is no longer needed to avoid filling up too much disk space — each browser has a hard limit on the amount of cache storage that a given service worker can use. The browser does its best to manage disk space, but it may delete the Cache storage for an origin. The browser will generally delete all of the data for an origin or none of the data for an origin. +You also get an `activate` event. This is generally used to do stuff that would have broken the previous version while it was still running, for example getting rid of old caches. This is also useful for removing data that is no longer needed to avoid filling up too much disk space — each browser has a hard limit on the amount of cache storage that a given service worker can use. The browser does its best to manage disk space, but it may delete the cache storage for an origin. The browser will generally delete all of the data for an origin or none of the data for an origin. Promises passed into `waitUntil()` will block other events until completion, so you can rest assured that your clean-up operation will have completed by the time you get your first `fetch` event on the new service worker. @@ -504,20 +497,13 @@ self.addEventListener("activate", (event) => { ## Developer tools -Chrome has `chrome://inspect/#service-workers`, which shows current service worker activity and storage on a device, and `chrome://serviceworker-internals`, which shows more detail and allows you to start/stop/debug the worker process. In the future they will have throttling/offline modes to simulate bad or non-existent connections, which will be a really good thing. - -Firefox has also started to implement some useful tools related to service workers: - -- You can navigate to [`about:debugging`](https://firefox-source-docs.mozilla.org/devtools-user/about_colon_debugging/index.html) to see what SWs are registered and update/remove them. -- When testing you can get around the HTTPS restriction by checking the "Enable Service Workers over HTTP (when toolbox is open)" option in the [Firefox Developer Tools settings](https://firefox-source-docs.mozilla.org/devtools-user/settings/index.html). -- The "Forget" button, available in Firefox's customization options, can be used to clear service workers and their caches ({{bug(1252998)}}). - -> **Note:** You may serve your app from `http://localhost` (e.g. using `me@localhost:/my/app$ python -m SimpleHTTPServer`) for local development. See [Security considerations](https://www.w3.org/TR/service-workers/#security-considerations) +- [Chrome](https://www.chromium.org/blink/serviceworker/service-worker-faq/) +- [Firefox](https://firefox-source-docs.mozilla.org/devtools-user/application/service_workers/index.html) + - The "Forget about this site" button, available in [Firefox's toolbar customization options](https://support.mozilla.org/en-US/kb/customize-firefox-controls-buttons-and-toolbars), can be used to clear service workers and their caches. +- [Edge](https://learn.microsoft.com/en-us/microsoft-edge/devtools-guide-chromium/service-workers/) ## See also - [The Service Worker Cookbook](https://github.com/mdn/serviceworker-cookbook) -- [Is ServiceWorker ready?](https://jakearchibald.github.io/isserviceworkerready/) -- Download the [Service Workers 101 cheatsheet](sw101.png). - [Promises](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) - [Using web workers](/en-US/docs/Web/API/Web_Workers_API/Using_web_workers) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/sw-events.png b/files/en-us/web/api/service_worker_api/using_service_workers/sw-events.png deleted file mode 100644 index d4577ef93b4d6787bdf55bedb8329a56816e0295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5783 zcmai2Rag@avbEt*?@rH9_T-hA}9KfM}#=!{u5$H z1#JZaf;!m!n|CDtWkMeVHARBzQFhFK{;i&tp$Z<4UtV5LOG^U+flWRqTU$p* zM;8|t5C~*uW+pp3yQ-=RiA4VV`Ez)9_`f3OD|G+C+}xa#lheS!AUZnQ!NI}D$A_Gp zJSizjQBhG!N=idRgP)(Dg@wh{)wLvprLv*~Rhl>dlcv6iwhHm!V3w|@nl?7%B^>4r z@p~N>0E8vFmghdIuPdkpym-tO}8u`U^@ff{Pu1^J)z;cS`d zQQH%=y|pya;nsd$iV-2EX(>J_p8|c{ctZlU9qbj*9W)S6%E~YIQ{#B-td$`C>X}JT z4fVx5oJ8JP2>SR)g@O(IJ;jGxsRx=EEzMq+X41IWJ^Wy=85`vk74gB($0;@jVxX@U z6yO{Tc64_!3Gx>3a(S7Tn`B`E%*~E5)_?ZFR_Mq( zIA7F@gB1b-#`QPK3Wk9T`+2`pH`E_MEetxbU*W34d++8;12W9~pPKr=qac53N=|Oe z85vIG_2iY;76Bd~|4ZOa2BdV!AGV1|KMkm@f>#1eLVgYZ0uL{7P{t@0>hUrDzw-4c zC9?mqA*m_H*M?Oy2&C%D$K!i>!aJ4a5=+l=NB!E<4tl{89;16=?v93oj!TLbHB82T zwSSR;*J)dcW+ew}pMFMctLUiHP5{+ol#aQO)I}u!Oa$}EEm)z--3DPsD$T!}iDpeC zO1mFQwm-K>|Izf7tr+UUIOo-$#W=AL*M{`^yQ9mA)*8}KGN2+1C=8i%k&zGffFg`Y zPB@)t&I;vh*Uw1ymT08T!(qg7=|Ro;D}R=Zh(xBB@**6UdSAzgLx5PSi7r0Cgsgn> zp$7l$jI(`T<7ej>q4R_uc8IH&Rgdli*MXm_24p>{^n&N-I}}Hif{}4N4M+2~>I7U9 zlN;E9EhV7x2u&>dNJGTY*^YJxGYRV2aUUIJg*VlD+MA;qQ5LV>EA@y?a6OUVWyL+& z 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%0DBKHR>?5vv+k7RvJ&Ryj~hJEJuO9IHHQz9(- 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 J Date: Sat, 3 Dec 2022 09:35:52 +0100 Subject: [PATCH 10/21] Remove tags --- .../api/service_worker_api/using_service_workers/index.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index b4e100c64fe09cc..41e86659b3fc9ee 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -2,12 +2,6 @@ title: Using Service Workers slug: Web/API/Service_Worker_API/Using_Service_Workers page-type: guide -tags: - - Guide - - Service - - ServiceWorker - - Workers - - basics --- {{DefaultAPISidebar("Service Workers API")}} From c92fe66c7be1e837e13867a2178190d0973f7b76 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Sat, 3 Dec 2022 20:45:46 +0100 Subject: [PATCH 11/21] fix indent --- .../using_service_workers/index.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/files/en-us/web/api/service_worker_api/using_service_workers/index.md b/files/en-us/web/api/service_worker_api/using_service_workers/index.md index 41e86659b3fc9ee..e4f88397a955010 100644 --- a/files/en-us/web/api/service_worker_api/using_service_workers/index.md +++ b/files/en-us/web/api/service_worker_api/using_service_workers/index.md @@ -178,41 +178,41 @@ Let's look at a few other options we have when defining our logic (see our [Fetc 1. The {{domxref("Response.Response","Response()")}} constructor allows you to create a custom response. In this case, we are just returning a simple text string: - ```js - new Response("Hello from your friendly neighborhood service worker!"); - ``` + ```js + new Response("Hello from your friendly neighborhood service worker!"); + ``` 2. This more complex `Response` below shows that you can optionally pass a set of headers in with your response, emulating standard HTTP response headers. Here we are just telling the browser what the content type of our synthetic response is: - ```js - new Response( - "