197 lines
7.4 KiB
Cheetah
197 lines
7.4 KiB
Cheetah
/**
|
|
* Copyright 2016 Google Inc. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// DO NOT EDIT THIS GENERATED OUTPUT DIRECTLY!
|
|
// This file should be overwritten as part of your build process.
|
|
// If you need to extend the behavior of the generated service worker, the best approach is to write
|
|
// additional code and include it using the importScripts option:
|
|
// https://github.com/GoogleChrome/sw-precache#importscripts-arraystring
|
|
//
|
|
// Alternatively, it's possible to make changes to the underlying template file and then use that as the
|
|
// new base for generating output, via the templateFilePath option:
|
|
// https://github.com/GoogleChrome/sw-precache#templatefilepath-string
|
|
//
|
|
// If you go that route, make sure that whenever you update your sw-precache dependency, you reconcile any
|
|
// changes made to this original template file with your modified copy.
|
|
|
|
// This generated service worker JavaScript will precache your site's resources.
|
|
// The code needs to be saved in a .js file at the top-level of your site, and registered
|
|
// from your pages in order to be used. See
|
|
// https://github.com/googlechrome/sw-precache/blob/master/demo/app/js/service-worker-registration.js
|
|
// for an example of how you can register this script and handle various service worker events.
|
|
|
|
/* eslint-env worker, serviceworker */
|
|
/* eslint-disable indent, no-unused-vars, no-multiple-empty-lines, max-nested-callbacks, space-before-function-paren, quotes, comma-spacing */
|
|
'use strict';
|
|
|
|
var precacheConfig = <%= precacheConfig %>;
|
|
var cacheName = 'sw-precache-<%= version %>-<%= cacheId %>-' + (self.registration ? self.registration.scope : '');
|
|
|
|
<% if (handleFetch) { %>
|
|
var ignoreUrlParametersMatching = [<%= ignoreUrlParametersMatching %>];
|
|
<% } %>
|
|
|
|
<% Object.keys(externalFunctions).sort().forEach(function(functionName) {%>
|
|
var <%- functionName %> = <%= externalFunctions[functionName] %>;
|
|
<% }); %>
|
|
|
|
var hashParamName = '_sw-precache';
|
|
var urlsToCacheKeys = new Map(
|
|
precacheConfig.map(function(item) {
|
|
var relativeUrl = item[0];
|
|
var hash = item[1];
|
|
var absoluteUrl = new URL(relativeUrl, self.location);
|
|
var cacheKey = createCacheKey(absoluteUrl, hashParamName, hash, <%= dontCacheBustUrlsMatching %>);
|
|
return [absoluteUrl.toString(), cacheKey];
|
|
})
|
|
);
|
|
|
|
function setOfCachedUrls(cache) {
|
|
return cache.keys().then(function(requests) {
|
|
return requests.map(function(request) {
|
|
return request.url;
|
|
});
|
|
}).then(function(urls) {
|
|
return new Set(urls);
|
|
});
|
|
}
|
|
|
|
self.addEventListener('install', function(event) {
|
|
event.waitUntil(
|
|
caches.open(cacheName).then(function(cache) {
|
|
return setOfCachedUrls(cache).then(function(cachedUrls) {
|
|
return Promise.all(
|
|
Array.from(urlsToCacheKeys.values()).map(function(cacheKey) {
|
|
// If we don't have a key matching url in the cache already, add it.
|
|
if (!cachedUrls.has(cacheKey)) {
|
|
var request = new Request(cacheKey, {credentials: 'same-origin'});
|
|
return fetch(request).then(function(response) {
|
|
// Bail out of installation unless we get back a 200 OK for
|
|
// every request.
|
|
if (!response.ok) {
|
|
throw new Error('Request for ' + cacheKey + ' returned a ' +
|
|
'response with status ' + response.status);
|
|
}
|
|
|
|
return cleanResponse(response).then(function(responseToCache) {
|
|
return cache.put(cacheKey, responseToCache);
|
|
});
|
|
});
|
|
}
|
|
})
|
|
);
|
|
});
|
|
}).then(function() {
|
|
<% if (skipWaiting) { %>
|
|
// Force the SW to transition from installing -> active state
|
|
return self.skipWaiting();
|
|
<% } %>
|
|
})
|
|
);
|
|
});
|
|
|
|
self.addEventListener('activate', function(event) {
|
|
var setOfExpectedUrls = new Set(urlsToCacheKeys.values());
|
|
|
|
event.waitUntil(
|
|
caches.open(cacheName).then(function(cache) {
|
|
return cache.keys().then(function(existingRequests) {
|
|
return Promise.all(
|
|
existingRequests.map(function(existingRequest) {
|
|
if (!setOfExpectedUrls.has(existingRequest.url)) {
|
|
return cache.delete(existingRequest);
|
|
}
|
|
})
|
|
);
|
|
});
|
|
}).then(function() {
|
|
<% if (clientsClaim) { %>
|
|
return self.clients.claim();
|
|
<% } %>
|
|
})
|
|
);
|
|
});
|
|
|
|
<% if (handleFetch) { %>
|
|
self.addEventListener('fetch', function(event) {
|
|
if (event.request.method === 'GET') {
|
|
// Should we call event.respondWith() inside this fetch event handler?
|
|
// This needs to be determined synchronously, which will give other fetch
|
|
// handlers a chance to handle the request if need be.
|
|
var shouldRespond;
|
|
|
|
// First, remove all the ignored parameters and hash fragment, and see if we
|
|
// have that URL in our cache. If so, great! shouldRespond will be true.
|
|
var url = stripIgnoredUrlParameters(event.request.url, ignoreUrlParametersMatching);
|
|
shouldRespond = urlsToCacheKeys.has(url);
|
|
|
|
// If shouldRespond is false, check again, this time with 'index.html'
|
|
// (or whatever the directoryIndex option is set to) at the end.
|
|
var directoryIndex = '<%= directoryIndex %>';
|
|
if (!shouldRespond && directoryIndex) {
|
|
url = addDirectoryIndex(url, directoryIndex);
|
|
shouldRespond = urlsToCacheKeys.has(url);
|
|
}
|
|
|
|
// If shouldRespond is still false, check to see if this is a navigation
|
|
// request, and if so, whether the URL matches navigateFallbackWhitelist.
|
|
var navigateFallback = '<%= navigateFallback %>';
|
|
if (!shouldRespond &&
|
|
navigateFallback &&
|
|
(event.request.mode === 'navigate') &&
|
|
isPathWhitelisted(<%= navigateFallbackWhitelist %>, event.request.url)) {
|
|
url = new URL(navigateFallback, self.location).toString();
|
|
shouldRespond = urlsToCacheKeys.has(url);
|
|
}
|
|
|
|
// If shouldRespond was set to true at any point, then call
|
|
// event.respondWith(), using the appropriate cache key.
|
|
if (shouldRespond) {
|
|
event.respondWith(
|
|
caches.open(cacheName).then(function(cache) {
|
|
return cache.match(urlsToCacheKeys.get(url)).then(function(response) {
|
|
if (response) {
|
|
return response;
|
|
}
|
|
throw Error('The cached response that was expected is missing.');
|
|
});
|
|
}).catch(function(e) {
|
|
// Fall back to just fetch()ing the request if some unexpected error
|
|
// prevented the cached response from being valid.
|
|
console.warn('Couldn\'t serve response for "%s" from cache: %O', event.request.url, e);
|
|
return fetch(event.request);
|
|
})
|
|
);
|
|
}
|
|
}
|
|
});
|
|
|
|
<% if (swToolboxCode) { %>
|
|
// *** Start of auto-included sw-toolbox code. ***
|
|
<%= swToolboxCode %>
|
|
// *** End of auto-included sw-toolbox code. ***
|
|
<% } %>
|
|
|
|
<% if (runtimeCaching) { %>
|
|
// Runtime cache configuration, using the sw-toolbox library.
|
|
<%= runtimeCaching %>
|
|
<% } %>
|
|
<% } %>
|
|
|
|
<% if (importScripts) { %>
|
|
importScripts(<%= importScripts %>);
|
|
<% } %>
|