11/*!
2- Turbo 8.0.20
3- Copyright © 2025 37signals LLC
2+ Turbo 8.0.23
3+ Copyright © 2026 37signals LLC
44 */
55const FrameLoadingStyle = {
66 eager : "eager" ,
@@ -4572,13 +4572,14 @@ const deprecatedLocationPropertyDescriptors = {
45724572
45734573class Offline {
45744574 serviceWorker ;
4575- async start ( url = "/service-worker.js" , { scope : scope = "/" , type : type = "classic" , native : native = true } = { } ) {
4575+ async start ( url = "/service-worker.js" , { scope : scope = "/" , type : type = "classic" , native : native = true , preload : preload } = { } ) {
45764576 if ( ! ( "serviceWorker" in navigator ) ) {
45774577 console . warn ( "Service Worker not available." ) ;
45784578 return ;
45794579 }
45804580 if ( native ) this . #setUserAgentCookie( ) ;
45814581 await this . #domReady( ) ;
4582+ const needsPreloading = preload && ! navigator . serviceWorker . controller ;
45824583 this . #checkExistingController( navigator . serviceWorker . controller , url ) ;
45834584 try {
45844585 const registration = await navigator . serviceWorker . register ( url , {
@@ -4588,6 +4589,9 @@ class Offline {
45884589 const registered = registration . active || registration . waiting || registration . installing ;
45894590 this . #checkExistingController( registered , url ) ;
45904591 this . serviceWorker = registered ;
4592+ if ( needsPreloading ) {
4593+ this . #preloadWhenReady( preload ) ;
4594+ }
45914595 return registration ;
45924596 } catch ( error ) {
45934597 console . error ( error ) ;
@@ -4602,6 +4606,22 @@ class Offline {
46024606 console . warn ( `Expected service worker script ${ url } but found ${ controller . scriptURL } . ` + `This may indicate multiple service workers or a cached version.` ) ;
46034607 }
46044608 }
4609+ #preloadWhenReady( pattern ) {
4610+ navigator . serviceWorker . addEventListener ( "controllerchange" , ( ( ) => {
4611+ this . #preloadResources( pattern ) ;
4612+ } ) , {
4613+ once : true
4614+ } ) ;
4615+ }
4616+ #preloadResources( pattern ) {
4617+ const urls = performance . getEntriesByType ( "resource" ) . map ( ( entry => entry . name ) ) . filter ( ( url => pattern . test ( url ) ) ) ;
4618+ navigator . serviceWorker . controller . postMessage ( {
4619+ action : "preloadResources" ,
4620+ params : {
4621+ urls : urls
4622+ }
4623+ } ) ;
4624+ }
46054625 #domReady( ) {
46064626 return new Promise ( ( resolve => {
46074627 if ( document . readyState !== "complete" ) {
@@ -4617,7 +4637,7 @@ const offline = new Offline;
46174637
46184638const session = new Session ( recentRequests ) ;
46194639
4620- const { cache : cache , navigator : navigator } = session ;
4640+ const { cache : cache , navigator : sessionNavigator } = session ;
46214641
46224642function start ( ) {
46234643 session . start ( ) ;
@@ -4668,15 +4688,15 @@ function morphTurboFrameElements(currentFrame, newFrame) {
46684688
46694689var Turbo = Object . freeze ( {
46704690 __proto__ : null ,
4671- navigator : navigator ,
4672- session : session ,
4673- cache : cache ,
46744691 PageRenderer : PageRenderer ,
46754692 PageSnapshot : PageSnapshot ,
46764693 FrameRenderer : FrameRenderer ,
46774694 fetch : fetchWithTurboHeaders ,
46784695 config : config ,
46794696 offline : offline ,
4697+ session : session ,
4698+ cache : cache ,
4699+ navigator : sessionNavigator ,
46804700 start : start ,
46814701 registerAdapter : registerAdapter ,
46824702 visit : visit ,
@@ -5418,7 +5438,7 @@ var Turbo$1 = Object.freeze({
54185438 morphChildren : morphChildren ,
54195439 morphElements : morphElements ,
54205440 morphTurboFrameElements : morphTurboFrameElements ,
5421- navigator : navigator$1 ,
5441+ navigator : sessionNavigator ,
54225442 offline : offline ,
54235443 registerAdapter : registerAdapter ,
54245444 renderStreamMessage : renderStreamMessage ,
0 commit comments