workbox-background-sync.dev.js.map 39.7 KB
{"version":3,"file":"workbox-background-sync.dev.js","sources":["../_version.js","../lib/QueueStore.js","../lib/StorableRequest.js","../Queue.js","../BackgroundSyncPlugin.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n    self['workbox:background-sync:5.1.4'] && _();\n}\ncatch (e) { }\n","/*\n  Copyright 2018 Google LLC\n\n  Use of this source code is governed by an MIT-style\n  license that can be found in the LICENSE file or at\n  https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { DBWrapper } from 'workbox-core/_private/DBWrapper.js';\nimport '../_version.js';\nconst DB_VERSION = 3;\nconst DB_NAME = 'workbox-background-sync';\nconst OBJECT_STORE_NAME = 'requests';\nconst INDEXED_PROP = 'queueName';\n/**\n * A class to manage storing requests from a Queue in IndexedDB,\n * indexed by their queue name for easier access.\n *\n * @private\n */\nexport class QueueStore {\n    /**\n     * Associates this instance with a Queue instance, so entries added can be\n     * identified by their queue name.\n     *\n     * @param {string} queueName\n     * @private\n     */\n    constructor(queueName) {\n        this._queueName = queueName;\n        this._db = new DBWrapper(DB_NAME, DB_VERSION, {\n            onupgradeneeded: this._upgradeDb,\n        });\n    }\n    /**\n     * Append an entry last in the queue.\n     *\n     * @param {Object} entry\n     * @param {Object} entry.requestData\n     * @param {number} [entry.timestamp]\n     * @param {Object} [entry.metadata]\n     * @private\n     */\n    async pushEntry(entry) {\n        if (process.env.NODE_ENV !== 'production') {\n            assert.isType(entry, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'QueueStore',\n                funcName: 'pushEntry',\n                paramName: 'entry',\n            });\n            assert.isType(entry.requestData, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'QueueStore',\n                funcName: 'pushEntry',\n                paramName: 'entry.requestData',\n            });\n        }\n        // Don't specify an ID since one is automatically generated.\n        delete entry.id;\n        entry.queueName = this._queueName;\n        await this._db.add(OBJECT_STORE_NAME, entry);\n    }\n    /**\n     * Prepend an entry first in the queue.\n     *\n     * @param {Object} entry\n     * @param {Object} entry.requestData\n     * @param {number} [entry.timestamp]\n     * @param {Object} [entry.metadata]\n     * @private\n     */\n    async unshiftEntry(entry) {\n        if (process.env.NODE_ENV !== 'production') {\n            assert.isType(entry, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'QueueStore',\n                funcName: 'unshiftEntry',\n                paramName: 'entry',\n            });\n            assert.isType(entry.requestData, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'QueueStore',\n                funcName: 'unshiftEntry',\n                paramName: 'entry.requestData',\n            });\n        }\n        const [firstEntry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n            count: 1,\n        });\n        if (firstEntry) {\n            // Pick an ID one less than the lowest ID in the object store.\n            entry.id = firstEntry.id - 1;\n        }\n        else {\n            // Otherwise let the auto-incrementor assign the ID.\n            delete entry.id;\n        }\n        entry.queueName = this._queueName;\n        await this._db.add(OBJECT_STORE_NAME, entry);\n    }\n    /**\n     * Removes and returns the last entry in the queue matching the `queueName`.\n     *\n     * @return {Promise<Object>}\n     * @private\n     */\n    async popEntry() {\n        return this._removeEntry({ direction: 'prev' });\n    }\n    /**\n     * Removes and returns the first entry in the queue matching the `queueName`.\n     *\n     * @return {Promise<Object>}\n     * @private\n     */\n    async shiftEntry() {\n        return this._removeEntry({ direction: 'next' });\n    }\n    /**\n     * Returns all entries in the store matching the `queueName`.\n     *\n     * @param {Object} options See {@link module:workbox-background-sync.Queue~getAll}\n     * @return {Promise<Array<Object>>}\n     * @private\n     */\n    async getAll() {\n        return await this._db.getAllMatching(OBJECT_STORE_NAME, {\n            index: INDEXED_PROP,\n            query: IDBKeyRange.only(this._queueName),\n        });\n    }\n    /**\n     * Deletes the entry for the given ID.\n     *\n     * WARNING: this method does not ensure the deleted enry belongs to this\n     * queue (i.e. matches the `queueName`). But this limitation is acceptable\n     * as this class is not publicly exposed. An additional check would make\n     * this method slower than it needs to be.\n     *\n     * @private\n     * @param {number} id\n     */\n    async deleteEntry(id) {\n        await this._db.delete(OBJECT_STORE_NAME, id);\n    }\n    /**\n     * Removes and returns the first or last entry in the queue (based on the\n     * `direction` argument) matching the `queueName`.\n     *\n     * @return {Promise<Object>}\n     * @private\n     */\n    async _removeEntry({ direction }) {\n        const [entry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n            direction,\n            index: INDEXED_PROP,\n            query: IDBKeyRange.only(this._queueName),\n            count: 1,\n        });\n        if (entry) {\n            await this.deleteEntry(entry.id);\n            return entry;\n        }\n    }\n    /**\n     * Upgrades the database given an `upgradeneeded` event.\n     *\n     * @param {Event} event\n     * @private\n     */\n    _upgradeDb(event) {\n        const db = event.target.result;\n        if (event.oldVersion > 0 && event.oldVersion < DB_VERSION) {\n            if (db.objectStoreNames.contains(OBJECT_STORE_NAME)) {\n                db.deleteObjectStore(OBJECT_STORE_NAME);\n            }\n        }\n        const objStore = db.createObjectStore(OBJECT_STORE_NAME, {\n            autoIncrement: true,\n            keyPath: 'id',\n        });\n        objStore.createIndex(INDEXED_PROP, INDEXED_PROP, { unique: false });\n    }\n}\n","/*\n  Copyright 2018 Google LLC\n\n  Use of this source code is governed by an MIT-style\n  license that can be found in the LICENSE file or at\n  https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\nconst serializableProperties = [\n    'method',\n    'referrer',\n    'referrerPolicy',\n    'mode',\n    'credentials',\n    'cache',\n    'redirect',\n    'integrity',\n    'keepalive',\n];\n/**\n * A class to make it easier to serialize and de-serialize requests so they\n * can be stored in IndexedDB.\n *\n * @private\n */\nclass StorableRequest {\n    /**\n     * Accepts an object of request data that can be used to construct a\n     * `Request` but can also be stored in IndexedDB.\n     *\n     * @param {Object} requestData An object of request data that includes the\n     *     `url` plus any relevant properties of\n     *     [requestInit]{@link https://fetch.spec.whatwg.org/#requestinit}.\n     * @private\n     */\n    constructor(requestData) {\n        if (process.env.NODE_ENV !== 'production') {\n            assert.isType(requestData, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'StorableRequest',\n                funcName: 'constructor',\n                paramName: 'requestData',\n            });\n            assert.isType(requestData.url, 'string', {\n                moduleName: 'workbox-background-sync',\n                className: 'StorableRequest',\n                funcName: 'constructor',\n                paramName: 'requestData.url',\n            });\n        }\n        // If the request's mode is `navigate`, convert it to `same-origin` since\n        // navigation requests can't be constructed via script.\n        if (requestData['mode'] === 'navigate') {\n            requestData['mode'] = 'same-origin';\n        }\n        this._requestData = requestData;\n    }\n    /**\n     * Converts a Request object to a plain object that can be structured\n     * cloned or JSON-stringified.\n     *\n     * @param {Request} request\n     * @return {Promise<StorableRequest>}\n     *\n     * @private\n     */\n    static async fromRequest(request) {\n        const requestData = {\n            url: request.url,\n            headers: {},\n        };\n        // Set the body if present.\n        if (request.method !== 'GET') {\n            // Use ArrayBuffer to support non-text request bodies.\n            // NOTE: we can't use Blobs becuse Safari doesn't support storing\n            // Blobs in IndexedDB in some cases:\n            // https://github.com/dfahlander/Dexie.js/issues/618#issuecomment-398348457\n            requestData.body = await request.clone().arrayBuffer();\n        }\n        // Convert the headers from an iterable to an object.\n        for (const [key, value] of request.headers.entries()) {\n            requestData.headers[key] = value;\n        }\n        // Add all other serializable request properties\n        for (const prop of serializableProperties) {\n            if (request[prop] !== undefined) {\n                requestData[prop] = request[prop];\n            }\n        }\n        return new StorableRequest(requestData);\n    }\n    /**\n     * Returns a deep clone of the instances `_requestData` object.\n     *\n     * @return {Object}\n     *\n     * @private\n     */\n    toObject() {\n        const requestData = Object.assign({}, this._requestData);\n        requestData.headers = Object.assign({}, this._requestData.headers);\n        if (requestData.body) {\n            requestData.body = requestData.body.slice(0);\n        }\n        return requestData;\n    }\n    /**\n     * Converts this instance to a Request.\n     *\n     * @return {Request}\n     *\n     * @private\n     */\n    toRequest() {\n        return new Request(this._requestData.url, this._requestData);\n    }\n    /**\n     * Creates and returns a deep clone of the instance.\n     *\n     * @return {StorableRequest}\n     *\n     * @private\n     */\n    clone() {\n        return new StorableRequest(this.toObject());\n    }\n}\nexport { StorableRequest };\n","/*\n  Copyright 2018 Google LLC\n\n  Use of this source code is governed by an MIT-style\n  license that can be found in the LICENSE file or at\n  https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { QueueStore } from './lib/QueueStore.js';\nimport { StorableRequest } from './lib/StorableRequest.js';\nimport './_version.js';\nconst TAG_PREFIX = 'workbox-background-sync';\nconst MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes\nconst queueNames = new Set();\n/**\n * Converts a QueueStore entry into the format exposed by Queue. This entails\n * converting the request data into a real request and omitting the `id` and\n * `queueName` properties.\n *\n * @param {Object} queueStoreEntry\n * @return {Object}\n * @private\n */\nconst convertEntry = (queueStoreEntry) => {\n    const queueEntry = {\n        request: new StorableRequest(queueStoreEntry.requestData).toRequest(),\n        timestamp: queueStoreEntry.timestamp,\n    };\n    if (queueStoreEntry.metadata) {\n        queueEntry.metadata = queueStoreEntry.metadata;\n    }\n    return queueEntry;\n};\n/**\n * A class to manage storing failed requests in IndexedDB and retrying them\n * later. All parts of the storing and replaying process are observable via\n * callbacks.\n *\n * @memberof module:workbox-background-sync\n */\nclass Queue {\n    /**\n     * Creates an instance of Queue with the given options\n     *\n     * @param {string} name The unique name for this queue. This name must be\n     *     unique as it's used to register sync events and store requests\n     *     in IndexedDB specific to this instance. An error will be thrown if\n     *     a duplicate name is detected.\n     * @param {Object} [options]\n     * @param {Function} [options.onSync] A function that gets invoked whenever\n     *     the 'sync' event fires. The function is invoked with an object\n     *     containing the `queue` property (referencing this instance), and you\n     *     can use the callback to customize the replay behavior of the queue.\n     *     When not set the `replayRequests()` method is called.\n     *     Note: if the replay fails after a sync event, make sure you throw an\n     *     error, so the browser knows to retry the sync event later.\n     * @param {number} [options.maxRetentionTime=7 days] The amount of time (in\n     *     minutes) a request may be retried. After this amount of time has\n     *     passed, the request will be deleted from the queue.\n     */\n    constructor(name, { onSync, maxRetentionTime } = {}) {\n        this._syncInProgress = false;\n        this._requestsAddedDuringSync = false;\n        // Ensure the store name is not already being used\n        if (queueNames.has(name)) {\n            throw new WorkboxError('duplicate-queue-name', { name });\n        }\n        else {\n            queueNames.add(name);\n        }\n        this._name = name;\n        this._onSync = onSync || this.replayRequests;\n        this._maxRetentionTime = maxRetentionTime || MAX_RETENTION_TIME;\n        this._queueStore = new QueueStore(this._name);\n        this._addSyncListener();\n    }\n    /**\n     * @return {string}\n     */\n    get name() {\n        return this._name;\n    }\n    /**\n     * Stores the passed request in IndexedDB (with its timestamp and any\n     * metadata) at the end of the queue.\n     *\n     * @param {Object} entry\n     * @param {Request} entry.request The request to store in the queue.\n     * @param {Object} [entry.metadata] Any metadata you want associated with the\n     *     stored request. When requests are replayed you'll have access to this\n     *     metadata object in case you need to modify the request beforehand.\n     * @param {number} [entry.timestamp] The timestamp (Epoch time in\n     *     milliseconds) when the request was first added to the queue. This is\n     *     used along with `maxRetentionTime` to remove outdated requests. In\n     *     general you don't need to set this value, as it's automatically set\n     *     for you (defaulting to `Date.now()`), but you can update it if you\n     *     don't want particular requests to expire.\n     */\n    async pushRequest(entry) {\n        if (process.env.NODE_ENV !== 'production') {\n            assert.isType(entry, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'Queue',\n                funcName: 'pushRequest',\n                paramName: 'entry',\n            });\n            assert.isInstance(entry.request, Request, {\n                moduleName: 'workbox-background-sync',\n                className: 'Queue',\n                funcName: 'pushRequest',\n                paramName: 'entry.request',\n            });\n        }\n        await this._addRequest(entry, 'push');\n    }\n    /**\n     * Stores the passed request in IndexedDB (with its timestamp and any\n     * metadata) at the beginning of the queue.\n     *\n     * @param {Object} entry\n     * @param {Request} entry.request The request to store in the queue.\n     * @param {Object} [entry.metadata] Any metadata you want associated with the\n     *     stored request. When requests are replayed you'll have access to this\n     *     metadata object in case you need to modify the request beforehand.\n     * @param {number} [entry.timestamp] The timestamp (Epoch time in\n     *     milliseconds) when the request was first added to the queue. This is\n     *     used along with `maxRetentionTime` to remove outdated requests. In\n     *     general you don't need to set this value, as it's automatically set\n     *     for you (defaulting to `Date.now()`), but you can update it if you\n     *     don't want particular requests to expire.\n     */\n    async unshiftRequest(entry) {\n        if (process.env.NODE_ENV !== 'production') {\n            assert.isType(entry, 'object', {\n                moduleName: 'workbox-background-sync',\n                className: 'Queue',\n                funcName: 'unshiftRequest',\n                paramName: 'entry',\n            });\n            assert.isInstance(entry.request, Request, {\n                moduleName: 'workbox-background-sync',\n                className: 'Queue',\n                funcName: 'unshiftRequest',\n                paramName: 'entry.request',\n            });\n        }\n        await this._addRequest(entry, 'unshift');\n    }\n    /**\n     * Removes and returns the last request in the queue (along with its\n     * timestamp and any metadata). The returned object takes the form:\n     * `{request, timestamp, metadata}`.\n     *\n     * @return {Promise<Object>}\n     */\n    async popRequest() {\n        return this._removeRequest('pop');\n    }\n    /**\n     * Removes and returns the first request in the queue (along with its\n     * timestamp and any metadata). The returned object takes the form:\n     * `{request, timestamp, metadata}`.\n     *\n     * @return {Promise<Object>}\n     */\n    async shiftRequest() {\n        return this._removeRequest('shift');\n    }\n    /**\n     * Returns all the entries that have not expired (per `maxRetentionTime`).\n     * Any expired entries are removed from the queue.\n     *\n     * @return {Promise<Array<Object>>}\n     */\n    async getAll() {\n        const allEntries = await this._queueStore.getAll();\n        const now = Date.now();\n        const unexpiredEntries = [];\n        for (const entry of allEntries) {\n            // Ignore requests older than maxRetentionTime. Call this function\n            // recursively until an unexpired request is found.\n            const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;\n            if (now - entry.timestamp > maxRetentionTimeInMs) {\n                await this._queueStore.deleteEntry(entry.id);\n            }\n            else {\n                unexpiredEntries.push(convertEntry(entry));\n            }\n        }\n        return unexpiredEntries;\n    }\n    /**\n     * Adds the entry to the QueueStore and registers for a sync event.\n     *\n     * @param {Object} entry\n     * @param {Request} entry.request\n     * @param {Object} [entry.metadata]\n     * @param {number} [entry.timestamp=Date.now()]\n     * @param {string} operation ('push' or 'unshift')\n     * @private\n     */\n    async _addRequest({ request, metadata, timestamp = Date.now(), }, operation) {\n        const storableRequest = await StorableRequest.fromRequest(request.clone());\n        const entry = {\n            requestData: storableRequest.toObject(),\n            timestamp,\n        };\n        // Only include metadata if it's present.\n        if (metadata) {\n            entry.metadata = metadata;\n        }\n        await this._queueStore[`${operation}Entry`](entry);\n        if (process.env.NODE_ENV !== 'production') {\n            logger.log(`Request for '${getFriendlyURL(request.url)}' has ` +\n                `been added to background sync queue '${this._name}'.`);\n        }\n        // Don't register for a sync if we're in the middle of a sync. Instead,\n        // we wait until the sync is complete and call register if\n        // `this._requestsAddedDuringSync` is true.\n        if (this._syncInProgress) {\n            this._requestsAddedDuringSync = true;\n        }\n        else {\n            await this.registerSync();\n        }\n    }\n    /**\n     * Removes and returns the first or last (depending on `operation`) entry\n     * from the QueueStore that's not older than the `maxRetentionTime`.\n     *\n     * @param {string} operation ('pop' or 'shift')\n     * @return {Object|undefined}\n     * @private\n     */\n    async _removeRequest(operation) {\n        const now = Date.now();\n        const entry = await this._queueStore[`${operation}Entry`]();\n        if (entry) {\n            // Ignore requests older than maxRetentionTime. Call this function\n            // recursively until an unexpired request is found.\n            const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;\n            if (now - entry.timestamp > maxRetentionTimeInMs) {\n                return this._removeRequest(operation);\n            }\n            return convertEntry(entry);\n        }\n        else {\n            return undefined;\n        }\n    }\n    /**\n     * Loops through each request in the queue and attempts to re-fetch it.\n     * If any request fails to re-fetch, it's put back in the same position in\n     * the queue (which registers a retry for the next sync event).\n     */\n    async replayRequests() {\n        let entry;\n        while (entry = await this.shiftRequest()) {\n            try {\n                await fetch(entry.request.clone());\n                if (process.env.NODE_ENV !== 'production') {\n                    logger.log(`Request for '${getFriendlyURL(entry.request.url)}'` +\n                        `has been replayed in queue '${this._name}'`);\n                }\n            }\n            catch (error) {\n                await this.unshiftRequest(entry);\n                if (process.env.NODE_ENV !== 'production') {\n                    logger.log(`Request for '${getFriendlyURL(entry.request.url)}'` +\n                        `failed to replay, putting it back in queue '${this._name}'`);\n                }\n                throw new WorkboxError('queue-replay-failed', { name: this._name });\n            }\n        }\n        if (process.env.NODE_ENV !== 'production') {\n            logger.log(`All requests in queue '${this.name}' have successfully ` +\n                `replayed; the queue is now empty!`);\n        }\n    }\n    /**\n     * Registers a sync event with a tag unique to this instance.\n     */\n    async registerSync() {\n        if ('sync' in self.registration) {\n            try {\n                await self.registration.sync.register(`${TAG_PREFIX}:${this._name}`);\n            }\n            catch (err) {\n                // This means the registration failed for some reason, possibly due to\n                // the user disabling it.\n                if (process.env.NODE_ENV !== 'production') {\n                    logger.warn(`Unable to register sync event for '${this._name}'.`, err);\n                }\n            }\n        }\n    }\n    /**\n     * In sync-supporting browsers, this adds a listener for the sync event.\n     * In non-sync-supporting browsers, this will retry the queue on service\n     * worker startup.\n     *\n     * @private\n     */\n    _addSyncListener() {\n        if ('sync' in self.registration) {\n            self.addEventListener('sync', (event) => {\n                if (event.tag === `${TAG_PREFIX}:${this._name}`) {\n                    if (process.env.NODE_ENV !== 'production') {\n                        logger.log(`Background sync for tag '${event.tag}'` +\n                            `has been received`);\n                    }\n                    const syncComplete = async () => {\n                        this._syncInProgress = true;\n                        let syncError;\n                        try {\n                            await this._onSync({ queue: this });\n                        }\n                        catch (error) {\n                            syncError = error;\n                            // Rethrow the error. Note: the logic in the finally clause\n                            // will run before this gets rethrown.\n                            throw syncError;\n                        }\n                        finally {\n                            // New items may have been added to the queue during the sync,\n                            // so we need to register for a new sync if that's happened...\n                            // Unless there was an error during the sync, in which\n                            // case the browser will automatically retry later, as long\n                            // as `event.lastChance` is not true.\n                            if (this._requestsAddedDuringSync &&\n                                !(syncError && !event.lastChance)) {\n                                await this.registerSync();\n                            }\n                            this._syncInProgress = false;\n                            this._requestsAddedDuringSync = false;\n                        }\n                    };\n                    event.waitUntil(syncComplete());\n                }\n            });\n        }\n        else {\n            if (process.env.NODE_ENV !== 'production') {\n                logger.log(`Background sync replaying without background sync event`);\n            }\n            // If the browser doesn't support background sync, retry\n            // every time the service worker starts up as a fallback.\n            this._onSync({ queue: this });\n        }\n    }\n    /**\n     * Returns the set of queue names. This is primarily used to reset the list\n     * of queue names in tests.\n     *\n     * @return {Set}\n     *\n     * @private\n     */\n    static get _queueNames() {\n        return queueNames;\n    }\n}\nexport { Queue };\n","/*\n  Copyright 2018 Google LLC\n\n  Use of this source code is governed by an MIT-style\n  license that can be found in the LICENSE file or at\n  https://opensource.org/licenses/MIT.\n*/\nimport { Queue } from './Queue.js';\nimport './_version.js';\n/**\n * A class implementing the `fetchDidFail` lifecycle callback. This makes it\n * easier to add failed requests to a background sync Queue.\n *\n * @memberof module:workbox-background-sync\n */\nclass BackgroundSyncPlugin {\n    /**\n     * @param {string} name See the [Queue]{@link module:workbox-background-sync.Queue}\n     *     documentation for parameter details.\n     * @param {Object} [options] See the\n     *     [Queue]{@link module:workbox-background-sync.Queue} documentation for\n     *     parameter details.\n     */\n    constructor(name, options) {\n        /**\n         * @param {Object} options\n         * @param {Request} options.request\n         * @private\n         */\n        this.fetchDidFail = async ({ request }) => {\n            await this._queue.pushRequest({ request });\n        };\n        this._queue = new Queue(name, options);\n    }\n}\nexport { BackgroundSyncPlugin };\n"],"names":["self","_","e","DB_VERSION","DB_NAME","OBJECT_STORE_NAME","INDEXED_PROP","QueueStore","constructor","queueName","_queueName","_db","DBWrapper","onupgradeneeded","_upgradeDb","pushEntry","entry","assert","isType","moduleName","className","funcName","paramName","requestData","id","add","unshiftEntry","firstEntry","getAllMatching","count","popEntry","_removeEntry","direction","shiftEntry","getAll","index","query","IDBKeyRange","only","deleteEntry","delete","event","db","target","result","oldVersion","objectStoreNames","contains","deleteObjectStore","objStore","createObjectStore","autoIncrement","keyPath","createIndex","unique","serializableProperties","StorableRequest","url","_requestData","fromRequest","request","headers","method","body","clone","arrayBuffer","key","value","entries","prop","undefined","toObject","Object","assign","slice","toRequest","Request","TAG_PREFIX","MAX_RETENTION_TIME","queueNames","Set","convertEntry","queueStoreEntry","queueEntry","timestamp","metadata","Queue","name","onSync","maxRetentionTime","_syncInProgress","_requestsAddedDuringSync","has","WorkboxError","_name","_onSync","replayRequests","_maxRetentionTime","_queueStore","_addSyncListener","pushRequest","isInstance","_addRequest","unshiftRequest","popRequest","_removeRequest","shiftRequest","allEntries","now","Date","unexpiredEntries","maxRetentionTimeInMs","push","operation","storableRequest","logger","log","getFriendlyURL","registerSync","fetch","process","error","registration","sync","register","err","warn","addEventListener","tag","syncComplete","syncError","queue","lastChance","waitUntil","_queueNames","BackgroundSyncPlugin","options","fetchDidFail","_queue"],"mappings":"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"}