aboutsummaryrefslogtreecommitdiff
path: root/node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs')
-rw-r--r--node_modules/workbox-precaching/models/PrecachedDetailsModel.mjs143
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;