| 'use strict' |
| |
| const { kConstruct } = require('./symbols') |
| const { Cache } = require('./cache') |
| const { webidl } = require('../fetch/webidl') |
| const { kEnumerableProperty } = require('../core/util') |
| |
| class CacheStorage { |
| /** |
| * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map |
| * @type {Map<string, import('./cache').requestResponseList} |
| */ |
| #caches = new Map() |
| |
| constructor () { |
| if (arguments[0] !== kConstruct) { |
| webidl.illegalConstructor() |
| } |
| } |
| |
| async match (request, options = {}) { |
| webidl.brandCheck(this, CacheStorage) |
| webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.match' }) |
| |
| request = webidl.converters.RequestInfo(request) |
| options = webidl.converters.MultiCacheQueryOptions(options) |
| |
| // 1. |
| if (options.cacheName != null) { |
| // 1.1.1.1 |
| if (this.#caches.has(options.cacheName)) { |
| // 1.1.1.1.1 |
| const cacheList = this.#caches.get(options.cacheName) |
| const cache = new Cache(kConstruct, cacheList) |
| |
| return await cache.match(request, options) |
| } |
| } else { // 2. |
| // 2.2 |
| for (const cacheList of this.#caches.values()) { |
| const cache = new Cache(kConstruct, cacheList) |
| |
| // 2.2.1.2 |
| const response = await cache.match(request, options) |
| |
| if (response !== undefined) { |
| return response |
| } |
| } |
| } |
| } |
| |
| /** |
| * @see https://w3c.github.io/ServiceWorker/#cache-storage-has |
| * @param {string} cacheName |
| * @returns {Promise<boolean>} |
| */ |
| async has (cacheName) { |
| webidl.brandCheck(this, CacheStorage) |
| webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }) |
| |
| cacheName = webidl.converters.DOMString(cacheName) |
| |
| // 2.1.1 |
| // 2.2 |
| return this.#caches.has(cacheName) |
| } |
| |
| /** |
| * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open |
| * @param {string} cacheName |
| * @returns {Promise<Cache>} |
| */ |
| async open (cacheName) { |
| webidl.brandCheck(this, CacheStorage) |
| webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }) |
| |
| cacheName = webidl.converters.DOMString(cacheName) |
| |
| // 2.1 |
| if (this.#caches.has(cacheName)) { |
| // await caches.open('v1') !== await caches.open('v1') |
| |
| // 2.1.1 |
| const cache = this.#caches.get(cacheName) |
| |
| // 2.1.1.1 |
| return new Cache(kConstruct, cache) |
| } |
| |
| // 2.2 |
| const cache = [] |
| |
| // 2.3 |
| this.#caches.set(cacheName, cache) |
| |
| // 2.4 |
| return new Cache(kConstruct, cache) |
| } |
| |
| /** |
| * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete |
| * @param {string} cacheName |
| * @returns {Promise<boolean>} |
| */ |
| async delete (cacheName) { |
| webidl.brandCheck(this, CacheStorage) |
| webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }) |
| |
| cacheName = webidl.converters.DOMString(cacheName) |
| |
| return this.#caches.delete(cacheName) |
| } |
| |
| /** |
| * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys |
| * @returns {string[]} |
| */ |
| async keys () { |
| webidl.brandCheck(this, CacheStorage) |
| |
| // 2.1 |
| const keys = this.#caches.keys() |
| |
| // 2.2 |
| return [...keys] |
| } |
| } |
| |
| Object.defineProperties(CacheStorage.prototype, { |
| [Symbol.toStringTag]: { |
| value: 'CacheStorage', |
| configurable: true |
| }, |
| match: kEnumerableProperty, |
| has: kEnumerableProperty, |
| open: kEnumerableProperty, |
| delete: kEnumerableProperty, |
| keys: kEnumerableProperty |
| }) |
| |
| module.exports = { |
| CacheStorage |
| } |