jekyll-pwa-workbox 0.0.6 → 0.0.7.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jekyll-pwa-workbox.rb +1 -1
  3. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-background-sync.dev.js +819 -0
  4. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-background-sync.dev.js.map +1 -0
  5. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-background-sync.prod.js +2 -0
  6. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-background-sync.prod.js.map +1 -0
  7. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-broadcast-update.dev.js +486 -0
  8. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-broadcast-update.dev.js.map +1 -0
  9. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-broadcast-update.prod.js +2 -0
  10. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-broadcast-update.prod.js.map +1 -0
  11. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-cacheable-response.dev.js +192 -0
  12. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-cacheable-response.dev.js.map +1 -0
  13. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-cacheable-response.prod.js +2 -0
  14. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-cacheable-response.prod.js.map +1 -0
  15. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-core.dev.js +1643 -0
  16. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-core.dev.js.map +1 -0
  17. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-core.prod.js +2 -0
  18. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-core.prod.js.map +1 -0
  19. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-expiration.dev.js +652 -0
  20. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-expiration.dev.js.map +1 -0
  21. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-expiration.prod.js +2 -0
  22. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-expiration.prod.js.map +1 -0
  23. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-navigation-preload.dev.js +103 -0
  24. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-navigation-preload.dev.js.map +1 -0
  25. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-navigation-preload.prod.js +2 -0
  26. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-navigation-preload.prod.js.map +1 -0
  27. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-offline-ga.dev.js +236 -0
  28. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-offline-ga.dev.js.map +1 -0
  29. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-offline-ga.prod.js +2 -0
  30. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-offline-ga.prod.js.map +1 -0
  31. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-precaching.dev.js +994 -0
  32. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-precaching.dev.js.map +1 -0
  33. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-precaching.prod.js +2 -0
  34. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-precaching.prod.js.map +1 -0
  35. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-range-requests.dev.js +263 -0
  36. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-range-requests.dev.js.map +1 -0
  37. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-range-requests.prod.js +2 -0
  38. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-range-requests.prod.js.map +1 -0
  39. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-routing.dev.js +1026 -0
  40. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-routing.dev.js.map +1 -0
  41. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-routing.prod.js +2 -0
  42. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-routing.prod.js.map +1 -0
  43. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-strategies.dev.js +1127 -0
  44. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-strategies.dev.js.map +1 -0
  45. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-strategies.prod.js +2 -0
  46. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-strategies.prod.js.map +1 -0
  47. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-streams.dev.js +333 -0
  48. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-streams.dev.js.map +1 -0
  49. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-streams.prod.js +2 -0
  50. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-streams.prod.js.map +1 -0
  51. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-sw.js +2 -0
  52. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-sw.js.map +1 -0
  53. data/lib/vendor/{workbox-v4.3.1 → workbox-v5.0.0.alpha1}/workbox-window.dev.es5.mjs +248 -262
  54. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.dev.es5.mjs.map +1 -0
  55. data/lib/vendor/{workbox-v4.3.1 → workbox-v5.0.0.alpha1}/workbox-window.dev.mjs +234 -242
  56. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.dev.mjs.map +1 -0
  57. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.dev.umd.js +882 -0
  58. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.dev.umd.js.map +1 -0
  59. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.prod.es5.mjs +2 -0
  60. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.prod.es5.mjs.map +1 -0
  61. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.prod.mjs +2 -0
  62. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.prod.mjs.map +1 -0
  63. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.prod.umd.js +2 -0
  64. data/lib/vendor/workbox-v5.0.0.alpha1/workbox-window.prod.umd.js.map +1 -0
  65. metadata +75 -80
  66. data/lib/vendor/workbox-v4.3.1/workbox-background-sync.dev.js +0 -822
  67. data/lib/vendor/workbox-v4.3.1/workbox-background-sync.dev.js.map +0 -1
  68. data/lib/vendor/workbox-v4.3.1/workbox-background-sync.prod.js +0 -2
  69. data/lib/vendor/workbox-v4.3.1/workbox-background-sync.prod.js.map +0 -1
  70. data/lib/vendor/workbox-v4.3.1/workbox-broadcast-update.dev.js +0 -496
  71. data/lib/vendor/workbox-v4.3.1/workbox-broadcast-update.dev.js.map +0 -1
  72. data/lib/vendor/workbox-v4.3.1/workbox-broadcast-update.prod.js +0 -2
  73. data/lib/vendor/workbox-v4.3.1/workbox-broadcast-update.prod.js.map +0 -1
  74. data/lib/vendor/workbox-v4.3.1/workbox-cacheable-response.dev.js +0 -200
  75. data/lib/vendor/workbox-v4.3.1/workbox-cacheable-response.dev.js.map +0 -1
  76. data/lib/vendor/workbox-v4.3.1/workbox-cacheable-response.prod.js +0 -2
  77. data/lib/vendor/workbox-v4.3.1/workbox-cacheable-response.prod.js.map +0 -1
  78. data/lib/vendor/workbox-v4.3.1/workbox-core.dev.js +0 -1712
  79. data/lib/vendor/workbox-v4.3.1/workbox-core.dev.js.map +0 -1
  80. data/lib/vendor/workbox-v4.3.1/workbox-core.prod.js +0 -2
  81. data/lib/vendor/workbox-v4.3.1/workbox-core.prod.js.map +0 -1
  82. data/lib/vendor/workbox-v4.3.1/workbox-expiration.dev.js +0 -652
  83. data/lib/vendor/workbox-v4.3.1/workbox-expiration.dev.js.map +0 -1
  84. data/lib/vendor/workbox-v4.3.1/workbox-expiration.prod.js +0 -2
  85. data/lib/vendor/workbox-v4.3.1/workbox-expiration.prod.js.map +0 -1
  86. data/lib/vendor/workbox-v4.3.1/workbox-navigation-preload.dev.js +0 -110
  87. data/lib/vendor/workbox-v4.3.1/workbox-navigation-preload.dev.js.map +0 -1
  88. data/lib/vendor/workbox-v4.3.1/workbox-navigation-preload.prod.js +0 -2
  89. data/lib/vendor/workbox-v4.3.1/workbox-navigation-preload.prod.js.map +0 -1
  90. data/lib/vendor/workbox-v4.3.1/workbox-offline-ga.dev.js +0 -243
  91. data/lib/vendor/workbox-v4.3.1/workbox-offline-ga.dev.js.map +0 -1
  92. data/lib/vendor/workbox-v4.3.1/workbox-offline-ga.prod.js +0 -2
  93. data/lib/vendor/workbox-v4.3.1/workbox-offline-ga.prod.js.map +0 -1
  94. data/lib/vendor/workbox-v4.3.1/workbox-precaching.dev.js +0 -989
  95. data/lib/vendor/workbox-v4.3.1/workbox-precaching.dev.js.map +0 -1
  96. data/lib/vendor/workbox-v4.3.1/workbox-precaching.prod.js +0 -2
  97. data/lib/vendor/workbox-v4.3.1/workbox-precaching.prod.js.map +0 -1
  98. data/lib/vendor/workbox-v4.3.1/workbox-range-requests.dev.js +0 -268
  99. data/lib/vendor/workbox-v4.3.1/workbox-range-requests.dev.js.map +0 -1
  100. data/lib/vendor/workbox-v4.3.1/workbox-range-requests.prod.js +0 -2
  101. data/lib/vendor/workbox-v4.3.1/workbox-range-requests.prod.js.map +0 -1
  102. data/lib/vendor/workbox-v4.3.1/workbox-routing.dev.js +0 -1020
  103. data/lib/vendor/workbox-v4.3.1/workbox-routing.dev.js.map +0 -1
  104. data/lib/vendor/workbox-v4.3.1/workbox-routing.prod.js +0 -2
  105. data/lib/vendor/workbox-v4.3.1/workbox-routing.prod.js.map +0 -1
  106. data/lib/vendor/workbox-v4.3.1/workbox-strategies.dev.js +0 -1138
  107. data/lib/vendor/workbox-v4.3.1/workbox-strategies.dev.js.map +0 -1
  108. data/lib/vendor/workbox-v4.3.1/workbox-strategies.prod.js +0 -2
  109. data/lib/vendor/workbox-v4.3.1/workbox-strategies.prod.js.map +0 -1
  110. data/lib/vendor/workbox-v4.3.1/workbox-streams.dev.js +0 -337
  111. data/lib/vendor/workbox-v4.3.1/workbox-streams.dev.js.map +0 -1
  112. data/lib/vendor/workbox-v4.3.1/workbox-streams.prod.js +0 -2
  113. data/lib/vendor/workbox-v4.3.1/workbox-streams.prod.js.map +0 -1
  114. data/lib/vendor/workbox-v4.3.1/workbox-sw.js +0 -2
  115. data/lib/vendor/workbox-v4.3.1/workbox-sw.js.map +0 -1
  116. data/lib/vendor/workbox-v4.3.1/workbox-window.dev.es5.mjs.map +0 -1
  117. data/lib/vendor/workbox-v4.3.1/workbox-window.dev.mjs.map +0 -1
  118. data/lib/vendor/workbox-v4.3.1/workbox-window.dev.umd.js +0 -896
  119. data/lib/vendor/workbox-v4.3.1/workbox-window.dev.umd.js.map +0 -1
  120. data/lib/vendor/workbox-v4.3.1/workbox-window.prod.es5.mjs +0 -2
  121. data/lib/vendor/workbox-v4.3.1/workbox-window.prod.es5.mjs.map +0 -1
  122. data/lib/vendor/workbox-v4.3.1/workbox-window.prod.mjs +0 -2
  123. data/lib/vendor/workbox-v4.3.1/workbox-window.prod.mjs.map +0 -1
  124. data/lib/vendor/workbox-v4.3.1/workbox-window.prod.umd.js +0 -2
  125. data/lib/vendor/workbox-v4.3.1/workbox-window.prod.umd.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbox-background-sync.dev.js","sources":["../_version.js","../lib/QueueStore.js","../lib/StorableRequest.js","../Queue.js","../Plugin.js"],"sourcesContent":["// @ts-ignore\ntry {\n self['workbox:background-sync:5.0.0-alpha.0'] && _();\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 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 * 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 * 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 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 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 * 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 * 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 * 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 * 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 * 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 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}\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};\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 workbox.backgroundSync\n */\nclass Plugin {\n /**\n * @param {string} name See the [Queue]{@link workbox.backgroundSync.Queue}\n * documentation for parameter details.\n * @param {Object} [options] See the\n * [Queue]{@link workbox.backgroundSync.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 { Plugin };\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","_syncInProgress","_requestsAddedDuringSync","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","registerSync","fetch","process","error","registration","sync","register","err","warn","addEventListener","tag","syncComplete","syncError","queue","lastChance","waitUntil","_queueNames","queueStoreEntry","queueEntry","Plugin","options","fetchDidFail","_queue"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ this.workbox=this.workbox||{},this.workbox.backgroundSync=function(t,e,s,i,n){"use strict";try{self["workbox:background-sync:5.0.0-alpha.0"]&&_()}catch(t){}const a=3,r="workbox-background-sync",c="requests",h="queueName";class o{constructor(t){this.t=t,this.s=new n.DBWrapper(r,a,{onupgradeneeded:this.i})}async pushEntry(t){delete t.id,t.queueName=this.t,await this.s.add(c,t)}async unshiftEntry(t){const[e]=await this.s.getAllMatching(c,{count:1});e?t.id=e.id-1:delete t.id,t.queueName=this.t,await this.s.add(c,t)}async popEntry(){return this.h({direction:"prev"})}async shiftEntry(){return this.h({direction:"next"})}async getAll(){return await this.s.getAllMatching(c,{index:h,query:IDBKeyRange.only(this.t)})}async deleteEntry(t){await this.s.delete(c,t)}async h({direction:t}){const[e]=await this.s.getAllMatching(c,{direction:t,index:h,query:IDBKeyRange.only(this.t),count:1});if(e)return await this.deleteEntry(e.id),e}i(t){const e=t.target.result;t.oldVersion>0&&t.oldVersion<a&&e.objectStoreNames.contains(c)&&e.deleteObjectStore(c),e.createObjectStore(c,{autoIncrement:!0,keyPath:"id"}).createIndex(h,h,{unique:!1})}}const u=["method","referrer","referrerPolicy","mode","credentials","cache","redirect","integrity","keepalive"];class y{static async fromRequest(t){const e={url:t.url,headers:{}};"GET"!==t.method&&(e.body=await t.clone().arrayBuffer());for(const[s,i]of t.headers.entries())e.headers[s]=i;for(const s of u)void 0!==t[s]&&(e[s]=t[s]);return new y(e)}constructor(t){"navigate"===t.mode&&(t.mode="same-origin"),this.o=t}toObject(){const t=Object.assign({},this.o);return t.headers=Object.assign({},this.o.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this.o.url,this.o)}clone(){return new y(this.toObject())}}const w="workbox-background-sync",f=10080,d=new Set;class l{constructor(t,{onSync:s,maxRetentionTime:i}={}){if(this.u=!1,this.l=!1,d.has(t))throw new e.WorkboxError("duplicate-queue-name",{name:t});d.add(t),this.q=t,this.m=s||this.replayRequests,this.p=i||f,this.g=new o(this.q),this.R()}get name(){return this.q}async pushRequest(t){await this.k(t,"push")}async unshiftRequest(t){await this.k(t,"unshift")}async popRequest(){return this.D("pop")}async shiftRequest(){return this.D("shift")}async getAll(){const t=await this.g.getAll(),e=Date.now(),s=[];for(const i of t){const t=60*this.p*1e3;e-i.timestamp>t?await this.g.deleteEntry(i.id):s.push(q(i))}return s}async k({request:t,metadata:e,timestamp:s=Date.now()},i){const n={requestData:(await y.fromRequest(t.clone())).toObject(),timestamp:s};e&&(n.metadata=e),await this.g[`${i}Entry`](n),this.u?this.l=!0:await this.registerSync()}async D(t){const e=Date.now(),s=await this.g[`${t}Entry`]();if(s){const i=60*this.p*1e3;return e-s.timestamp>i?this.D(t):q(s)}}async replayRequests(){let t;for(;t=await this.shiftRequest();)try{await fetch(t.request.clone())}catch(s){throw await this.unshiftRequest(t),new e.WorkboxError("queue-replay-failed",{name:this.q})}}async registerSync(){if("sync"in self.registration)try{await self.registration.sync.register(`${w}:${this.q}`)}catch(t){}}R(){"sync"in self.registration?self.addEventListener("sync",t=>{if(t.tag===`${w}:${this.q}`){const e=async()=>{let e;this.u=!0;try{await this.m({queue:this})}catch(t){throw e=t}finally{!this.l||e&&!t.lastChance||await this.registerSync(),this.u=!1,this.l=!1}};t.waitUntil(e())}}):this.m({queue:this})}static get _(){return d}}const q=t=>{const e={request:new y(t.requestData).toRequest(),timestamp:t.timestamp};return t.metadata&&(e.metadata=t.metadata),e};return t.Plugin=class{constructor(t,e){this.fetchDidFail=(async({request:t})=>{await this.v.pushRequest({request:t})}),this.v=new l(t,e)}},t.Queue=l,t}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private);
2
+ //# sourceMappingURL=workbox-background-sync.prod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbox-background-sync.prod.js","sources":["../_version.js","../lib/QueueStore.js","../lib/StorableRequest.js","../Queue.js","../Plugin.js"],"sourcesContent":["// @ts-ignore\ntry {\n self['workbox:background-sync:5.0.0-alpha.0'] && _();\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 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 * 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 * 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 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 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 * 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 * 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 * 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 * 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 * 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 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}\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};\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 workbox.backgroundSync\n */\nclass Plugin {\n /**\n * @param {string} name See the [Queue]{@link workbox.backgroundSync.Queue}\n * documentation for parameter details.\n * @param {Object} [options] See the\n * [Queue]{@link workbox.backgroundSync.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 { Plugin };\n"],"names":["self","_","e","DB_VERSION","DB_NAME","OBJECT_STORE_NAME","INDEXED_PROP","QueueStore","constructor","queueName","_queueName","_db","DBWrapper","onupgradeneeded","this","_upgradeDb","entry","id","add","firstEntry","getAllMatching","count","_removeEntry","direction","index","query","IDBKeyRange","only","delete","deleteEntry","event","db","target","result","oldVersion","objectStoreNames","contains","deleteObjectStore","createObjectStore","autoIncrement","keyPath","createIndex","unique","serializableProperties","StorableRequest","request","requestData","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","_syncInProgress","_requestsAddedDuringSync","has","WorkboxError","_name","_onSync","replayRequests","_maxRetentionTime","_queueStore","_addSyncListener","_addRequest","_removeRequest","allEntries","getAll","now","Date","unexpiredEntries","maxRetentionTimeInMs","timestamp","push","convertEntry","metadata","operation","fromRequest","registerSync","shiftRequest","fetch","error","unshiftRequest","registration","sync","register","err","addEventListener","tag","syncComplete","async","syncError","queue","lastChance","waitUntil","queueStoreEntry","queueEntry","options","fetchDidFail","_queue","pushRequest"],"mappings":"2FACA,IACIA,KAAK,0CAA4CC,IAErD,MAAOC,ICMP,MAAMC,EAAa,EACbC,EAAU,0BACVC,EAAoB,WACpBC,EAAe,YAOd,MAAMC,EAQTC,YAAYC,QACHC,EAAaD,OACbE,EAAM,IAAIC,YAAUR,EAASD,EAAY,CAC1CU,gBAAiBC,KAAKC,oBAYdC,UAgBLA,EAAMC,GACbD,EAAMP,UAAYK,KAAKJ,QACjBI,KAAKH,EAAIO,IAAIb,EAAmBW,sBAWvBA,SAeRG,SAAoBL,KAAKH,EAAIS,eAAef,EAAmB,CAClEgB,MAAO,IAEPF,EAEAH,EAAMC,GAAKE,EAAWF,GAAK,SAIpBD,EAAMC,GAEjBD,EAAMP,UAAYK,KAAKJ,QACjBI,KAAKH,EAAIO,IAAIb,EAAmBW,2BAS/BF,KAAKQ,EAAa,CAAEC,UAAW,mCAS/BT,KAAKQ,EAAa,CAAEC,UAAW,qCAUzBT,KAAKH,EAAIS,eAAef,EAAmB,CACpDmB,MAAOlB,EACPmB,MAAOC,YAAYC,KAAKb,KAAKJ,uBAcnBO,SACRH,KAAKH,EAAIiB,OAAOvB,EAAmBY,YAS1BM,UAAEA,UACVP,SAAeF,KAAKH,EAAIS,eAAef,EAAmB,CAC7DkB,UAAAA,EACAC,MAAOlB,EACPmB,MAAOC,YAAYC,KAAKb,KAAKJ,GAC7BW,MAAO,OAEPL,eACMF,KAAKe,YAAYb,EAAMC,IACtBD,EASfD,EAAWe,SACDC,EAAKD,EAAME,OAAOC,OACpBH,EAAMI,WAAa,GAAKJ,EAAMI,WAAa/B,GACvC4B,EAAGI,iBAAiBC,SAAS/B,IAC7B0B,EAAGM,kBAAkBhC,GAGZ0B,EAAGO,kBAAkBjC,EAAmB,CACrDkC,eAAe,EACfC,QAAS,OAEJC,YAAYnC,EAAcA,EAAc,CAAEoC,QAAQ,KC7KnE,MAAMC,EAAyB,CAC3B,SACA,WACA,iBACA,OACA,cACA,QACA,WACA,YACA,aAQJ,MAAMC,2BAUuBC,SACfC,EAAc,CAChBC,IAAKF,EAAQE,IACbC,QAAS,IAGU,QAAnBH,EAAQI,SAKRH,EAAYI,WAAaL,EAAQM,QAAQC,mBAGxC,MAAOC,EAAKC,KAAUT,EAAQG,QAAQO,UACvCT,EAAYE,QAAQK,GAAOC,MAG1B,MAAME,KAAQb,OACOc,IAAlBZ,EAAQW,KACRV,EAAYU,GAAQX,EAAQW,WAG7B,IAAIZ,EAAgBE,GAW/BtC,YAAYsC,GAiBiB,aAArBA,EAAYY,OACZZ,EAAYY,KAAO,oBAElBC,EAAeb,EASxBc,iBACUd,EAAce,OAAOC,OAAO,GAAIhD,KAAK6C,UAC3Cb,EAAYE,QAAUa,OAAOC,OAAO,GAAIhD,KAAK6C,EAAaX,SACtDF,EAAYI,OACZJ,EAAYI,KAAOJ,EAAYI,KAAKa,MAAM,IAEvCjB,EASXkB,mBACW,IAAIC,QAAQnD,KAAK6C,EAAaZ,IAAKjC,KAAK6C,GASnDR,eACW,IAAIP,EAAgB9B,KAAK8C,aC/GxC,MAAMM,EAAa,0BACbC,EAAqB,MACrBC,EAAa,IAAIC,IAQvB,MAAMC,EAoBF9D,YAAY+D,GAAMC,OAAEA,EAAFC,iBAAUA,GAAqB,YACxCC,GAAkB,OAClBC,GAA2B,EAE5BP,EAAWQ,IAAIL,SACT,IAAIM,eAAa,uBAAwB,CAAEN,KAAAA,IAGjDH,EAAWlD,IAAIqD,QAEdO,EAAQP,OACRQ,EAAUP,GAAU1D,KAAKkE,oBACzBC,EAAoBR,GAAoBN,OACxCe,EAAc,IAAI3E,EAAWO,KAAKgE,QAClCK,sBAMErE,KAAKgE,oBAkBE9D,SAeRF,KAAKsE,EAAYpE,EAAO,6BAkBbA,SAeXF,KAAKsE,EAAYpE,EAAO,qCAUvBF,KAAKuE,EAAe,mCAUpBvE,KAAKuE,EAAe,8BASrBC,QAAmBxE,KAAKoE,EAAYK,SACpCC,EAAMC,KAAKD,MACXE,EAAmB,OACpB,MAAM1E,KAASsE,EAAY,OAGtBK,EAAgD,GAAzB7E,KAAKmE,EAAyB,IACvDO,EAAMxE,EAAM4E,UAAYD,QAClB7E,KAAKoE,EAAYrD,YAAYb,EAAMC,IAGzCyE,EAAiBG,KAAKC,EAAa9E,WAGpC0E,WAYO7C,QAAEA,EAAFkD,SAAWA,EAAXH,UAAqBA,EAAYH,KAAKD,OAAUQ,SAExDhF,EAAQ,CACV8B,mBAF0BF,EAAgBqD,YAAYpD,EAAQM,UAEjCS,WAC7BgC,UAAAA,GAGAG,IACA/E,EAAM+E,SAAWA,SAEfjF,KAAKoE,KAAec,UAAkBhF,GAQxCF,KAAK4D,OACAC,GAA2B,QAG1B7D,KAAKoF,uBAWEF,SACXR,EAAMC,KAAKD,MACXxE,QAAcF,KAAKoE,KAAec,eACpChF,EAAO,OAGD2E,EAAgD,GAAzB7E,KAAKmE,EAAyB,WACvDO,EAAMxE,EAAM4E,UAAYD,EACjB7E,KAAKuE,EAAeW,GAExBF,EAAa9E,+BAYpBA,OACGA,QAAcF,KAAKqF,0BAEZC,MAAMpF,EAAM6B,QAAQM,SAM9B,MAAOkD,eACGvF,KAAKwF,eAAetF,GAKpB,IAAI6D,eAAa,sBAAuB,CAAEN,KAAMzD,KAAKgE,6BAY/D,SAAU9E,KAAKuG,uBAELvG,KAAKuG,aAAaC,KAAKC,YAAYvC,KAAcpD,KAAKgE,KAEhE,MAAO4B,KAgBfvB,IACQ,SAAUnF,KAAKuG,aACfvG,KAAK2G,iBAAiB,OAAS7E,OACvBA,EAAM8E,SAAW1C,KAAcpD,KAAKgE,IAAS,OAKvC+B,EAAeC,cAEbC,OADCrC,GAAkB,YAGb5D,KAAKiE,EAAQ,CAAEiC,MAAOlG,OAEhC,MAAOuF,SACHU,EAAYV,WAWRvF,KAAK6D,GACHoC,IAAcjF,EAAMmF,kBAChBnG,KAAKoF,oBAEVxB,GAAkB,OAClBC,GAA2B,IAGxC7C,EAAMoF,UAAUL,aAUnB9B,EAAQ,CAAEiC,MAAOlG,6BAYnBsD,GAYf,MAAM0B,EAAgBqB,UACZC,EAAa,CACfvE,QAAS,IAAID,EAAgBuE,EAAgBrE,aAAakB,YAC1D4B,UAAWuB,EAAgBvB,kBAE3BuB,EAAgBpB,WAChBqB,EAAWrB,SAAWoB,EAAgBpB,UAEnCqB,mBC5VX,MAQI5G,YAAY+D,EAAM8C,QAMTC,aAAeR,QAASjE,QAAAA,YACnB/B,KAAKyG,EAAOC,YAAY,CAAE3E,QAAAA,WAE/B0E,EAAS,IAAIjD,EAAMC,EAAM8C"}
@@ -0,0 +1,486 @@
1
+ this.workbox = this.workbox || {};
2
+ this.workbox.broadcastUpdate = (function (exports, assert_js, getFriendlyURL_js, logger_js, Deferred_js, WorkboxError_js) {
3
+ 'use strict';
4
+
5
+ // @ts-ignore
6
+ try {
7
+ self['workbox:broadcast-update:5.0.0-alpha.0'] && _();
8
+ } catch (e) {}
9
+
10
+ /*
11
+ Copyright 2018 Google LLC
12
+
13
+ Use of this source code is governed by an MIT-style
14
+ license that can be found in the LICENSE file or at
15
+ https://opensource.org/licenses/MIT.
16
+ */
17
+ /**
18
+ * Given two `Response's`, compares several header values to see if they are
19
+ * the same or not.
20
+ *
21
+ * @param {Response} firstResponse
22
+ * @param {Response} secondResponse
23
+ * @param {Array<string>} headersToCheck
24
+ * @return {boolean}
25
+ *
26
+ * @memberof workbox.broadcastUpdate
27
+ * @private
28
+ */
29
+
30
+ const responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {
31
+ {
32
+ if (!(firstResponse instanceof Response && secondResponse instanceof Response)) {
33
+ throw new WorkboxError_js.WorkboxError('invalid-responses-are-same-args');
34
+ }
35
+ }
36
+
37
+ const atLeastOneHeaderAvailable = headersToCheck.some(header => {
38
+ return firstResponse.headers.has(header) && secondResponse.headers.has(header);
39
+ });
40
+
41
+ if (!atLeastOneHeaderAvailable) {
42
+ {
43
+ logger_js.logger.warn(`Unable to determine where the response has been updated ` + `because none of the headers that would be checked are present.`);
44
+ logger_js.logger.debug(`Attempting to compare the following: `, firstResponse, secondResponse, headersToCheck);
45
+ } // Just return true, indicating the that responses are the same, since we
46
+ // can't determine otherwise.
47
+
48
+
49
+ return true;
50
+ }
51
+
52
+ return headersToCheck.every(header => {
53
+ const headerStateComparison = firstResponse.headers.has(header) === secondResponse.headers.has(header);
54
+ const headerValueComparison = firstResponse.headers.get(header) === secondResponse.headers.get(header);
55
+ return headerStateComparison && headerValueComparison;
56
+ });
57
+ };
58
+
59
+ /*
60
+ Copyright 2018 Google LLC
61
+
62
+ Use of this source code is governed by an MIT-style
63
+ license that can be found in the LICENSE file or at
64
+ https://opensource.org/licenses/MIT.
65
+ */
66
+ const CACHE_UPDATED_MESSAGE_TYPE = 'CACHE_UPDATED';
67
+ const CACHE_UPDATED_MESSAGE_META = 'workbox-broadcast-update';
68
+ const DEFAULT_BROADCAST_CHANNEL_NAME = 'workbox';
69
+ const DEFAULT_DEFER_NOTIFICATION_TIMEOUT = 10000;
70
+ const DEFAULT_HEADERS_TO_CHECK = ['content-length', 'etag', 'last-modified'];
71
+
72
+ /*
73
+ Copyright 2018 Google LLC
74
+
75
+ Use of this source code is governed by an MIT-style
76
+ license that can be found in the LICENSE file or at
77
+ https://opensource.org/licenses/MIT.
78
+ */
79
+ /**
80
+ * You would not normally call this method directly; it's called automatically
81
+ * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here
82
+ * for the benefit of developers who would rather not use the full
83
+ * `BroadcastCacheUpdate` implementation.
84
+ *
85
+ * Calling this will dispatch a message on the provided
86
+ * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}
87
+ * to notify interested subscribers about a change to a cached resource.
88
+ *
89
+ * The message that's posted has a formation inspired by the
90
+ * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)
91
+ * format like so:
92
+ *
93
+ * ```
94
+ * {
95
+ * type: 'CACHE_UPDATED',
96
+ * meta: 'workbox-broadcast-update',
97
+ * payload: {
98
+ * cacheName: 'the-cache-name',
99
+ * updatedURL: 'https://example.com/'
100
+ * }
101
+ * }
102
+ * ```
103
+ *
104
+ * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at
105
+ * all required.)
106
+ *
107
+ * @param {Object} options
108
+ * @param {string} options.cacheName The name of the cache in which the updated
109
+ * `Response` was stored.
110
+ * @param {string} options.url The URL associated with the updated `Response`.
111
+ * @param {BroadcastChannel} [options.channel] The `BroadcastChannel` to use.
112
+ * If no channel is set or the browser doesn't support the BroadcastChannel
113
+ * api, then an attempt will be made to `postMessage` each window client.
114
+ *
115
+ * @memberof workbox.broadcastUpdate
116
+ */
117
+
118
+ const broadcastUpdate = async ({
119
+ channel,
120
+ cacheName,
121
+ url
122
+ }) => {
123
+ {
124
+ assert_js.assert.isType(cacheName, 'string', {
125
+ moduleName: 'workbox-broadcast-update',
126
+ className: '~',
127
+ funcName: 'broadcastUpdate',
128
+ paramName: 'cacheName'
129
+ });
130
+ assert_js.assert.isType(url, 'string', {
131
+ moduleName: 'workbox-broadcast-update',
132
+ className: '~',
133
+ funcName: 'broadcastUpdate',
134
+ paramName: 'url'
135
+ });
136
+ }
137
+
138
+ const data = {
139
+ type: CACHE_UPDATED_MESSAGE_TYPE,
140
+ meta: CACHE_UPDATED_MESSAGE_META,
141
+ payload: {
142
+ cacheName: cacheName,
143
+ updatedURL: url
144
+ }
145
+ };
146
+
147
+ if (channel) {
148
+ channel.postMessage(data);
149
+ } else {
150
+ const windows = await self.clients.matchAll({
151
+ type: 'window'
152
+ });
153
+
154
+ for (const win of windows) {
155
+ win.postMessage(data);
156
+ }
157
+ }
158
+ };
159
+
160
+ /*
161
+ Copyright 2018 Google LLC
162
+
163
+ Use of this source code is governed by an MIT-style
164
+ license that can be found in the LICENSE file or at
165
+ https://opensource.org/licenses/MIT.
166
+ */
167
+ /**
168
+ * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}
169
+ * to notify interested parties when a cached response has been updated.
170
+ * In browsers that do not support the Broadcast Channel API, the instance
171
+ * falls back to sending the update via `postMessage()` to all window clients.
172
+ *
173
+ * For efficiency's sake, the underlying response bodies are not compared;
174
+ * only specific response headers are checked.
175
+ *
176
+ * @memberof workbox.broadcastUpdate
177
+ */
178
+
179
+ class BroadcastCacheUpdate {
180
+ /**
181
+ * Construct a BroadcastCacheUpdate instance with a specific `channelName` to
182
+ * broadcast messages on
183
+ *
184
+ * @param {Object} options
185
+ * @param {Array<string>}
186
+ * [options.headersToCheck=['content-length', 'etag', 'last-modified']]
187
+ * A list of headers that will be used to determine whether the responses
188
+ * differ.
189
+ * @param {string} [options.channelName='workbox'] The name that will be used
190
+ *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the
191
+ * channel name used by the `workbox-window` package).
192
+ * @param {string} [options.deferNoticationTimeout=10000] The amount of time
193
+ * to wait for a ready message from the window on navigation requests
194
+ * before sending the update.
195
+ */
196
+ constructor({
197
+ headersToCheck,
198
+ channelName,
199
+ deferNoticationTimeout
200
+ } = {}) {
201
+ this._headersToCheck = headersToCheck || DEFAULT_HEADERS_TO_CHECK;
202
+ this._channelName = channelName || DEFAULT_BROADCAST_CHANNEL_NAME;
203
+ this._deferNoticationTimeout = deferNoticationTimeout || DEFAULT_DEFER_NOTIFICATION_TIMEOUT;
204
+
205
+ {
206
+ assert_js.assert.isType(this._channelName, 'string', {
207
+ moduleName: 'workbox-broadcast-update',
208
+ className: 'BroadcastCacheUpdate',
209
+ funcName: 'constructor',
210
+ paramName: 'channelName'
211
+ });
212
+ assert_js.assert.isArray(this._headersToCheck, {
213
+ moduleName: 'workbox-broadcast-update',
214
+ className: 'BroadcastCacheUpdate',
215
+ funcName: 'constructor',
216
+ paramName: 'headersToCheck'
217
+ });
218
+ }
219
+
220
+ this._initWindowReadyDeferreds();
221
+ }
222
+ /**
223
+ * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)
224
+ * and send a message via the
225
+ * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}
226
+ * if they differ.
227
+ *
228
+ * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.
229
+ *
230
+ * @param {Object} options
231
+ * @param {Response} options.oldResponse Cached response to compare.
232
+ * @param {Response} options.newResponse Possibly updated response to compare.
233
+ * @param {string} options.url The URL of the request.
234
+ * @param {string} options.cacheName Name of the cache the responses belong
235
+ * to. This is included in the broadcast message.
236
+ * @param {Event} [options.event] event An optional event that triggered
237
+ * this possible cache update.
238
+ * @return {Promise} Resolves once the update is sent.
239
+ */
240
+
241
+
242
+ notifyIfUpdated({
243
+ oldResponse,
244
+ newResponse,
245
+ url,
246
+ cacheName,
247
+ event
248
+ }) {
249
+ if (!responsesAreSame(oldResponse, newResponse, this._headersToCheck)) {
250
+ {
251
+ logger_js.logger.log(`Newer response found (and cached) for:`, url);
252
+ }
253
+
254
+ const sendUpdate = async () => {
255
+ // In the case of a navigation request, the requesting page will likely
256
+ // not have loaded its JavaScript in time to recevied the update
257
+ // notification, so we defer it until ready (or we timeout waiting).
258
+ if (event && event.request && event.request.mode === 'navigate') {
259
+ {
260
+ logger_js.logger.debug(`Original request was a navigation request, ` + `waiting for a ready message from the window`, event.request);
261
+ }
262
+
263
+ await this._windowReadyOrTimeout(event);
264
+ }
265
+
266
+ await this._broadcastUpdate({
267
+ channel: this._getChannel(),
268
+ cacheName,
269
+ url
270
+ });
271
+ }; // Send the update and ensure the SW stays alive until it's sent.
272
+
273
+
274
+ const done = sendUpdate();
275
+
276
+ if (event) {
277
+ try {
278
+ event.waitUntil(done);
279
+ } catch (error) {
280
+ {
281
+ logger_js.logger.warn(`Unable to ensure service worker stays alive ` + `when broadcasting cache update for ` + `${getFriendlyURL_js.getFriendlyURL(event.request.url)}'.`);
282
+ }
283
+ }
284
+ }
285
+
286
+ return done;
287
+ }
288
+ }
289
+ /**
290
+ * NOTE: this is exposed on the instance primarily so it can be spied on
291
+ * in tests.
292
+ *
293
+ * @param {Object} opts
294
+ * @private
295
+ */
296
+
297
+
298
+ async _broadcastUpdate(opts) {
299
+ await broadcastUpdate(opts);
300
+ }
301
+ /**
302
+ * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for
303
+ * broadcasting updates, or undefined if the browser doesn't support the
304
+ * Broadcast Channel API.
305
+ *
306
+ * @private
307
+ */
308
+
309
+
310
+ _getChannel() {
311
+ if ('BroadcastChannel' in self && !this._channel) {
312
+ this._channel = new BroadcastChannel(this._channelName);
313
+ }
314
+
315
+ return this._channel;
316
+ }
317
+ /**
318
+ * Waits for a message from the window indicating that it's capable of
319
+ * receiving broadcasts. By default, this will only wait for the amount of
320
+ * time specified via the `deferNoticationTimeout` option.
321
+ *
322
+ * @param {Event} event The navigation fetch event.
323
+ * @return {Promise}
324
+ * @private
325
+ */
326
+
327
+
328
+ _windowReadyOrTimeout(event) {
329
+ if (!this._navigationEventsDeferreds.has(event)) {
330
+ const deferred = new Deferred_js.Deferred(); // Set the deferred on the `_navigationEventsDeferreds` map so it will
331
+ // be resolved when the next ready message event comes.
332
+
333
+ this._navigationEventsDeferreds.set(event, deferred); // But don't wait too long for the message since it may never come.
334
+
335
+
336
+ const timeout = setTimeout(() => {
337
+ {
338
+ logger_js.logger.debug(`Timed out after ${this._deferNoticationTimeout}` + `ms waiting for message from window`);
339
+ }
340
+
341
+ deferred.resolve();
342
+ }, this._deferNoticationTimeout); // Ensure the timeout is cleared if the deferred promise is resolved.
343
+
344
+ deferred.promise.then(() => clearTimeout(timeout));
345
+ }
346
+
347
+ return this._navigationEventsDeferreds.get(event).promise;
348
+ }
349
+ /**
350
+ * Creates a mapping between navigation fetch events and deferreds, and adds
351
+ * a listener for message events from the window. When message events arrive,
352
+ * all deferreds in the mapping are resolved.
353
+ *
354
+ * Note: it would be easier if we could only resolve the deferred of
355
+ * navigation fetch event whose client ID matched the source ID of the
356
+ * message event, but currently client IDs are not exposed on navigation
357
+ * fetch events: https://www.chromestatus.com/feature/4846038800138240
358
+ *
359
+ * @private
360
+ */
361
+
362
+
363
+ _initWindowReadyDeferreds() {
364
+ // A mapping between navigation events and their deferreds.
365
+ this._navigationEventsDeferreds = new Map(); // The message listener needs to be added in the initial run of the
366
+ // service worker, but since we don't actually need to be listening for
367
+ // messages until the cache updates, we only invoke the callback if set.
368
+
369
+ self.addEventListener('message', event => {
370
+ if (event.data.type === 'WINDOW_READY' && event.data.meta === 'workbox-window' && this._navigationEventsDeferreds.size > 0) {
371
+ {
372
+ logger_js.logger.debug(`Received WINDOW_READY event: `, event);
373
+ } // Resolve any pending deferreds.
374
+
375
+
376
+ for (const deferred of this._navigationEventsDeferreds.values()) {
377
+ deferred.resolve();
378
+ }
379
+
380
+ this._navigationEventsDeferreds.clear();
381
+ }
382
+ });
383
+ }
384
+
385
+ }
386
+
387
+ /*
388
+ Copyright 2018 Google LLC
389
+
390
+ Use of this source code is governed by an MIT-style
391
+ license that can be found in the LICENSE file or at
392
+ https://opensource.org/licenses/MIT.
393
+ */
394
+ /**
395
+ * This plugin will automatically broadcast a message whenever a cached response
396
+ * is updated.
397
+ *
398
+ * @memberof workbox.broadcastUpdate
399
+ */
400
+
401
+ class Plugin {
402
+ /**
403
+ * Construct a BroadcastCacheUpdate instance with the passed options and
404
+ * calls its `notifyIfUpdated()` method whenever the plugin's
405
+ * `cacheDidUpdate` callback is invoked.
406
+ *
407
+ * @param {Object} options
408
+ * @param {Array<string>}
409
+ * [options.headersToCheck=['content-length', 'etag', 'last-modified']]
410
+ * A list of headers that will be used to determine whether the responses
411
+ * differ.
412
+ * @param {string} [options.channelName='workbox'] The name that will be used
413
+ *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the
414
+ * channel name used by the `workbox-window` package).
415
+ * @param {string} [options.deferNoticationTimeout=10000] The amount of time
416
+ * to wait for a ready message from the window on navigation requests
417
+ * before sending the update.
418
+ */
419
+ constructor(options) {
420
+ /**
421
+ * A "lifecycle" callback that will be triggered automatically by the
422
+ * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is
423
+ * added to a cache.
424
+ *
425
+ * @private
426
+ * @param {Object} options The input object to this function.
427
+ * @param {string} options.cacheName Name of the cache being updated.
428
+ * @param {Response} [options.oldResponse] The previous cached value, if any.
429
+ * @param {Response} options.newResponse The new value in the cache.
430
+ * @param {Request} options.request The request that triggered the udpate.
431
+ * @param {Request} [options.event] The event that triggered the update.
432
+ */
433
+ this.cacheDidUpdate = async ({
434
+ cacheName,
435
+ oldResponse,
436
+ newResponse,
437
+ request,
438
+ event
439
+ }) => {
440
+ {
441
+ assert_js.assert.isType(cacheName, 'string', {
442
+ moduleName: 'workbox-broadcast-update',
443
+ className: 'Plugin',
444
+ funcName: 'cacheDidUpdate',
445
+ paramName: 'cacheName'
446
+ });
447
+ assert_js.assert.isInstance(newResponse, Response, {
448
+ moduleName: 'workbox-broadcast-update',
449
+ className: 'Plugin',
450
+ funcName: 'cacheDidUpdate',
451
+ paramName: 'newResponse'
452
+ });
453
+ assert_js.assert.isInstance(request, Request, {
454
+ moduleName: 'workbox-broadcast-update',
455
+ className: 'Plugin',
456
+ funcName: 'cacheDidUpdate',
457
+ paramName: 'request'
458
+ });
459
+ } // Without a two responses there is nothing to compare.
460
+
461
+
462
+ if (oldResponse) {
463
+ this._broadcastUpdate.notifyIfUpdated({
464
+ cacheName,
465
+ oldResponse,
466
+ newResponse,
467
+ event,
468
+ url: request.url
469
+ });
470
+ }
471
+ };
472
+
473
+ this._broadcastUpdate = new BroadcastCacheUpdate(options);
474
+ }
475
+
476
+ }
477
+
478
+ exports.BroadcastCacheUpdate = BroadcastCacheUpdate;
479
+ exports.Plugin = Plugin;
480
+ exports.broadcastUpdate = broadcastUpdate;
481
+ exports.responsesAreSame = responsesAreSame;
482
+
483
+ return exports;
484
+
485
+ }({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private));
486
+ //# sourceMappingURL=workbox-broadcast-update.dev.js.map