workbox-background-sync
Advanced tools
Comparing version 4.2.0 to 4.3.0
@@ -6,3 +6,3 @@ this.workbox = this.workbox || {}; | ||
try { | ||
self['workbox:background-sync:4.2.0'] && _(); | ||
self['workbox:background-sync:4.3.0'] && _(); | ||
} catch (e) {} // eslint-disable-line | ||
@@ -49,2 +49,3 @@ | ||
* @param {Object} [entry.metadata] | ||
* @private | ||
*/ | ||
@@ -81,2 +82,3 @@ | ||
* @param {Object} [entry.metadata] | ||
* @private | ||
*/ | ||
@@ -109,2 +111,3 @@ | ||
} else { | ||
// Otherwise let the auto-incrementor assign the ID. | ||
delete entry.id; | ||
@@ -120,2 +123,3 @@ } | ||
* @return {Promise<Object>} | ||
* @private | ||
*/ | ||
@@ -133,2 +137,3 @@ | ||
* @return {Promise<Object>} | ||
* @private | ||
*/ | ||
@@ -143,2 +148,33 @@ | ||
/** | ||
* Returns all entries in the store matching the `queueName`. | ||
* | ||
* @param {Object} options See workbox.backgroundSync.Queue~getAll} | ||
* @return {Promise<Array<Object>>} | ||
* @private | ||
*/ | ||
async getAll() { | ||
return await this._db.getAllMatching(OBJECT_STORE_NAME, { | ||
index: INDEXED_PROP, | ||
query: IDBKeyRange.only(this._queueName) | ||
}); | ||
} | ||
/** | ||
* Deletes the entry for the given ID. | ||
* | ||
* WARNING: this method does not ensure the deleted enry belongs to this | ||
* queue (i.e. matches the `queueName`). But this limitation is acceptable | ||
* as this class is not publicly exposed. An additional check would make | ||
* this method slower than it needs to be. | ||
* | ||
* @private | ||
* @param {number} id | ||
*/ | ||
async deleteEntry(id) { | ||
await this._db.delete(OBJECT_STORE_NAME, id); | ||
} | ||
/** | ||
* Removes and returns the first or last entry in the queue (based on the | ||
@@ -148,2 +184,3 @@ * `direction` argument) matching the `queueName`. | ||
* @return {Promise<Object>} | ||
* @private | ||
*/ | ||
@@ -163,6 +200,3 @@ | ||
if (entry) { | ||
await this._db.delete(OBJECT_STORE_NAME, entry.id); // Dont' expose the ID or queueName; | ||
delete entry.id; | ||
delete entry.queueName; | ||
await this.deleteEntry(entry.id); | ||
return entry; | ||
@@ -175,2 +209,3 @@ } | ||
* @param {Event} event | ||
* @private | ||
*/ | ||
@@ -277,2 +312,8 @@ | ||
}); | ||
} // If the request's mode is `navigate`, convert it to `same-origin` since | ||
// navigation requests can't be constructed via script. | ||
if (requestData.mode === 'navigate') { | ||
requestData.mode = 'same-origin'; | ||
} | ||
@@ -492,2 +533,29 @@ | ||
/** | ||
* Returns all the entries that have not expired (per `maxRetentionTime`). | ||
* Any expired entries are removed from the queue. | ||
* | ||
* @return {Promise<Array<Object>>} | ||
*/ | ||
async getAll() { | ||
const allEntries = await this._queueStore.getAll(); | ||
const now = Date.now(); | ||
const unexpiredEntries = []; | ||
for (const entry of allEntries) { | ||
// Ignore requests older than maxRetentionTime. Call this function | ||
// recursively until an unexpired request is found. | ||
const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000; | ||
if (now - entry.timestamp > maxRetentionTimeInMs) { | ||
await this._queueStore.deleteEntry(entry.id); | ||
} else { | ||
unexpiredEntries.push(convertEntry(entry)); | ||
} | ||
} | ||
return unexpiredEntries; | ||
} | ||
/** | ||
* Adds the entry to the QueueStore and registers for a sync event. | ||
@@ -500,2 +568,3 @@ * | ||
* @param {string} operation ('push' or 'unshift') | ||
* @private | ||
*/ | ||
@@ -536,6 +605,7 @@ | ||
* Removes and returns the first or last (depending on `operation`) entry | ||
* form the QueueStore that's not older than the `maxRetentionTime`. | ||
* from the QueueStore that's not older than the `maxRetentionTime`. | ||
* | ||
* @param {string} operation ('pop' or 'shift') | ||
* @return {Object|undefined} | ||
* @private | ||
*/ | ||
@@ -557,5 +627,3 @@ | ||
entry.request = new StorableRequest(entry.requestData).toRequest(); | ||
delete entry.requestData; | ||
return entry; | ||
return convertEntry(entry); | ||
} | ||
@@ -575,3 +643,3 @@ } | ||
try { | ||
await fetch(entry.request); | ||
await fetch(entry.request.clone()); | ||
@@ -691,3 +759,26 @@ { | ||
} | ||
/** | ||
* Converts a QueueStore entry into the format exposed by Queue. This entails | ||
* converting the request data into a real request and omitting the `id` and | ||
* `queueName` properties. | ||
* | ||
* @param {Object} queueStoreEntry | ||
* @return {Object} | ||
* @private | ||
*/ | ||
const convertEntry = queueStoreEntry => { | ||
const queueEntry = { | ||
request: new StorableRequest(queueStoreEntry.requestData).toRequest(), | ||
timestamp: queueStoreEntry.timestamp | ||
}; | ||
if (queueStoreEntry.metadata) { | ||
queueEntry.metadata = queueStoreEntry.metadata; | ||
} | ||
return queueEntry; | ||
}; | ||
/* | ||
@@ -694,0 +785,0 @@ Copyright 2018 Google LLC |
@@ -1,2 +0,2 @@ | ||
this.workbox=this.workbox||{},this.workbox.backgroundSync=function(t,e,s){"use strict";try{self["workbox:background-sync:4.2.0"]&&_()}catch(t){}const i=3,n="workbox-background-sync",a="requests",r="queueName";class c{constructor(t){this.t=t,this.s=new s.DBWrapper(n,i,{onupgradeneeded:this.i})}async pushEntry(t){delete t.id,t.queueName=this.t,await this.s.add(a,t)}async unshiftEntry(t){const[e]=await this.s.getAllMatching(a,{count:1});e?t.id=e.id-1:delete t.id,t.queueName=this.t,await this.s.add(a,t)}async popEntry(){return this.h({direction:"prev"})}async shiftEntry(){return this.h({direction:"next"})}async h({direction:t}){const[e]=await this.s.getAllMatching(a,{direction:t,index:r,query:IDBKeyRange.only(this.t),count:1});if(e)return await this.s.delete(a,e.id),delete e.id,delete e.queueName,e}i(t){const e=t.target.result;t.oldVersion>0&&t.oldVersion<i&&e.objectStoreNames.contains(a)&&e.deleteObjectStore(a),e.createObjectStore(a,{autoIncrement:!0,keyPath:"id"}).createIndex(r,r,{unique:!1})}}const h=["method","referrer","referrerPolicy","mode","credentials","cache","redirect","integrity","keepalive"];class o{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 h)void 0!==t[s]&&(e[s]=t[s]);return new o(e)}constructor(t){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 o(this.toObject())}}const u="workbox-background-sync",y=10080,w=new Set;class d{constructor(t,{onSync:s,maxRetentionTime:i}={}){if(w.has(t))throw new e.WorkboxError("duplicate-queue-name",{name:t});w.add(t),this.u=t,this.l=s||this.replayRequests,this.q=i||y,this.m=new c(this.u),this.p()}get name(){return this.u}async pushRequest(t){await this.g(t,"push")}async unshiftRequest(t){await this.g(t,"unshift")}async popRequest(){return this.R("pop")}async shiftRequest(){return this.R("shift")}async g({request:t,metadata:e,timestamp:s=Date.now()},i){const n={requestData:(await o.fromRequest(t.clone())).toObject(),timestamp:s};e&&(n.metadata=e),await this.m[`${i}Entry`](n),this.k?this._=!0:await this.registerSync()}async R(t){const e=Date.now(),s=await this.m[`${t}Entry`]();if(s){const i=60*this.q*1e3;return e-s.timestamp>i?this.R(t):(s.request=new o(s.requestData).toRequest(),delete s.requestData,s)}}async replayRequests(){let t;for(;t=await this.shiftRequest();)try{await fetch(t.request)}catch(s){throw await this.unshiftRequest(t),new e.WorkboxError("queue-replay-failed",{name:this.u})}}async registerSync(){if("sync"in registration)try{await registration.sync.register(`${u}:${this.u}`)}catch(t){}}p(){"sync"in registration?self.addEventListener("sync",t=>{if(t.tag===`${u}:${this.u}`){const e=async()=>{let e;this.k=!0;try{await this.l({queue:this})}catch(t){throw e=t}finally{!this._||e&&!t.lastChance||await this.registerSync(),this.k=!1,this._=!1}};t.waitUntil(e())}}):this.l({queue:this})}static get D(){return w}}return t.Queue=d,t.Plugin=class{constructor(...t){this.$=new d(...t),this.fetchDidFail=this.fetchDidFail.bind(this)}async fetchDidFail({request:t}){await this.$.pushRequest({request:t})}},t}({},workbox.core._private,workbox.core._private); | ||
this.workbox=this.workbox||{},this.workbox.backgroundSync=function(t,e,s){"use strict";try{self["workbox:background-sync:4.3.0"]&&_()}catch(t){}const i=3,n="workbox-background-sync",a="requests",r="queueName";class c{constructor(t){this.t=t,this.s=new s.DBWrapper(n,i,{onupgradeneeded:this.i})}async pushEntry(t){delete t.id,t.queueName=this.t,await this.s.add(a,t)}async unshiftEntry(t){const[e]=await this.s.getAllMatching(a,{count:1});e?t.id=e.id-1:delete t.id,t.queueName=this.t,await this.s.add(a,t)}async popEntry(){return this.h({direction:"prev"})}async shiftEntry(){return this.h({direction:"next"})}async getAll(){return await this.s.getAllMatching(a,{index:r,query:IDBKeyRange.only(this.t)})}async deleteEntry(t){await this.s.delete(a,t)}async h({direction:t}){const[e]=await this.s.getAllMatching(a,{direction:t,index:r,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<i&&e.objectStoreNames.contains(a)&&e.deleteObjectStore(a),e.createObjectStore(a,{autoIncrement:!0,keyPath:"id"}).createIndex(r,r,{unique:!1})}}const h=["method","referrer","referrerPolicy","mode","credentials","cache","redirect","integrity","keepalive"];class o{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 h)void 0!==t[s]&&(e[s]=t[s]);return new o(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 o(this.toObject())}}const u="workbox-background-sync",y=10080,w=new Set;class d{constructor(t,{onSync:s,maxRetentionTime:i}={}){if(w.has(t))throw new e.WorkboxError("duplicate-queue-name",{name:t});w.add(t),this.u=t,this.l=s||this.replayRequests,this.q=i||y,this.m=new c(this.u),this.p()}get name(){return this.u}async pushRequest(t){await this.g(t,"push")}async unshiftRequest(t){await this.g(t,"unshift")}async popRequest(){return this.R("pop")}async shiftRequest(){return this.R("shift")}async getAll(){const t=await this.m.getAll(),e=Date.now(),s=[];for(const i of t){const t=60*this.q*1e3;e-i.timestamp>t?await this.m.deleteEntry(i.id):s.push(f(i))}return s}async g({request:t,metadata:e,timestamp:s=Date.now()},i){const n={requestData:(await o.fromRequest(t.clone())).toObject(),timestamp:s};e&&(n.metadata=e),await this.m[`${i}Entry`](n),this.k?this.D=!0:await this.registerSync()}async R(t){const e=Date.now(),s=await this.m[`${t}Entry`]();if(s){const i=60*this.q*1e3;return e-s.timestamp>i?this.R(t):f(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.u})}}async registerSync(){if("sync"in registration)try{await registration.sync.register(`${u}:${this.u}`)}catch(t){}}p(){"sync"in registration?self.addEventListener("sync",t=>{if(t.tag===`${u}:${this.u}`){const e=async()=>{let e;this.k=!0;try{await this.l({queue:this})}catch(t){throw e=t}finally{!this.D||e&&!t.lastChance||await this.registerSync(),this.k=!1,this.D=!1}};t.waitUntil(e())}}):this.l({queue:this})}static get _(){return w}}const f=t=>{const e={request:new o(t.requestData).toRequest(),timestamp:t.timestamp};return t.metadata&&(e.metadata=t.metadata),e};return t.Queue=d,t.Plugin=class{constructor(...t){this.v=new d(...t),this.fetchDidFail=this.fetchDidFail.bind(this)}async fetchDidFail({request:t}){await this.v.pushRequest({request:t})}},t}({},workbox.core._private,workbox.core._private); | ||
//# sourceMappingURL=workbox-background-sync.prod.js.map |
{ | ||
"name": "workbox-background-sync", | ||
"version": "4.2.0", | ||
"version": "4.3.0", | ||
"license": "MIT", | ||
@@ -31,5 +31,5 @@ "author": "Google's Web DevRel Team", | ||
"dependencies": { | ||
"workbox-core": "^4.2.0" | ||
"workbox-core": "^4.3.0" | ||
}, | ||
"gitHead": "60f99c8c017b62ffe90b591b7f4be37dc44d92f6" | ||
"gitHead": "7c873eb2b7e4530fb554c41d9c425c5167e45de7" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 2 instances in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
121193
1430
4
Updatedworkbox-core@^4.3.0