diff options
Diffstat (limited to 'node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs')
| -rw-r--r-- | node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs | 143 |
1 files changed, 143 insertions, 0 deletions
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; |
