From 26105034da4fcce7ac883c899d781f016559310d Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 8 Nov 2018 00:38:48 +0800 Subject: switch to vuepress --- .../workbox-background-sync/models/QueueStore.mjs | 82 +++++++++++ .../models/StorableRequest.mjs | 151 +++++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 node_modules/workbox-background-sync/models/QueueStore.mjs create mode 100644 node_modules/workbox-background-sync/models/StorableRequest.mjs (limited to 'node_modules/workbox-background-sync/models') diff --git a/node_modules/workbox-background-sync/models/QueueStore.mjs b/node_modules/workbox-background-sync/models/QueueStore.mjs new file mode 100644 index 00000000..6f880d88 --- /dev/null +++ b/node_modules/workbox-background-sync/models/QueueStore.mjs @@ -0,0 +1,82 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs'; +import StorableRequest from './StorableRequest.mjs'; +import {DB_NAME, OBJECT_STORE_NAME, INDEXED_PROP} from '../utils/constants.mjs'; +import '../_version.mjs'; + +/** + * A class to manage storing requests from a Queue in IndexedbDB, + * indexed by their queue name for easier access. + * + * @private + */ +export class QueueStore { + /** + * Associates this instance with a Queue instance, so entries added can be + * identified by their queue name. + * + * @param {Queue} queue + * + * @private + */ + constructor(queue) { + this._queue = queue; + this._db = new DBWrapper(DB_NAME, 1, { + onupgradeneeded: (evt) => evt.target.result + .createObjectStore(OBJECT_STORE_NAME, {autoIncrement: true}) + .createIndex(INDEXED_PROP, INDEXED_PROP, {unique: false}), + }); + } + + /** + * Takes a StorableRequest instance, converts it to an object and adds it + * as an entry in the object store. + * + * @param {StorableRequest} storableRequest + * + * @private + */ + async addEntry(storableRequest) { + await this._db.add(OBJECT_STORE_NAME, { + queueName: this._queue.name, + storableRequest: storableRequest.toObject(), + }); + } + + /** + * Gets the oldest entry in the object store, removes it, and returns the + * value as a StorableRequest instance. If no entry exists, it returns + * undefined. + * + * @return {StorableRequest|undefined} + * + * @private + */ + async getAndRemoveOldestEntry() { + const [entry] = await this._db.getAllMatching(OBJECT_STORE_NAME, { + index: INDEXED_PROP, + query: IDBKeyRange.only(this._queue.name), + count: 1, + includeKeys: true, + }); + + if (entry) { + await this._db.delete(OBJECT_STORE_NAME, entry.primaryKey); + return new StorableRequest(entry.value.storableRequest); + } + } +} diff --git a/node_modules/workbox-background-sync/models/StorableRequest.mjs b/node_modules/workbox-background-sync/models/StorableRequest.mjs new file mode 100644 index 00000000..dc03b47b --- /dev/null +++ b/node_modules/workbox-background-sync/models/StorableRequest.mjs @@ -0,0 +1,151 @@ +/* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import '../_version.mjs'; + +const serializableProperties = [ + 'method', + 'referrer', + 'referrerPolicy', + 'mode', + 'credentials', + 'cache', + 'redirect', + 'integrity', + 'keepalive', +]; + + +/** + * A class to make it easier to serialize and de-serialize requests so they + * can be stored in IndexedDB. + * + * @private + */ +export default class StorableRequest { + /** + * Converts a Request object to a plain object that can be structured + * cloned or JSON-stringified. + * + * @param {Request} request + * @return {Promise} + * + * @private + */ + static async fromRequest(request) { + const requestInit = {headers: {}}; + + // Set the body if present. + if (request.method !== 'GET') { + // Use blob to support non-text request bodies, + // and clone first in case the caller still needs the request. + requestInit.body = await request.clone().blob(); + } + + // Convert the headers from an iterable to an object. + for (const [key, value] of request.headers.entries()) { + requestInit.headers[key] = value; + } + + // Add all other serializable request properties + for (const prop of serializableProperties) { + if (request[prop] !== undefined) { + requestInit[prop] = request[prop]; + } + } + + return new StorableRequest({url: request.url, requestInit}); + } + + /** + * Accepts a URL and RequestInit dictionary that can be used to create a + * new Request object. A timestamp is also generated so consumers can + * reference when the object was created. + * + * @param {Object} param1 + * @param {string} param1.url + * @param {Object} param1.requestInit + * See: https://fetch.spec.whatwg.org/#requestinit + * @param {number} param1.timestamp The time the request was created, + * defaulting to the current time if not specified. + * + * @private + */ + constructor({url, requestInit, timestamp = Date.now()}) { + this.url = url; + this.requestInit = requestInit; + + // "Private" + this._timestamp = timestamp; + } + + /** + * Gets the private _timestamp property. + * + * @return {number} + * + * @private + */ + get timestamp() { + return this._timestamp; + } + + /** + * Coverts this instance to a plain Object. + * + * @return {Object} + * + * @private + */ + toObject() { + return { + url: this.url, + timestamp: this.timestamp, + requestInit: this.requestInit, + }; + } + + /** + * Converts this instance to a Request. + * + * @return {Request} + * + * @private + */ + toRequest() { + return new Request(this.url, this.requestInit); + } + + /** + * Creates and returns a deep clone of the instance. + * + * @return {StorableRequest} + * + * @private + */ + clone() { + const requestInit = Object.assign({}, this.requestInit); + requestInit.headers = Object.assign({}, this.requestInit.headers); + if (this.requestInit.body) { + requestInit.body = this.requestInit.body.slice(); + } + + return new StorableRequest({ + url: this.url, + timestamp: this.timestamp, + requestInit, + }); + } +} -- cgit v1.2.3