-
Notifications
You must be signed in to change notification settings - Fork 319
Add race-network-and-cache source to static routing api. #1764
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 3 commits
778bf3b
50af98b
5b14fcd
b69c7da
8b8c331
3305a7f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1093,7 +1093,7 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/ | |
|
||
A {{ServiceWorkerGlobalScope}} object has an associated <dfn for="ServiceWorkerGlobalScope">race response map</dfn> which is an [=ordered map=] where the [=map/keys=] are [=/requests=] and the [=map/values=] are [=race response=]. | ||
|
||
A <dfn id="dfn-race-response">race response</dfn> is a [=struct=] used to contain the network response when {{RouterSourceEnum/"race-network-and-fetch-handler"}} performs. It has a <dfn for="race response">value</dfn>, which is a [=/response=], "<code>pending</code>", or null. | ||
A <dfn id="dfn-race-response">race response</dfn> is a [=struct=] used to contain the network response when {{RouterSourceEnum/"race-network-and-fetch-handler"}} or {{RouterSourceEnum/"race-network-and-cache"}} performs. It has a <dfn for="race response">value</dfn>, which is a [=/response=], "<code>pending</code>", or null. | ||
|
||
Note: {{ServiceWorkerGlobalScope}} object provides generic, event-driven, time-limited script execution contexts that run at an origin. Once successfully <a>registered</a>, a [=/service worker=] is started, kept alive and killed by their relationship to events, not [=/service worker clients=]. Any type of synchronous requests must not be initiated inside of a [=/service worker=]. | ||
|
||
|
@@ -1591,14 +1591,16 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/ | |
|
||
dictionary RouterSourceDict { | ||
DOMString cacheName; | ||
DOMString raceNetworkAndCacheCacheName; | ||
}; | ||
|
||
enum RunningStatus { "running", "not-running" }; | ||
enum RouterSourceEnum { | ||
"cache", | ||
"fetch-event", | ||
"network", | ||
"race-network-and-fetch-handler" | ||
"race-network-and-fetch-handler", | ||
"race-network-and-cache" | ||
}; | ||
</pre> | ||
|
||
|
@@ -3242,12 +3244,15 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/ | |
1. Let |queue| be an empty [=queue=] of [=/response=]. | ||
1. Let |raceFetchController| be null. | ||
1. Let |raceResponse| be a [=race response=] whose [=race response/value=] is "<code>pending</code>". | ||
1. Let |networkFetchCompleted| be false. | ||
1. Let |fetchHandlerCompleted| be false. | ||
1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "<code>terminated</code>" or "<code>aborted</code>": | ||
1. Set |raceFetchController| to the result of calling [=fetch=] given |request|, with [=fetch/processResponse=] set to the following steps given a [=/response=] |raceNetworkRequestResponse|: | ||
1. If |raceNetworkRequestResponse|'s [=response/status=] is [=ok status=], then: | ||
1. Set |raceResponse|'s [=race response/value=] to |raceNetworkRequestResponse|. | ||
1. [=queue/Enqueue=] |raceNetworkRequestResponse| to |queue|. | ||
1. Otherwise, set |raceResponse|'s [=race response/value=] to a [=network error=]. | ||
1. Set |networkFetchCompleted| to true. | ||
1. [=If aborted=] and |raceFetchController| is not null, then: | ||
1. [=fetch controller/Abort=] |raceFetchController|. | ||
1. Set |raceResponse| to a [=race response=] whose [=race response/value=] is null. | ||
monica-ch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
@@ -3256,7 +3261,45 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/ | |
1. Let |fetchHandlerResponse| be the result of [=Create Fetch Event and Dispatch=] with |request|, |registration|, |useHighResPerformanceTimers|, |timingInfo|, |workerRealm|, |reservedClient|, |preloadResponse|, and |raceResponse|. | ||
1. If |fetchHandlerResponse| is not null and not a [=network error=], and |raceFetchController| is not null, [=fetch controller/abort=] |raceFetchController|. | ||
1. [=queue/Enqueue=] |fetchHandlerResponse| to |queue|. | ||
1. Wait until |queue| is not empty. | ||
1. Set |fetchHandlerCompleted| to true. | ||
1. Wait until |queue| is not empty or (|networkFetchCompleted| is true and |fetchHandlerCompleted| is true). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @domenic Can I ask your advice on how this kinds of thing is usually written in the spec? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you concerned mainly about the parentheses? I think they are OK since they are easy to understand, but yes, it is unusual. The pattern I would use would be:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I wanted to know how people usually write this because I have not seen specs using parentheses. @monica-ch Will you revise the sentences as @domenic's way? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure if we really really need to introduce It looks Also not sure why we should wait for IIUC There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This change should be due to #1764 (comment). |
||
1. If |queue| is empty, return null. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there a way to reuse raceResponse if possible? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated, does it looks better? |
||
1. Return the result of [=dequeue=] |queue|. | ||
1. If |source| is {{RouterSourceEnum/"race-network-and-cache"}}, and |request|'s [=request/method=] is \`<code>GET</code>\`, then: | ||
1. If |shouldSoftUpdate| is true, then [=in parallel=] run the [=Soft Update=] algorithm with |registration|. | ||
1. Let |queue| be an empty [=queue=] of [=/response=]. | ||
1. Let |raceFetchController| be null. | ||
1. Let |raceResponse| be a [=race response=] whose [=race response/value=] is "<code>pending</code>". | ||
1. Let |networkFetchCompleted| be false. | ||
1. Let |cacheLookupCompleted| be false. | ||
1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "<code>terminated</code>" or "<code>aborted</code>": | ||
1. Set |raceFetchController| to the result of calling [=fetch=] given |request|, with [=fetch/processResponse=] set to the following steps given a [=/response=] |raceNetworkRequestResponse|: | ||
1. If |raceNetworkRequestResponse|'s [=response/status=] is [=ok status=], then: | ||
1. Set |raceResponse|'s [=race response/value=] to |raceNetworkRequestResponse|. | ||
1. [=queue/Enqueue=] |raceNetworkRequestResponse| to |queue|. | ||
1. Otherwise, set |raceResponse|'s [=race response/value=] to a [=network error=]. | ||
1. Set |networkFetchCompleted| to true. | ||
1. [=If aborted=] and |raceFetchController| is not null, then: | ||
1. If |raceFetchController|'s [=fetch controller/state=] is not "<code>terminated</code>", [=fetch controller/abort=] |raceFetchController|. | ||
1. Set |raceResponse| to a [=race response=] whose [=race response/value=] is null. | ||
monica-ch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. Resolve |preloadResponse| with undefined. | ||
1. Run the following substeps [=in parallel=]: | ||
1. [=map/For each=] |cacheName| → |cache| of the |registration|'s [=service worker registration/storage key=]'s [=name to cache map=]: | ||
monica-ch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. If |source|["{{RouterSourceDict/raceNetworkAndCacheCacheName}}"] [=map/exists=] and |source|["{{RouterSourceDict/raceNetworkAndCacheCacheName}}"] [=string/is=] not |cacheName|, [=continue=]. | ||
1. Let |requestResponses| be the result of running [=Query Cache=] with |request|, a new {{CacheQueryOptions}}, and |cache|. | ||
1. Let |globalObject| be null. | ||
1. If |requestResponses| is not an empty [=list=], then: | ||
1. Let |requestResponse| be the first element of |requestResponses|. | ||
1. Let |response| be |requestResponse|'s response. | ||
1. If |response|'s [=response/type=] is "`opaque`", and |globalObject| is null: | ||
1. Set |globalObject| to the result of running [=Setup ServiceWorkerGlobalScope=] with |activeWorker|. | ||
1. If |globalObject| is null, [=continue=]. | ||
1. If |response|'s [=response/type=] is "`opaque`", and [=cross-origin resource policy check=] with |globalObject|'s [=environment settings object/origin=], |globalObject|, "", and |response|'s [=filtered response/internal response=] returns <b>blocked</b>, then [=continue=]. | ||
1. [=queue/Enqueue=] |response| to |queue|. | ||
1. If |raceFetchController| is not null, [=fetch controller/abort=] |raceFetchController|. | ||
1. Set |cacheLookupCompleted| to true. | ||
1. Wait until |queue| is not empty or (|networkFetchCompleted| is true and |cacheLookupCompleted| is true). | ||
1. If |queue| is empty, return null. | ||
monica-ch marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. Return the result of [=dequeue=] |queue|. | ||
1. Assert: |source| is "{{RouterSourceEnum/fetch-event}}" | ||
1. If |request| is a [=navigation request=], |registration|'s [=navigation preload enabled flag=] is set, |request|'s [=request/method=] is \`<code>GET</code>\`, |registration|'s [=active worker=]'s [=set of event types to handle=] [=set/contains=] <code>fetch</code>, and |registration|'s [=active worker=]'s [=all fetch listeners are empty flag=] is not set then: | ||
|
Uh oh!
There was an error while loading. Please reload this page.