You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							95 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							95 lines
						
					
					
						
							3.5 KiB
						
					
					
				
								/*
							 | 
						|
								  Copyright 2019 Google LLC
							 | 
						|
								
							 | 
						|
								  Use of this source code is governed by an MIT-style
							 | 
						|
								  license that can be found in the LICENSE file or at
							 | 
						|
								  https://opensource.org/licenses/MIT.
							 | 
						|
								*/
							 | 
						|
								
							 | 
						|
								import {assert} from 'workbox-core/_private/assert.mjs';
							 | 
						|
								import {cacheNames} from 'workbox-core/_private/cacheNames.mjs';
							 | 
						|
								import {logger} from 'workbox-core/_private/logger.mjs';
							 | 
						|
								import {NavigationRoute} from './NavigationRoute.mjs';
							 | 
						|
								import {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';
							 | 
						|
								import './_version.mjs';
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Registers a route that will return a precached file for a navigation
							 | 
						|
								 * request. This is useful for the
							 | 
						|
								 * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}.
							 | 
						|
								 *
							 | 
						|
								 * When determining the URL of the precached HTML document, you will likely need
							 | 
						|
								 * to call `workbox.precaching.getCacheKeyForURL(originalUrl)`, to account for
							 | 
						|
								 * the fact that Workbox's precaching naming conventions often results in URL
							 | 
						|
								 * cache keys that contain extra revisioning info.
							 | 
						|
								 *
							 | 
						|
								 * This method will generate a
							 | 
						|
								 * [NavigationRoute]{@link workbox.routing.NavigationRoute}
							 | 
						|
								 * and call
							 | 
						|
								 * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute} on a
							 | 
						|
								 * singleton Router instance.
							 | 
						|
								 *
							 | 
						|
								 * @param {string} cachedAssetUrl The cache key to use for the HTML file.
							 | 
						|
								 * @param {Object} [options]
							 | 
						|
								 * @param {string} [options.cacheName] Cache name to store and retrieve
							 | 
						|
								 * requests. Defaults to precache cache name provided by
							 | 
						|
								 * [workbox-core.cacheNames]{@link workbox.core.cacheNames}.
							 | 
						|
								 * @param {Array<RegExp>} [options.blacklist=[]] If any of these patterns
							 | 
						|
								 * match, the route will not handle the request (even if a whitelist entry
							 | 
						|
								 * matches).
							 | 
						|
								 * @param {Array<RegExp>} [options.whitelist=[/./]] If any of these patterns
							 | 
						|
								 * match the URL's pathname and search parameter, the route will handle the
							 | 
						|
								 * request (assuming the blacklist doesn't match).
							 | 
						|
								 * @return {workbox.routing.NavigationRoute} Returns the generated
							 | 
						|
								 * Route.
							 | 
						|
								 *
							 | 
						|
								 * @alias workbox.routing.registerNavigationRoute
							 | 
						|
								 */
							 | 
						|
								export const registerNavigationRoute = (cachedAssetUrl, options = {}) => {
							 | 
						|
								  if (process.env.NODE_ENV !== 'production') {
							 | 
						|
								    assert.isType(cachedAssetUrl, 'string', {
							 | 
						|
								      moduleName: 'workbox-routing',
							 | 
						|
								      funcName: 'registerNavigationRoute',
							 | 
						|
								      paramName: 'cachedAssetUrl',
							 | 
						|
								    });
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  const cacheName = cacheNames.getPrecacheName(options.cacheName);
							 | 
						|
								  const handler = async () => {
							 | 
						|
								    try {
							 | 
						|
								      const response = await caches.match(cachedAssetUrl, {cacheName});
							 | 
						|
								
							 | 
						|
								      if (response) {
							 | 
						|
								        return response;
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								      // This shouldn't normally happen, but there are edge cases:
							 | 
						|
								      // https://github.com/GoogleChrome/workbox/issues/1441
							 | 
						|
								      throw new Error(`The cache ${cacheName} did not have an entry for ` +
							 | 
						|
								          `${cachedAssetUrl}.`);
							 | 
						|
								    } catch (error) {
							 | 
						|
								      // If there's either a cache miss, or the caches.match() call threw
							 | 
						|
								      // an exception, then attempt to fulfill the navigation request with
							 | 
						|
								      // a response from the network rather than leaving the user with a
							 | 
						|
								      // failed navigation.
							 | 
						|
								      if (process.env.NODE_ENV !== 'production') {
							 | 
						|
								        logger.debug(`Unable to respond to navigation request with ` +
							 | 
						|
								            `cached response. Falling back to network.`, error);
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								      // This might still fail if the browser is offline...
							 | 
						|
								      return fetch(cachedAssetUrl);
							 | 
						|
								    }
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  const route = new NavigationRoute(handler, {
							 | 
						|
								    whitelist: options.whitelist,
							 | 
						|
								    blacklist: options.blacklist,
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  const defaultRouter = getOrCreateDefaultRouter();
							 | 
						|
								  defaultRouter.registerRoute(route);
							 | 
						|
								
							 | 
						|
								  return route;
							 | 
						|
								};
							 | 
						|
								
							 |