- From: Tetsuharu Ohzeki <notifications@github.com>
- Date: Tue, 19 Mar 2024 02:49:36 -0700
- To: w3c/ServiceWorker <ServiceWorker@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/ServiceWorker/issues/1712@github.com>
Motivation `event.addRoutes(rules)` was introduced by #1701 whose motivation is explained in https://github.com/WICG/service-worker-static-routing-api to reduce the overhead to intercept by ServiceWorker. According to the motivation, I seem our ideal status resolved by this API is ServiceWorker works as _opt-in mode_ if a user code calls `event.addRoutes()`. I think almost combinations of `RouterRule` would be nice to work like _opt-in_ semantics. However, there are some cases that are not intuitive combinations. For example, the explainer illustrates [Bypassing ServiceWorker for particular resources](https://github.com/WICG/service-worker-static-routing-api#bypassing-serviceworker-for-particular-resources) case. This case say that ServiceWorker to behave as just as _opt-out_ for some network request path ```js // This example is cited from the explainer. // I think this shows opt-out behavior semantics. // ----- // Go straight to the network and bypass invoking "fetch" handlers for URLs that start // with '/videos/' and '/images/'. addEventListener('install', (event) => { event.addRoutes([{ condition: { urlPattern: new URLPattern({pathname: "/images/*"}) }, source: "network" }, { condition: { urlPattern: new URLPattern({pathname: "/videos/*"}) }, source: "network" }]); }); ``` On the other hands, if `RouterRule.source` is `"fetch-event”` or cache, ServiceWorker would work like as _opt-in_ for registered conditions [by the spec](https://w3c.github.io/ServiceWorker/#on-fetch-request-algorithm). ```js // By the current spec, this indicates ServiceWorker should wake up // and intercept for URLs with `/assets/`. I seem this shows opt-in behavior semantics. addEventListener('install', (event) => { event.addRoutes([{ condition: { urlPattern: new URLPattern({pathname: "/assets/*"}) }, source: "cache" }, ``` If I don't misunderstand the spec, I think this API semantics inconsistency may confuse a developer. ## Idea I also propose a rough idea to resolve this behavior inconsistencies. 1. Introduce a new internal mode that ServiceWorker behaves like a _pass through mode_. 1. Under this mode, ServiceWorker only works with registered conditions. 2. For other (non-registered) conditions, ServiceWorker does not startup. 2. Make ServiceWorker to _pass through_ mode if user calls `event.addRoutes()` once in the `install` event handler. 1. Luckily, `event.addRoutes()` is a newly introduced API. That method does not exist on old UAs. If user code does not call `event.addRoutes()`, ServiceWorker can work as a traditional style that intercept for all network requests implicitly. 2. For UAs that had been shipped `event.addRoutes()` (Google Chrome), they can just ignores some patterns of conditions to keep a backword compatibility. -- Reply to this email directly or view it on GitHub: https://github.com/w3c/ServiceWorker/issues/1712 You are receiving this because you are subscribed to this thread. Message ID: <w3c/ServiceWorker/issues/1712@github.com>
Received on Tuesday, 19 March 2024 09:49:40 UTC