diff options
Diffstat (limited to 'node_modules/workbox-precaching/models')
| -rw-r--r-- | node_modules/workbox-precaching/models/PrecacheEntry.mjs | 78 | ||||
| -rw-r--r-- | node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs | 143 |
2 files changed, 221 insertions, 0 deletions
diff --git a/node_modules/workbox-precaching/models/PrecacheEntry.mjs b/node_modules/workbox-precaching/models/PrecacheEntry.mjs new file mode 100644 index 00000000..8138edfa --- /dev/null +++ b/node_modules/workbox-precaching/models/PrecacheEntry.mjs @@ -0,0 +1,78 @@ +/* + Copyright 2017 Google Inc. + + 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 + + https://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. +*/ + +import '../_version.mjs'; + +/** + * Used as a consistent way of referencing a URL to precache. + * + * @private + * @memberof module:workbox-precaching + */ +export default class PrecacheEntry { +/** + * This class ensures all cache list entries are consistent and + * adds cache busting if required. + * + * @param {*} originalInput + * @param {string} url + * @param {string} revision + * @param {boolean} shouldCacheBust + */ + constructor(originalInput, url, revision, shouldCacheBust) { + this._originalInput = originalInput; + this._entryId = url; + this._revision = revision; + const requestAsCacheKey = new Request(url, {credentials: 'same-origin'}); + this._cacheRequest = requestAsCacheKey; + this._networkRequest = shouldCacheBust ? + this._cacheBustRequest(requestAsCacheKey) : requestAsCacheKey; + } + + /** + * This method will either use Request.cache option OR append a cache + * busting parameter to the URL. + * + * @param {Request} request The request to cache bust + * @return {Request} A cachebusted Request + * + * @private + */ + _cacheBustRequest(request) { + let url = request.url; + const requestOptions = { + credentials: 'same-origin', + }; + if ('cache' in Request.prototype) { + // Make use of the Request cache mode where we can. + // Reload skips the HTTP cache for outgoing requests and updates + // the cache with the returned response. + requestOptions.cache = 'reload'; + } else { + const parsedURL = new URL(url, location); + + // This is done so the minifier can mangle 'global.encodeURIComponent' + const _encodeURIComponent = encodeURIComponent; + + parsedURL.search += (parsedURL.search ? '&' : '') + + _encodeURIComponent(`_workbox-cache-bust`) + '=' + + _encodeURIComponent(this._revision); + url = parsedURL.toString(); + } + + return new Request(url, requestOptions); + } +} diff --git a/node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs b/node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs new file mode 100644 index 00000000..55f1420d --- /dev/null +++ b/node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs @@ -0,0 +1,143 @@ +/* + Copyright 2017 Google Inc. + + 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 + + https://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. +*/ + +import {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs'; +import '../_version.mjs'; + +// Allows minifier to mangle this name +const REVISON_IDB_FIELD = 'revision'; +const URL_IDB_FIELD = 'url'; +const DB_STORE_NAME = 'precached-details-models'; +/** + * This model will track the relevant information of entries that + * are cached and their matching revision details. + * + * @private + */ +class PrecachedDetailsModel { + /** + * Construct a new model for a specific cache. + * + * @param {string} dbName + * @private + */ + constructor(dbName) { + // This ensures the db name contains only letters, numbers, '-', '_' and '$' + const filteredDBName = dbName.replace(/[^\w-]/g, '_'); + this._db = new DBWrapper(filteredDBName, 2, { + onupgradeneeded: this._handleUpgrade, + }); + } + + /** + * Should perform an upgrade of indexedDB. + * + * @param {Event} evt + * + * @private + */ + _handleUpgrade(evt) { + const db = evt.target.result; + if (evt.oldVersion < 2) { + // IndexedDB version 1 used both 'workbox-precaching' and + // 'precached-details-model' before upgrading to version 2. + // Delete them and create a new store with latest schema. + if (db.objectStoreNames.contains('workbox-precaching')) { + db.deleteObjectStore('workbox-precaching'); + } + if (db.objectStoreNames.contains(DB_STORE_NAME)) { + db.deleteObjectStore(DB_STORE_NAME); + } + } + db.createObjectStore(DB_STORE_NAME); + } + + /** + * Check if an entry is already cached. Returns false if + * the entry isn't cached or the revision has changed. + * + * @param {string} cacheName + * @param {PrecacheEntry} precacheEntry + * @return {boolean} + * + * @private + */ + async _isEntryCached(cacheName, precacheEntry) { + const revisionDetails = await this._getRevision(precacheEntry._entryId); + if (revisionDetails !== precacheEntry._revision) { + return false; + } + + const openCache = await caches.open(cacheName); + const cachedResponse = await openCache.match(precacheEntry._cacheRequest); + return !!cachedResponse; + } + + /** + * @return {Promise<Array>} + * + * @private + */ + async _getAllEntries() { + return await this._db.getAllMatching(DB_STORE_NAME, { + includeKeys: true, + }); + } + + /** + * Get the current revision details. + * + * @param {Object} entryId + * @return {Promise<string|null>} + * + * @private + */ + async _getRevision(entryId) { + const data = await this._db.get(DB_STORE_NAME, entryId); + return data ? data[REVISON_IDB_FIELD] : null; + } + + /** + * Add an entry to the details model. + * + * @param {PrecacheEntry} precacheEntry + * + * @private + */ + async _addEntry(precacheEntry) { + await this._db.put( + DB_STORE_NAME, + { + [REVISON_IDB_FIELD]: precacheEntry._revision, + [URL_IDB_FIELD]: precacheEntry._cacheRequest.url, + }, + precacheEntry._entryId + ); + } + + /** + * Delete entry from details model. + * + * @param {string} entryId + * + * @private + */ + async _deleteEntry(entryId) { + await this._db.delete(DB_STORE_NAME, entryId); + } +} + +export default PrecachedDetailsModel; |
