- From: Jacob Smith <notifications@github.com>
- Date: Tue, 15 Nov 2022 01:32:44 -0800
- To: w3c/ServiceWorker <ServiceWorker@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/ServiceWorker/issues/1662@github.com>
Currently, the ServiceWorker specification does not mention (anywhere) `AbortSignal` or describe behaviour when `AbortSignal` is used. The most pertinent area of the ServiceWorker spec is [`FetchEvent::respondWith(r)`](https://w3c.github.io/ServiceWorker/#dom-fetchevent-respondwith). In some scenarios, it may be desirable for a ServiceWorker to abort a request; for example, when the ServiceWorker intercepts a request to a protected resource and no authentication is available. Chrome and Firefox both trigger a NetworkError when a ServiceWorker uses AbortSignal to cancel a request. This changes upstream event handling: If it were handled "correctly", the promise would resolve (as it does normally, when the client itself aborts the request). **Cons** of a processing AbortSignal as a NetworkError: * Misinformation: The user is mislead into thinking an actual network problem has occurred or there's an issue with their environment. * Contravention of the Principle of Least Knowledge: The user must know ServiceWorker's AbortSignal is a special snowflake. * Specific handling: The user must differentiate between a real and fake NetworkError. **Pros** of a processing AbortSignal as normal: * Accuracy: It's what actually happened. * Adherent to the Principle of Least Knowledge: A custom reason can be provided. * Familiarity: The user will already be familiar with handling. * No specific handling: The user does _not_ need to divine between a real and fake NetworkError. A simple code sample of this is available here: https://codesandbox.io/s/hidden-currying-n4fttq but note it does not actually work because CodeSandbox already has another ServiceWorker running (if you run that code elsewhere, it does repro the issue). A real-world example is available here: https://github.com/JakobJingleheimer/webapp-auth-via-serviceworker. A possible alternative, which may be outside the scope of this group, is to allow supplying an AbortSignal directly to the `Response()` constructor and/or making the one it already has mutable. IMHO this would be a more ideal solution as it's straightforward and requires less code: ```js const ctrl = new AbortController(); event.respondWith(fetch(event.request, { signal: ctrl.signal, })); ctrl.abort('doom'); ``` vs ```js const ctrl = new AbortController(); const response = new Response(undefined, { signal: ctrl.signal }); event.respondWith(response); ctrl.abort('doom'); ``` -- Reply to this email directly or view it on GitHub: https://github.com/w3c/ServiceWorker/issues/1662 You are receiving this because you are subscribed to this thread. Message ID: <w3c/ServiceWorker/issues/1662@github.com>
Received on Tuesday, 15 November 2022 09:32:58 UTC