workbox-strategies
Advanced tools
Comparing version 5.0.0-alpha.0 to 5.0.0-alpha.1
this.workbox = this.workbox || {}; | ||
this.workbox.strategies = (function (exports, logger_mjs, assert_mjs, cacheNames_mjs, cacheWrapper_mjs, fetchWrapper_mjs, getFriendlyURL_mjs, WorkboxError_mjs) { | ||
'use strict'; | ||
this.workbox.strategies = (function (exports, logger_js, assert_js, cacheNames_js, cacheWrapper_js, fetchWrapper_js, getFriendlyURL_js, WorkboxError_js) { | ||
'use strict'; | ||
try { | ||
self['workbox:strategies:5.0.0-alpha.0'] && _(); | ||
} catch (e) {} // eslint-disable-line | ||
// @ts-ignore | ||
try { | ||
self['workbox:strategies:5.0.0-alpha.1'] && _(); | ||
} catch (e) {} | ||
/* | ||
Copyright 2018 Google LLC | ||
/* | ||
Copyright 2018 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. | ||
*/ | ||
const getFriendlyURL = url => { | ||
const urlObj = new URL(url, location); | ||
if (urlObj.origin === location.origin) { | ||
return urlObj.pathname; | ||
} | ||
return urlObj.href; | ||
}; | ||
const messages = { | ||
strategyStart: (strategyName, request) => `Using ${strategyName} to ` + `respond to '${getFriendlyURL(request.url)}'`, | ||
printFinalResponse: response => { | ||
if (response) { | ||
logger_mjs.logger.groupCollapsed(`View the final response here.`); | ||
logger_mjs.logger.log(response); | ||
logger_mjs.logger.groupEnd(); | ||
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. | ||
*/ | ||
const messages = { | ||
strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL_js.getFriendlyURL(request.url)}'`, | ||
printFinalResponse: response => { | ||
if (response) { | ||
logger_js.logger.groupCollapsed(`View the final response here.`); | ||
logger_js.logger.log(response || '[No response returned]'); | ||
logger_js.logger.groupEnd(); | ||
} | ||
} | ||
} | ||
}; | ||
}; | ||
/* | ||
Copyright 2018 Google LLC | ||
/* | ||
Copyright 2018 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. | ||
*/ | ||
/** | ||
* An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network} | ||
* request strategy. | ||
* | ||
* A cache first strategy is useful for assets that have been revisioned, | ||
* such as URLs like `/styles/example.a8f5f1.css`, since they | ||
* can be cached for long periods of time. | ||
* | ||
* If the network request fails, and there is no cache match, this will throw | ||
* a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
class CacheFirst { | ||
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. | ||
*/ | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
this._fetchOptions = options.fetchOptions || null; | ||
this._matchOptions = options.matchOptions || null; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network} | ||
* request strategy. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* A cache first strategy is useful for assets that have been revisioned, | ||
* such as URLs like `/styles/example.a8f5f1.css`, since they | ||
* can be cached for long periods of time. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* If the network request fails, and there is no cache match, this will throw | ||
* a `WorkboxError` exception. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
* @memberof workbox.strategies | ||
*/ | ||
class CacheFirst { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_js.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
this._fetchOptions = options.fetchOptions; | ||
this._matchOptions = options.matchOptions; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
async makeRequest({ | ||
event, | ||
request | ||
}) { | ||
const logs = []; | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
{ | ||
assert_mjs.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'CacheFirst', | ||
funcName: 'makeRequest', | ||
paramName: 'request' | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {Event} [options.event] If provided, `event.waitUntil()` will | ||
be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
*/ | ||
let response = await cacheWrapper_mjs.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
async makeRequest({ | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
let error; | ||
request | ||
}) { | ||
const logs = []; | ||
if (!response) { | ||
{ | ||
logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will respond with a network request.`); | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
try { | ||
response = await this._getFromNetwork(request, event); | ||
} catch (err) { | ||
error = err; | ||
{ | ||
assert_js.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'CacheFirst', | ||
funcName: 'makeRequest', | ||
paramName: 'request' | ||
}); | ||
} | ||
{ | ||
if (response) { | ||
logs.push(`Got response from network.`); | ||
} else { | ||
logs.push(`Unable to get a response from the network.`); | ||
let response = await cacheWrapper_js.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
let error; | ||
if (!response) { | ||
{ | ||
logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will respond with a network request.`); | ||
} | ||
try { | ||
response = await this._getFromNetwork(request, event); | ||
} catch (err) { | ||
error = err; | ||
} | ||
{ | ||
if (response) { | ||
logs.push(`Got response from network.`); | ||
} else { | ||
logs.push(`Unable to get a response from the network.`); | ||
} | ||
} | ||
} else { | ||
{ | ||
logs.push(`Found a cached response in the '${this._cacheName}' cache.`); | ||
} | ||
} | ||
} else { | ||
{ | ||
logs.push(`Found a cached response in the '${this._cacheName}' cache.`); | ||
} | ||
} | ||
logger_js.logger.groupCollapsed(messages.strategyStart('CacheFirst', request)); | ||
{ | ||
logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheFirst', request)); | ||
for (let log of logs) { | ||
logger_js.logger.log(log); | ||
} | ||
for (let log of logs) { | ||
logger_mjs.logger.log(log); | ||
messages.printFinalResponse(response); | ||
logger_js.logger.groupEnd(); | ||
} | ||
messages.printFinalResponse(response); | ||
logger_mjs.logger.groupEnd(); | ||
} | ||
if (!response) { | ||
throw new WorkboxError_js.WorkboxError('no-response', { | ||
url: request.url, | ||
error | ||
}); | ||
} | ||
if (!response) { | ||
throw new WorkboxError_mjs.WorkboxError('no-response', { | ||
url: request.url, | ||
error | ||
}); | ||
return response; | ||
} | ||
/** | ||
* Handles the network and cache part of CacheFirst. | ||
* | ||
* @param {Request} request | ||
* @param {Event} [event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
return response; | ||
} | ||
/** | ||
* Handles the network and cache part of CacheFirst. | ||
* | ||
* @param {Request} request | ||
* @param {FetchEvent} [event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
async _getFromNetwork(request, event) { | ||
const response = await fetchWrapper_js.fetchWrapper.fetch({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
}); // Keep the service worker while we put the request to the cache | ||
async _getFromNetwork(request, event) { | ||
const response = await fetchWrapper_mjs.fetchWrapper.fetch({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
}); // Keep the service worker while we put the request to the cache | ||
const responseClone = response.clone(); | ||
const cachePutPromise = cacheWrapper_js.cacheWrapper.put({ | ||
cacheName: this._cacheName, | ||
request, | ||
response: responseClone, | ||
event, | ||
plugins: this._plugins | ||
}); | ||
const responseClone = response.clone(); | ||
const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({ | ||
cacheName: this._cacheName, | ||
request, | ||
response: responseClone, | ||
event, | ||
plugins: this._plugins | ||
}); | ||
if (event) { | ||
try { | ||
event.waitUntil(cachePutPromise); | ||
} catch (error) { | ||
{ | ||
logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); | ||
if (event) { | ||
try { | ||
event.waitUntil(cachePutPromise); | ||
} catch (error) { | ||
{ | ||
logger_js.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_js.getFriendlyURL(request.url)}'.`); | ||
} | ||
} | ||
} | ||
return response; | ||
} | ||
return response; | ||
} | ||
} | ||
/* | ||
Copyright 2018 Google LLC | ||
/* | ||
Copyright 2018 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. | ||
*/ | ||
/** | ||
* An implementation of a | ||
* [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only} | ||
* request strategy. | ||
* | ||
* This class is useful if you want to take advantage of any | ||
* [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. | ||
* | ||
* If there is no cache match, this will throw a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
class CacheOnly { | ||
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. | ||
*/ | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
this._matchOptions = options.matchOptions || null; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* An implementation of a | ||
* [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only} | ||
* request strategy. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* This class is useful if you want to take advantage of any | ||
* [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* If there is no cache match, this will throw a `WorkboxError` exception. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
* @memberof workbox.strategies | ||
*/ | ||
async makeRequest({ | ||
event, | ||
request | ||
}) { | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
class CacheOnly { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_js.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
this._matchOptions = options.matchOptions; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
{ | ||
assert_mjs.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'CacheOnly', | ||
funcName: 'makeRequest', | ||
paramName: 'request' | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
*/ | ||
const response = await cacheWrapper_mjs.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
async makeRequest({ | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
request | ||
}) { | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
{ | ||
logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheOnly', request)); | ||
if (response) { | ||
logger_mjs.logger.log(`Found a cached response in the '${this._cacheName}'` + ` cache.`); | ||
messages.printFinalResponse(response); | ||
} else { | ||
logger_mjs.logger.log(`No response found in the '${this._cacheName}' cache.`); | ||
{ | ||
assert_js.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'CacheOnly', | ||
funcName: 'makeRequest', | ||
paramName: 'request' | ||
}); | ||
} | ||
logger_mjs.logger.groupEnd(); | ||
} | ||
if (!response) { | ||
throw new WorkboxError_mjs.WorkboxError('no-response', { | ||
url: request.url | ||
const response = await cacheWrapper_js.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
} | ||
return response; | ||
} | ||
{ | ||
logger_js.logger.groupCollapsed(messages.strategyStart('CacheOnly', request)); | ||
} | ||
if (response) { | ||
logger_js.logger.log(`Found a cached response in the '${this._cacheName}'` + ` cache.`); | ||
messages.printFinalResponse(response); | ||
} else { | ||
logger_js.logger.log(`No response found in the '${this._cacheName}' cache.`); | ||
} | ||
/* | ||
Copyright 2018 Google LLC | ||
logger_js.logger.groupEnd(); | ||
} | ||
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. | ||
*/ | ||
const cacheOkAndOpaquePlugin = { | ||
/** | ||
* Returns a valid response (to allow caching) if the status is 200 (OK) or | ||
* 0 (opaque). | ||
* | ||
* @param {Object} options | ||
* @param {Response} options.response | ||
* @return {Response|null} | ||
* | ||
* @private | ||
*/ | ||
cacheWillUpdate: ({ | ||
response | ||
}) => { | ||
if (response.status === 200 || response.status === 0) { | ||
if (!response) { | ||
throw new WorkboxError_js.WorkboxError('no-response', { | ||
url: request.url | ||
}); | ||
} | ||
return response; | ||
} | ||
return null; | ||
} | ||
}; | ||
/* | ||
Copyright 2018 Google LLC | ||
/* | ||
Copyright 2018 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. | ||
*/ | ||
/** | ||
* An implementation of a | ||
* [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache} | ||
* request strategy. | ||
* | ||
* By default, this strategy will cache responses with a 200 status code as | ||
* well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. | ||
* Opaque responses are are cross-origin requests where the response doesn't | ||
* support [CORS]{@link https://enable-cors.org/}. | ||
* | ||
* If the network request fails, and there is no cache match, this will throw | ||
* a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
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. | ||
*/ | ||
const cacheOkAndOpaquePlugin = { | ||
/** | ||
* Returns a valid response (to allow caching) if the status is 200 (OK) or | ||
* 0 (opaque). | ||
* | ||
* @param {Object} options | ||
* @param {Response} options.response | ||
* @return {Response|null} | ||
* | ||
* @private | ||
*/ | ||
cacheWillUpdate: async ({ | ||
response | ||
}) => { | ||
if (response.status === 200 || response.status === 0) { | ||
return response; | ||
} | ||
class NetworkFirst { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
* @param {number} options.networkTimeoutSeconds If set, any network requests | ||
* that fail to respond within the timeout will fallback to the cache. | ||
* | ||
* This option can be used to combat | ||
* "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" | ||
* scenarios. | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); | ||
if (options.plugins) { | ||
let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); | ||
this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; | ||
} else { | ||
// No plugins passed in, use the default plugin. | ||
this._plugins = [cacheOkAndOpaquePlugin]; | ||
return null; | ||
} | ||
}; | ||
this._networkTimeoutSeconds = options.networkTimeoutSeconds; | ||
/* | ||
Copyright 2018 Google LLC | ||
{ | ||
if (this._networkTimeoutSeconds) { | ||
assert_mjs.assert.isType(this._networkTimeoutSeconds, 'number', { | ||
moduleName: 'workbox-strategies', | ||
className: 'NetworkFirst', | ||
funcName: 'constructor', | ||
paramName: 'networkTimeoutSeconds' | ||
}); | ||
} | ||
} | ||
this._fetchOptions = options.fetchOptions || null; | ||
this._matchOptions = options.matchOptions || null; | ||
} | ||
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. | ||
*/ | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* An implementation of a | ||
* [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache} | ||
* request strategy. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* By default, this strategy will cache responses with a 200 status code as | ||
* well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. | ||
* Opaque responses are are cross-origin requests where the response doesn't | ||
* support [CORS]{@link https://enable-cors.org/}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* If the network request fails, and there is no cache match, this will throw | ||
* a `WorkboxError` exception. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
* @memberof workbox.strategies | ||
*/ | ||
class NetworkFirst { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
* @param {number} options.networkTimeoutSeconds If set, any network requests | ||
* that fail to respond within the timeout will fallback to the cache. | ||
* | ||
* This option can be used to combat | ||
* "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" | ||
* scenarios. | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_js.cacheNames.getRuntimeName(options.cacheName); | ||
async makeRequest({ | ||
event, | ||
request | ||
}) { | ||
const logs = []; | ||
if (options.plugins) { | ||
let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); | ||
this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; | ||
} else { | ||
// No plugins passed in, use the default plugin. | ||
this._plugins = [cacheOkAndOpaquePlugin]; | ||
} | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; | ||
{ | ||
assert_mjs.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'NetworkFirst', | ||
funcName: 'handle', | ||
paramName: 'makeRequest' | ||
}); | ||
{ | ||
if (this._networkTimeoutSeconds) { | ||
assert_js.assert.isType(this._networkTimeoutSeconds, 'number', { | ||
moduleName: 'workbox-strategies', | ||
className: 'NetworkFirst', | ||
funcName: 'constructor', | ||
paramName: 'networkTimeoutSeconds' | ||
}); | ||
} | ||
} | ||
this._fetchOptions = options.fetchOptions; | ||
this._matchOptions = options.matchOptions; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
const promises = []; | ||
let timeoutId; | ||
if (this._networkTimeoutSeconds) { | ||
const { | ||
id, | ||
promise | ||
} = this._getTimeoutPromise({ | ||
request, | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
logs | ||
request: request || event.request | ||
}); | ||
timeoutId = id; | ||
promises.push(promise); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
*/ | ||
const networkPromise = this._getNetworkPromise({ | ||
timeoutId, | ||
request, | ||
async makeRequest({ | ||
event, | ||
logs | ||
}); | ||
request | ||
}) { | ||
const logs = []; | ||
promises.push(networkPromise); // Promise.race() will resolve as soon as the first promise resolves. | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
let response = await Promise.race(promises); // If Promise.race() resolved with null, it might be due to a network | ||
// timeout + a cache miss. If that were to happen, we'd rather wait until | ||
// the networkPromise resolves instead of returning null. | ||
// Note that it's fine to await an already-resolved promise, so we don't | ||
// have to check to see if it's still "in flight". | ||
{ | ||
assert_js.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'NetworkFirst', | ||
funcName: 'handle', | ||
paramName: 'makeRequest' | ||
}); | ||
} | ||
if (!response) { | ||
response = await networkPromise; | ||
} | ||
const promises = []; | ||
let timeoutId; | ||
{ | ||
logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkFirst', request)); | ||
if (this._networkTimeoutSeconds) { | ||
const { | ||
id, | ||
promise | ||
} = this._getTimeoutPromise({ | ||
request, | ||
event, | ||
logs | ||
}); | ||
for (let log of logs) { | ||
logger_mjs.logger.log(log); | ||
timeoutId = id; | ||
promises.push(promise); | ||
} | ||
messages.printFinalResponse(response); | ||
logger_mjs.logger.groupEnd(); | ||
} | ||
if (!response) { | ||
throw new WorkboxError_mjs.WorkboxError('no-response', { | ||
url: request.url | ||
const networkPromise = this._getNetworkPromise({ | ||
timeoutId, | ||
request, | ||
event, | ||
logs | ||
}); | ||
} | ||
return response; | ||
} | ||
/** | ||
* @param {Object} options | ||
* @param {Request} options.request | ||
* @param {Array} options.logs A reference to the logs array | ||
* @param {Event} [options.event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
promises.push(networkPromise); // Promise.race() will resolve as soon as the first promise resolves. | ||
let response = await Promise.race(promises); // If Promise.race() resolved with null, it might be due to a network | ||
// timeout + a cache miss. If that were to happen, we'd rather wait until | ||
// the networkPromise resolves instead of returning null. | ||
// Note that it's fine to await an already-resolved promise, so we don't | ||
// have to check to see if it's still "in flight". | ||
_getTimeoutPromise({ | ||
request, | ||
logs, | ||
event | ||
}) { | ||
let timeoutId; | ||
const timeoutPromise = new Promise(resolve => { | ||
const onNetworkTimeout = async () => { | ||
{ | ||
logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); | ||
if (!response) { | ||
response = await networkPromise; | ||
} | ||
{ | ||
logger_js.logger.groupCollapsed(messages.strategyStart('NetworkFirst', request)); | ||
for (let log of logs) { | ||
logger_js.logger.log(log); | ||
} | ||
resolve((await this._respondFromCache({ | ||
request, | ||
event | ||
}))); | ||
}; | ||
messages.printFinalResponse(response); | ||
logger_js.logger.groupEnd(); | ||
} | ||
timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); | ||
}); | ||
return { | ||
promise: timeoutPromise, | ||
id: timeoutId | ||
}; | ||
} | ||
/** | ||
* @param {Object} options | ||
* @param {number|undefined} options.timeoutId | ||
* @param {Request} options.request | ||
* @param {Array} options.logs A reference to the logs Array. | ||
* @param {Event} [options.event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
if (!response) { | ||
throw new WorkboxError_js.WorkboxError('no-response', { | ||
url: request.url | ||
}); | ||
} | ||
return response; | ||
} | ||
/** | ||
* @param {Object} options | ||
* @param {Request} options.request | ||
* @param {Array} options.logs A reference to the logs array | ||
* @param {Event} [options.event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
async _getNetworkPromise({ | ||
timeoutId, | ||
request, | ||
logs, | ||
event | ||
}) { | ||
let error; | ||
let response; | ||
try { | ||
response = await fetchWrapper_mjs.fetchWrapper.fetch({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
_getTimeoutPromise({ | ||
request, | ||
logs, | ||
event | ||
}) { | ||
let timeoutId; | ||
const timeoutPromise = new Promise(resolve => { | ||
const onNetworkTimeout = async () => { | ||
{ | ||
logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); | ||
} | ||
resolve((await this._respondFromCache({ | ||
request, | ||
event | ||
}))); | ||
}; | ||
timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); | ||
}); | ||
} catch (err) { | ||
error = err; | ||
return { | ||
promise: timeoutPromise, | ||
id: timeoutId | ||
}; | ||
} | ||
/** | ||
* @param {Object} options | ||
* @param {number|undefined} options.timeoutId | ||
* @param {Request} options.request | ||
* @param {Array} options.logs A reference to the logs Array. | ||
* @param {Event} [options.event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
if (timeoutId) { | ||
clearTimeout(timeoutId); | ||
} | ||
{ | ||
if (response) { | ||
logs.push(`Got response from network.`); | ||
} else { | ||
logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); | ||
async _getNetworkPromise({ | ||
timeoutId, | ||
request, | ||
logs, | ||
event | ||
}) { | ||
let error; | ||
let response; | ||
try { | ||
response = await fetchWrapper_js.fetchWrapper.fetch({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
}); | ||
} catch (err) { | ||
error = err; | ||
} | ||
} | ||
if (error || !response) { | ||
response = await this._respondFromCache({ | ||
request, | ||
event | ||
}); | ||
if (timeoutId) { | ||
clearTimeout(timeoutId); | ||
} | ||
{ | ||
if (response) { | ||
logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache.`); | ||
logs.push(`Got response from network.`); | ||
} else { | ||
logs.push(`No response found in the '${this._cacheName}' cache.`); | ||
logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); | ||
} | ||
} | ||
} else { | ||
// Keep the service worker alive while we put the request in the cache | ||
const responseClone = response.clone(); | ||
const cachePut = cacheWrapper_mjs.cacheWrapper.put({ | ||
cacheName: this._cacheName, | ||
request, | ||
response: responseClone, | ||
event, | ||
plugins: this._plugins | ||
}); | ||
if (event) { | ||
try { | ||
// The event has been responded to so we can keep the SW alive to | ||
// respond to the request | ||
event.waitUntil(cachePut); | ||
} catch (err) { | ||
{ | ||
logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); | ||
if (error || !response) { | ||
response = await this._respondFromCache({ | ||
request, | ||
event | ||
}); | ||
{ | ||
if (response) { | ||
logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache.`); | ||
} else { | ||
logs.push(`No response found in the '${this._cacheName}' cache.`); | ||
} | ||
} | ||
} else { | ||
// Keep the service worker alive while we put the request in the cache | ||
const responseClone = response.clone(); | ||
const cachePut = cacheWrapper_js.cacheWrapper.put({ | ||
cacheName: this._cacheName, | ||
request, | ||
response: responseClone, | ||
event, | ||
plugins: this._plugins | ||
}); | ||
if (event) { | ||
try { | ||
// The event has been responded to so we can keep the SW alive to | ||
// respond to the request | ||
event.waitUntil(cachePut); | ||
} catch (err) { | ||
{ | ||
logger_js.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_js.getFriendlyURL(request.url)}'.`); | ||
} | ||
} | ||
} | ||
} | ||
return response; | ||
} | ||
/** | ||
* Used if the network timeouts or fails to make the request. | ||
* | ||
* @param {Object} options | ||
* @param {Request} request The request to match in the cache | ||
* @param {Event} [options.event] | ||
* @return {Promise<Object>} | ||
* | ||
* @private | ||
*/ | ||
return response; | ||
} | ||
/** | ||
* Used if the network timeouts or fails to make the request. | ||
* | ||
* @param {Object} options | ||
* @param {Request} request The request to match in the cache | ||
* @param {Event} [options.event] | ||
* @return {Promise<Object>} | ||
* | ||
* @private | ||
*/ | ||
_respondFromCache({ | ||
event, | ||
request | ||
}) { | ||
return cacheWrapper_mjs.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
_respondFromCache({ | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
} | ||
request | ||
}) { | ||
return cacheWrapper_js.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
} | ||
} | ||
/* | ||
Copyright 2018 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. | ||
*/ | ||
/** | ||
* An implementation of a | ||
* [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only} | ||
* request strategy. | ||
* | ||
* This class is useful if you want to take advantage of any | ||
* [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. | ||
* | ||
* If the network request fails, this will throw a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
class NetworkOnly { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
this._fetchOptions = options.fetchOptions || null; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
/* | ||
Copyright 2018 Google LLC | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
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. | ||
*/ | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* An implementation of a | ||
* [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only} | ||
* request strategy. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* This class is useful if you want to take advantage of any | ||
* [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
* If the network request fails, this will throw a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
async makeRequest({ | ||
event, | ||
request | ||
}) { | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
class NetworkOnly { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
*/ | ||
constructor(options = {}) { | ||
this._plugins = options.plugins || []; | ||
this._fetchOptions = options.fetchOptions; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
{ | ||
assert_mjs.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'NetworkOnly', | ||
funcName: 'handle', | ||
paramName: 'request' | ||
}); | ||
} | ||
let error; | ||
let response; | ||
try { | ||
response = await fetchWrapper_mjs.fetchWrapper.fetch({ | ||
request, | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
request: request || event.request | ||
}); | ||
} catch (err) { | ||
error = err; | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
*/ | ||
{ | ||
logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkOnly', request)); | ||
if (response) { | ||
logger_mjs.logger.log(`Got response from network.`); | ||
} else { | ||
logger_mjs.logger.log(`Unable to get a response from the network.`); | ||
async makeRequest({ | ||
event, | ||
request | ||
}) { | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
messages.printFinalResponse(response); | ||
logger_mjs.logger.groupEnd(); | ||
} | ||
{ | ||
assert_js.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'NetworkOnly', | ||
funcName: 'handle', | ||
paramName: 'request' | ||
}); | ||
} | ||
if (!response) { | ||
throw new WorkboxError_mjs.WorkboxError('no-response', { | ||
url: request.url, | ||
error | ||
}); | ||
} | ||
let error; | ||
let response; | ||
return response; | ||
} | ||
try { | ||
response = await fetchWrapper_js.fetchWrapper.fetch({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
}); | ||
} catch (err) { | ||
error = err; | ||
} | ||
} | ||
{ | ||
logger_js.logger.groupCollapsed(messages.strategyStart('NetworkOnly', request)); | ||
/* | ||
Copyright 2018 Google LLC | ||
if (response) { | ||
logger_js.logger.log(`Got response from network.`); | ||
} else { | ||
logger_js.logger.log(`Unable to get a response from the network.`); | ||
} | ||
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. | ||
*/ | ||
/** | ||
* An implementation of a | ||
* [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate} | ||
* request strategy. | ||
* | ||
* Resources are requested from both the cache and the network in parallel. | ||
* The strategy will respond with the cached version if available, otherwise | ||
* wait for the network response. The cache is updated with the network response | ||
* with each successful request. | ||
* | ||
* By default, this strategy will cache responses with a 200 status code as | ||
* well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. | ||
* Opaque responses are are cross-origin requests where the response doesn't | ||
* support [CORS]{@link https://enable-cors.org/}. | ||
* | ||
* If the network request fails, and there is no cache match, this will throw | ||
* a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
messages.printFinalResponse(response); | ||
logger_js.logger.groupEnd(); | ||
} | ||
class StaleWhileRevalidate { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
if (!response) { | ||
throw new WorkboxError_js.WorkboxError('no-response', { | ||
url: request.url, | ||
error | ||
}); | ||
} | ||
if (options.plugins) { | ||
let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); | ||
this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; | ||
} else { | ||
// No plugins passed in, use the default plugin. | ||
this._plugins = [cacheOkAndOpaquePlugin]; | ||
return response; | ||
} | ||
this._fetchOptions = options.fetchOptions || null; | ||
this._matchOptions = options.matchOptions || null; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
/* | ||
Copyright 2018 Google LLC | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
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. | ||
*/ | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* An implementation of a | ||
* [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate} | ||
* request strategy. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* Resources are requested from both the cache and the network in parallel. | ||
* The strategy will respond with the cached version if available, otherwise | ||
* wait for the network response. The cache is updated with the network response | ||
* with each successful request. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
* By default, this strategy will cache responses with a 200 status code as | ||
* well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. | ||
* Opaque responses are are cross-origin requests where the response doesn't | ||
* support [CORS]{@link https://enable-cors.org/}. | ||
* | ||
* If the network request fails, and there is no cache match, this will throw | ||
* a `WorkboxError` exception. | ||
* | ||
* @memberof workbox.strategies | ||
*/ | ||
class StaleWhileRevalidate { | ||
/** | ||
* @param {Object} options | ||
* @param {string} options.cacheName Cache name to store and retrieve | ||
* requests. Defaults to cache names provided by | ||
* [workbox-core]{@link workbox.core.cacheNames}. | ||
* @param {Array<Object>} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} | ||
* to use in conjunction with this caching strategy. | ||
* @param {Object} options.fetchOptions Values passed along to the | ||
* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) | ||
* of all fetch() requests made by this strategy. | ||
* @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) | ||
*/ | ||
constructor(options = {}) { | ||
this._cacheName = cacheNames_js.cacheNames.getRuntimeName(options.cacheName); | ||
this._plugins = options.plugins || []; | ||
async makeRequest({ | ||
event, | ||
request | ||
}) { | ||
const logs = []; | ||
if (options.plugins) { | ||
let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); | ||
this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; | ||
} else { | ||
// No plugins passed in, use the default plugin. | ||
this._plugins = [cacheOkAndOpaquePlugin]; | ||
} | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
this._fetchOptions = options.fetchOptions; | ||
this._matchOptions = options.matchOptions; | ||
} | ||
/** | ||
* This method will perform a request strategy and follows an API that | ||
* will work with the | ||
* [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* @param {Object} options | ||
* @param {Request} options.request The request to run this strategy for. | ||
* @param {Event} [options.event] The event that triggered the request. | ||
* @return {Promise<Response>} | ||
*/ | ||
{ | ||
assert_mjs.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'StaleWhileRevalidate', | ||
funcName: 'handle', | ||
paramName: 'request' | ||
async handle({ | ||
event, | ||
request | ||
}) { | ||
return this.makeRequest({ | ||
event, | ||
request: request || event.request | ||
}); | ||
} | ||
/** | ||
* This method can be used to perform a make a standalone request outside the | ||
* context of the [Workbox Router]{@link workbox.routing.Router}. | ||
* | ||
* See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" | ||
* for more usage information. | ||
* | ||
* @param {Object} options | ||
* @param {Request|string} options.request Either a | ||
* [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} | ||
* object, or a string URL, corresponding to the request to be made. | ||
* @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will | ||
* be called automatically to extend the service worker's lifetime. | ||
* @return {Promise<Response>} | ||
*/ | ||
const fetchAndCachePromise = this._getFromNetwork({ | ||
request, | ||
event | ||
}); | ||
let response = await cacheWrapper_mjs.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
async makeRequest({ | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
let error; | ||
request | ||
}) { | ||
const logs = []; | ||
if (response) { | ||
if (typeof request === 'string') { | ||
request = new Request(request); | ||
} | ||
{ | ||
logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache. Will update with the network response in the background.`); | ||
assert_js.assert.isInstance(request, Request, { | ||
moduleName: 'workbox-strategies', | ||
className: 'StaleWhileRevalidate', | ||
funcName: 'handle', | ||
paramName: 'request' | ||
}); | ||
} | ||
if (event) { | ||
try { | ||
event.waitUntil(fetchAndCachePromise); | ||
} catch (error) { | ||
{ | ||
logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); | ||
const fetchAndCachePromise = this._getFromNetwork({ | ||
request, | ||
event | ||
}); | ||
let response = await cacheWrapper_js.cacheWrapper.match({ | ||
cacheName: this._cacheName, | ||
request, | ||
event, | ||
matchOptions: this._matchOptions, | ||
plugins: this._plugins | ||
}); | ||
let error; | ||
if (response) { | ||
{ | ||
logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache. Will update with the network response in the background.`); | ||
} | ||
if (event) { | ||
try { | ||
event.waitUntil(fetchAndCachePromise); | ||
} catch (error) { | ||
{ | ||
logger_js.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_js.getFriendlyURL(request.url)}'.`); | ||
} | ||
} | ||
} | ||
} else { | ||
{ | ||
logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will wait for the network response.`); | ||
} | ||
try { | ||
response = await fetchAndCachePromise; | ||
} catch (err) { | ||
error = err; | ||
} | ||
} | ||
} else { | ||
{ | ||
logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will wait for the network response.`); | ||
} | ||
logger_js.logger.groupCollapsed(messages.strategyStart('StaleWhileRevalidate', request)); | ||
try { | ||
response = await fetchAndCachePromise; | ||
} catch (err) { | ||
error = err; | ||
for (let log of logs) { | ||
logger_js.logger.log(log); | ||
} | ||
messages.printFinalResponse(response); | ||
logger_js.logger.groupEnd(); | ||
} | ||
} | ||
{ | ||
logger_mjs.logger.groupCollapsed(messages.strategyStart('StaleWhileRevalidate', request)); | ||
for (let log of logs) { | ||
logger_mjs.logger.log(log); | ||
if (!response) { | ||
throw new WorkboxError_js.WorkboxError('no-response', { | ||
url: request.url, | ||
error | ||
}); | ||
} | ||
messages.printFinalResponse(response); | ||
logger_mjs.logger.groupEnd(); | ||
return response; | ||
} | ||
/** | ||
* @param {Object} options | ||
* @param {Request} options.request | ||
* @param {Event} [options.event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
if (!response) { | ||
throw new WorkboxError_mjs.WorkboxError('no-response', { | ||
url: request.url, | ||
error | ||
}); | ||
} | ||
return response; | ||
} | ||
/** | ||
* @param {Object} options | ||
* @param {Request} options.request | ||
* @param {Event} [options.event] | ||
* @return {Promise<Response>} | ||
* | ||
* @private | ||
*/ | ||
async _getFromNetwork({ | ||
request, | ||
event | ||
}) { | ||
const response = await fetchWrapper_mjs.fetchWrapper.fetch({ | ||
async _getFromNetwork({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
}); | ||
const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({ | ||
cacheName: this._cacheName, | ||
request, | ||
response: response.clone(), | ||
event, | ||
plugins: this._plugins | ||
}); | ||
event | ||
}) { | ||
const response = await fetchWrapper_js.fetchWrapper.fetch({ | ||
request, | ||
event, | ||
fetchOptions: this._fetchOptions, | ||
plugins: this._plugins | ||
}); | ||
const cachePutPromise = cacheWrapper_js.cacheWrapper.put({ | ||
cacheName: this._cacheName, | ||
request, | ||
response: response.clone(), | ||
event, | ||
plugins: this._plugins | ||
}); | ||
if (event) { | ||
try { | ||
event.waitUntil(cachePutPromise); | ||
} catch (error) { | ||
{ | ||
logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); | ||
if (event) { | ||
try { | ||
event.waitUntil(cachePutPromise); | ||
} catch (error) { | ||
{ | ||
logger_js.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_js.getFriendlyURL(request.url)}'.`); | ||
} | ||
} | ||
} | ||
return response; | ||
} | ||
return response; | ||
} | ||
} | ||
/* | ||
Copyright 2018 Google LLC | ||
/* | ||
Copyright 2018 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. | ||
*/ | ||
const mapping = { | ||
cacheFirst: CacheFirst, | ||
cacheOnly: CacheOnly, | ||
networkFirst: NetworkFirst, | ||
networkOnly: NetworkOnly, | ||
staleWhileRevalidate: StaleWhileRevalidate | ||
}; | ||
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. | ||
*/ | ||
const mapping = { | ||
cacheFirst: CacheFirst, | ||
cacheOnly: CacheOnly, | ||
networkFirst: NetworkFirst, | ||
networkOnly: NetworkOnly, | ||
staleWhileRevalidate: StaleWhileRevalidate | ||
}; | ||
const deprecate = strategy => { | ||
const StrategyCtr = mapping[strategy]; | ||
return options => { | ||
{ | ||
const strategyCtrName = strategy[0].toUpperCase() + strategy.slice(1); | ||
logger_js.logger.warn(`The 'workbox.strategies.${strategy}()' function has been ` + `deprecated and will be removed in a future version of Workbox.\n` + `Please use 'new workbox.strategies.${strategyCtrName}()' instead.`); | ||
} | ||
const deprecate = strategy => { | ||
const StrategyCtr = mapping[strategy]; | ||
return options => { | ||
{ | ||
const strategyCtrName = strategy[0].toUpperCase() + strategy.slice(1); | ||
logger_mjs.logger.warn(`The 'workbox.strategies.${strategy}()' function has been ` + `deprecated and will be removed in a future version of Workbox.\n` + `Please use 'new workbox.strategies.${strategyCtrName}()' instead.`); | ||
} | ||
return new StrategyCtr(options); | ||
return new StrategyCtr(options); | ||
}; | ||
}; | ||
}; | ||
/** | ||
* @function workbox.strategies.cacheFirst | ||
* @param {Object} options See the {@link workbox.strategies.CacheFirst} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
/** | ||
* @function workbox.strategies.cacheFirst | ||
* @param {Object} options See the {@link workbox.strategies.CacheFirst} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const cacheFirst = deprecate('cacheFirst'); | ||
/** | ||
* @function workbox.strategies.cacheOnly | ||
* @param {Object} options See the {@link workbox.strategies.CacheOnly} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const cacheFirst = deprecate('cacheFirst'); | ||
/** | ||
* @function workbox.strategies.cacheOnly | ||
* @param {Object} options See the {@link workbox.strategies.CacheOnly} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const cacheOnly = deprecate('cacheOnly'); | ||
/** | ||
* @function workbox.strategies.networkFirst | ||
* @param {Object} options See the {@link workbox.strategies.NetworkFirst} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const cacheOnly = deprecate('cacheOnly'); | ||
/** | ||
* @function workbox.strategies.networkFirst | ||
* @param {Object} options See the {@link workbox.strategies.NetworkFirst} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const networkFirst = deprecate('networkFirst'); | ||
/** | ||
* @function workbox.strategies.networkOnly | ||
* @param {Object} options See the {@link workbox.strategies.NetworkOnly} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const networkFirst = deprecate('networkFirst'); | ||
/** | ||
* @function workbox.strategies.networkOnly | ||
* @param {Object} options See the {@link workbox.strategies.NetworkOnly} | ||
* constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const networkOnly = deprecate('networkOnly'); | ||
/** | ||
* @function workbox.strategies.staleWhileRevalidate | ||
* @param {Object} options See the | ||
* {@link workbox.strategies.StaleWhileRevalidate} constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const networkOnly = deprecate('networkOnly'); | ||
/** | ||
* @function workbox.strategies.staleWhileRevalidate | ||
* @param {Object} options See the | ||
* {@link workbox.strategies.StaleWhileRevalidate} constructor for more info. | ||
* @deprecated since v4.0.0 | ||
*/ | ||
const staleWhileRevalidate = deprecate('staleWhileRevalidate'); | ||
const staleWhileRevalidate = deprecate('staleWhileRevalidate'); | ||
exports.CacheFirst = CacheFirst; | ||
exports.CacheOnly = CacheOnly; | ||
exports.NetworkFirst = NetworkFirst; | ||
exports.NetworkOnly = NetworkOnly; | ||
exports.StaleWhileRevalidate = StaleWhileRevalidate; | ||
exports.cacheFirst = cacheFirst; | ||
exports.cacheOnly = cacheOnly; | ||
exports.networkFirst = networkFirst; | ||
exports.networkOnly = networkOnly; | ||
exports.staleWhileRevalidate = staleWhileRevalidate; | ||
exports.CacheFirst = CacheFirst; | ||
exports.CacheOnly = CacheOnly; | ||
exports.NetworkFirst = NetworkFirst; | ||
exports.NetworkOnly = NetworkOnly; | ||
exports.StaleWhileRevalidate = StaleWhileRevalidate; | ||
exports.cacheFirst = cacheFirst; | ||
exports.cacheOnly = cacheOnly; | ||
exports.networkFirst = networkFirst; | ||
exports.networkOnly = networkOnly; | ||
exports.staleWhileRevalidate = staleWhileRevalidate; | ||
return exports; | ||
return exports; | ||
}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); | ||
//# sourceMappingURL=workbox-strategies.dev.js.map |
@@ -1,2 +0,2 @@ | ||
this.workbox=this.workbox||{},this.workbox.strategies=function(e,t,s,n,r){"use strict";try{self["workbox:strategies:5.0.0-alpha.0"]&&_()}catch(e){}class i{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.i=e.fetchOptions||null,this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));let n,i=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(!i)try{i=await this.u(t,e)}catch(e){n=e}if(!i)throw new r.WorkboxError("no-response",{url:t.url,error:n});return i}async u(e,t){const r=await n.fetchWrapper.fetch({request:e,event:t,fetchOptions:this.i,plugins:this.s}),i=r.clone(),h=s.cacheWrapper.put({cacheName:this.t,request:e,response:i,event:t,plugins:this.s});if(t)try{t.waitUntil(h)}catch(e){}return r}}class h{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));const n=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(!n)throw new r.WorkboxError("no-response",{url:t.url});return n}}const u={cacheWillUpdate:({response:e})=>200===e.status||0===e.status?e:null};class a{constructor(e={}){if(this.t=t.cacheNames.getRuntimeName(e.cacheName),e.plugins){let t=e.plugins.some(e=>!!e.cacheWillUpdate);this.s=t?e.plugins:[u,...e.plugins]}else this.s=[u];this.o=e.networkTimeoutSeconds,this.i=e.fetchOptions||null,this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){const s=[];"string"==typeof t&&(t=new Request(t));const n=[];let i;if(this.o){const{id:r,promise:h}=this.l({request:t,event:e,logs:s});i=r,n.push(h)}const h=this.q({timeoutId:i,request:t,event:e,logs:s});n.push(h);let u=await Promise.race(n);if(u||(u=await h),!u)throw new r.WorkboxError("no-response",{url:t.url});return u}l({request:e,logs:t,event:s}){let n;return{promise:new Promise(t=>{n=setTimeout(async()=>{t(await this.p({request:e,event:s}))},1e3*this.o)}),id:n}}async q({timeoutId:e,request:t,logs:r,event:i}){let h,u;try{u=await n.fetchWrapper.fetch({request:t,event:i,fetchOptions:this.i,plugins:this.s})}catch(e){h=e}if(e&&clearTimeout(e),h||!u)u=await this.p({request:t,event:i});else{const e=u.clone(),n=s.cacheWrapper.put({cacheName:this.t,request:t,response:e,event:i,plugins:this.s});if(i)try{i.waitUntil(n)}catch(e){}}return u}p({event:e,request:t}){return s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s})}}class c{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.i=e.fetchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){let s,i;"string"==typeof t&&(t=new Request(t));try{i=await n.fetchWrapper.fetch({request:t,event:e,fetchOptions:this.i,plugins:this.s})}catch(e){s=e}if(!i)throw new r.WorkboxError("no-response",{url:t.url,error:s});return i}}class o{constructor(e={}){if(this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],e.plugins){let t=e.plugins.some(e=>!!e.cacheWillUpdate);this.s=t?e.plugins:[u,...e.plugins]}else this.s=[u];this.i=e.fetchOptions||null,this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));const n=this.u({request:t,event:e});let i,h=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(h){if(e)try{e.waitUntil(n)}catch(i){}}else try{h=await n}catch(e){i=e}if(!h)throw new r.WorkboxError("no-response",{url:t.url,error:i});return h}async u({request:e,event:t}){const r=await n.fetchWrapper.fetch({request:e,event:t,fetchOptions:this.i,plugins:this.s}),i=s.cacheWrapper.put({cacheName:this.t,request:e,response:r.clone(),event:t,plugins:this.s});if(t)try{t.waitUntil(i)}catch(e){}return r}}const l={cacheFirst:i,cacheOnly:h,networkFirst:a,networkOnly:c,staleWhileRevalidate:o},q=e=>{const t=l[e];return e=>new t(e)},w=q("cacheFirst"),p=q("cacheOnly"),v=q("networkFirst"),y=q("networkOnly"),m=q("staleWhileRevalidate");return e.CacheFirst=i,e.CacheOnly=h,e.NetworkFirst=a,e.NetworkOnly=c,e.StaleWhileRevalidate=o,e.cacheFirst=w,e.cacheOnly=p,e.networkFirst=v,e.networkOnly=y,e.staleWhileRevalidate=m,e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private); | ||
this.workbox=this.workbox||{},this.workbox.strategies=function(e,t,s,n,r){"use strict";try{self["workbox:strategies:5.0.0-alpha.1"]&&_()}catch(e){}class i{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.i=e.fetchOptions,this.h=e.matchOptions}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));let n,i=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(!i)try{i=await this.o(t,e)}catch(e){n=e}if(!i)throw new r.WorkboxError("no-response",{url:t.url,error:n});return i}async o(e,t){const r=await n.fetchWrapper.fetch({request:e,event:t,fetchOptions:this.i,plugins:this.s}),i=r.clone(),h=s.cacheWrapper.put({cacheName:this.t,request:e,response:i,event:t,plugins:this.s});if(t)try{t.waitUntil(h)}catch(e){}return r}}class h{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.h=e.matchOptions}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));const n=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(!n)throw new r.WorkboxError("no-response",{url:t.url});return n}}const a={cacheWillUpdate:async({response:e})=>200===e.status||0===e.status?e:null};class c{constructor(e={}){if(this.t=t.cacheNames.getRuntimeName(e.cacheName),e.plugins){let t=e.plugins.some(e=>!!e.cacheWillUpdate);this.s=t?e.plugins:[a,...e.plugins]}else this.s=[a];this.u=e.networkTimeoutSeconds||0,this.i=e.fetchOptions,this.h=e.matchOptions}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){const s=[];"string"==typeof t&&(t=new Request(t));const n=[];let i;if(this.u){const{id:r,promise:h}=this.l({request:t,event:e,logs:s});i=r,n.push(h)}const h=this.q({timeoutId:i,request:t,event:e,logs:s});n.push(h);let a=await Promise.race(n);if(a||(a=await h),!a)throw new r.WorkboxError("no-response",{url:t.url});return a}l({request:e,logs:t,event:s}){let n;return{promise:new Promise(t=>{n=setTimeout(async()=>{t(await this.p({request:e,event:s}))},1e3*this.u)}),id:n}}async q({timeoutId:e,request:t,logs:r,event:i}){let h,a;try{a=await n.fetchWrapper.fetch({request:t,event:i,fetchOptions:this.i,plugins:this.s})}catch(e){h=e}if(e&&clearTimeout(e),h||!a)a=await this.p({request:t,event:i});else{const e=a.clone(),n=s.cacheWrapper.put({cacheName:this.t,request:t,response:e,event:i,plugins:this.s});if(i)try{i.waitUntil(n)}catch(e){}}return a}p({event:e,request:t}){return s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s})}}class o{constructor(e={}){this.s=e.plugins||[],this.i=e.fetchOptions}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){let s,i;"string"==typeof t&&(t=new Request(t));try{i=await n.fetchWrapper.fetch({request:t,event:e,fetchOptions:this.i,plugins:this.s})}catch(e){s=e}if(!i)throw new r.WorkboxError("no-response",{url:t.url,error:s});return i}}class u{constructor(e={}){if(this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],e.plugins){let t=e.plugins.some(e=>!!e.cacheWillUpdate);this.s=t?e.plugins:[a,...e.plugins]}else this.s=[a];this.i=e.fetchOptions,this.h=e.matchOptions}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));const n=this.o({request:t,event:e});let i,h=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(h){if(e)try{e.waitUntil(n)}catch(i){}}else try{h=await n}catch(e){i=e}if(!h)throw new r.WorkboxError("no-response",{url:t.url,error:i});return h}async o({request:e,event:t}){const r=await n.fetchWrapper.fetch({request:e,event:t,fetchOptions:this.i,plugins:this.s}),i=s.cacheWrapper.put({cacheName:this.t,request:e,response:r.clone(),event:t,plugins:this.s});if(t)try{t.waitUntil(i)}catch(e){}return r}}const l={cacheFirst:i,cacheOnly:h,networkFirst:c,networkOnly:o,staleWhileRevalidate:u},q=e=>{const t=l[e];return e=>new t(e)},w=q("cacheFirst"),p=q("cacheOnly"),v=q("networkFirst"),y=q("networkOnly"),m=q("staleWhileRevalidate");return e.CacheFirst=i,e.CacheOnly=h,e.NetworkFirst=c,e.NetworkOnly=o,e.StaleWhileRevalidate=u,e.cacheFirst=w,e.cacheOnly=p,e.networkFirst=v,e.networkOnly=y,e.staleWhileRevalidate=m,e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private); | ||
//# sourceMappingURL=workbox-strategies.prod.js.map |
{ | ||
"name": "workbox-strategies", | ||
"version": "5.0.0-alpha.0", | ||
"version": "5.0.0-alpha.1", | ||
"license": "MIT", | ||
@@ -27,8 +27,10 @@ "author": "Google's Web DevRel Team", | ||
}, | ||
"main": "build/workbox-strategies.prod.js", | ||
"main": "index.js", | ||
"module": "index.mjs", | ||
"types": "index.d.ts", | ||
"dependencies": { | ||
"workbox-core": "^5.0.0-alpha.0" | ||
"workbox-core": "^5.0.0-alpha.1", | ||
"workbox-routing": "^5.0.0-alpha.1" | ||
}, | ||
"gitHead": "7f231c04023669bc42d5a939d1359b0867e2efda" | ||
"gitHead": "20d2110ddace710a46af06addd4977cae08f5942" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 11 instances in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 6 instances in 1 package
281068
45
3583
2
13
1
+ Addedworkbox-routing@5.1.4(transitive)
Updatedworkbox-core@^5.0.0-alpha.1