{"version":3,"file":"workbox-background-sync.dev.js","sources":["../_version.mjs","../lib/QueueStore.mjs","../lib/StorableRequest.mjs","../Queue.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:background-sync:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\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*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs';\nimport '../_version.mjs';\n\n\nconst DB_VERSION = 3;\nconst DB_NAME = 'workbox-background-sync';\nconst OBJECT_STORE_NAME = 'requests';\nconst INDEXED_PROP = 'queueName';\n\n/**\n * A class to manage storing requests from a Queue in IndexedbDB,\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  /**\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\n    // Don't specify an ID since one is automatically generated.\n    delete entry.id;\n    entry.queueName = this._queueName;\n\n    await this._db.add(OBJECT_STORE_NAME, entry);\n  }\n\n  /**\n   * Preppend 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\n    const [firstEntry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n      count: 1,\n    });\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    } else {\n      // Otherwise let the auto-incrementor assign the ID.\n      delete entry.id;\n    }\n    entry.queueName = this._queueName;\n\n    await this._db.add(OBJECT_STORE_NAME, entry);\n  }\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  /**\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  /**\n   * Returns all entries in the store matching the `queueName`.\n   *\n   * @param {Object} options See workbox.backgroundSync.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  /**\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  /**\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\n    if (entry) {\n      await this.deleteEntry(entry.id);\n      return entry;\n    }\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\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\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*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport '../_version.mjs';\n\n\nconst serializableProperties = [\n  'method',\n  'referrer',\n  'referrerPolicy',\n  'mode',\n  'credentials',\n  'cache',\n  'redirect',\n  'integrity',\n  'keepalive',\n];\n\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   * 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\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\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\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\n    return new StorableRequest(requestData);\n  }\n\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\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\n    this._requestData = requestData;\n  }\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\n    return requestData;\n  }\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  /**\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}\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*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {QueueStore} from './lib/QueueStore.mjs';\nimport {StorableRequest} from './lib/StorableRequest.mjs';\nimport './_version.mjs';\n\n\nconst TAG_PREFIX = 'workbox-background-sync';\nconst MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes\n\nconst queueNames = new Set();\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 workbox.backgroundSync\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    // Ensure the store name is not already being used\n    if (queueNames.has(name)) {\n      throw new WorkboxError('duplicate-queue-name', {name});\n    } else {\n      queueNames.add(name);\n    }\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\n    this._addSyncListener();\n  }\n\n  /**\n   * @return {string}\n   */\n  get name() {\n    return this._name;\n  }\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\n    await this._addRequest(entry, 'push');\n  }\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\n    await this._addRequest(entry, 'unshift');\n  }\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  /**\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  /**\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\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      } else {\n        unexpiredEntries.push(convertEntry(entry));\n      }\n    }\n\n    return unexpiredEntries;\n  }\n\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(\n      {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\n    // Only include metadata if it's present.\n    if (metadata) {\n      entry.metadata = metadata;\n    }\n\n    await this._queueStore[`${operation}Entry`](entry);\n\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\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    } else {\n      await this.registerSync();\n    }\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\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\n      return convertEntry(entry);\n    }\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\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      } catch (error) {\n        await this.unshiftRequest(entry);\n\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  /**\n   * Registers a sync event with a tag unique to this instance.\n   */\n  async registerSync() {\n    if ('sync' in registration) {\n      try {\n        await registration.sync.register(`${TAG_PREFIX}:${this._name}`);\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(\n              `Unable to register sync event for '${this._name}'.`, err);\n        }\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 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\n          const syncComplete = async () => {\n            this._syncInProgress = true;\n\n            let syncError;\n            try {\n              await this._onSync({queue: this});\n            } catch (error) {\n              syncError = error;\n\n              // Rethrow the error. Note: the logic in the finally clause\n              // will run before this gets rethrown.\n              throw syncError;\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\n              this._syncInProgress = false;\n              this._requestsAddedDuringSync = false;\n            }\n          };\n          event.waitUntil(syncComplete());\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  /**\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}\n\n\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\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*/\n\nimport {Queue} from './Queue.mjs';\nimport './_version.mjs';\n\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 workbox.backgroundSync\n */\nclass Plugin {\n  /**\n   * @param {...*} queueArgs Args to forward to the composed Queue instance.\n   *    See the [Queue]{@link workbox.backgroundSync.Queue} documentation for\n   *    parameter details.\n   */\n  constructor(...queueArgs) {\n    this._queue = new Queue(...queueArgs);\n    this.fetchDidFail = this.fetchDidFail.bind(this);\n  }\n\n  /**\n   * @param {Object} options\n   * @param {Request} options.request\n   * @private\n   */\n  async fetchDidFail({request}) {\n    await this._queue.pushRequest({request});\n  }\n}\n\nexport {Plugin};\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*/\n\nimport {Queue} from './Queue.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.backgroundSync\n */\n\nexport {\n  Queue,\n  Plugin,\n};\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","fromRequest","request","url","headers","method","body","clone","arrayBuffer","key","value","entries","prop","undefined","mode","_requestData","toObject","Object","assign","slice","toRequest","Request","TAG_PREFIX","MAX_RETENTION_TIME","queueNames","Set","Queue","name","onSync","maxRetentionTime","has","WorkboxError","_name","_onSync","replayRequests","_maxRetentionTime","_queueStore","_addSyncListener","pushRequest","isInstance","_addRequest","unshiftRequest","popRequest","_removeRequest","shiftRequest","allEntries","now","Date","unexpiredEntries","maxRetentionTimeInMs","timestamp","push","convertEntry","metadata","operation","storableRequest","logger","log","getFriendlyURL","_syncInProgress","_requestsAddedDuringSync","registerSync","fetch","error","registration","sync","register","err","warn","addEventListener","tag","syncComplete","syncError","queue","lastChance","waitUntil","_queueNames","queueStoreEntry","queueEntry","Plugin","queueArgs","_queue","fetchDidFail","bind"],"mappings":"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"}