Code snippets from David Walsh's JavaScript Cache API Article.

/*
 * From David Walsh's Cache API Article
 * https://davidwalsh.name/cache
 * More on the Cache API: https://developer.mozilla.org/en-US/docs/Web/API/Cache
 */

//
// Detecting the cache API
//
// To detect if the browser supports the Cache API...
//
// NOTE: Cache API is not supported at all by Internet Explorer,
// however the API is supported in Microsoft Edge.
var isCacheSupported = (function() {
    return "caches" in window;
})();

//
// Creating a Cache
//
// Creating a cache requires a caches.open call with a cache name. The
// caches.open call returns a Promise and the cache object that was either
// created or existed before the open call.
caches.open("test-cache").then(function(cache) {
    // Cache is created and accessible
});

//
// Adding to Cache
//
// You can think of a cache as an array of Request objects which act as keys to
// their responses which are stored by the browser. Simple addition to cache is
// happens via two main methods: add and addAll. You can provide these methods a
// string for the URL that should be fetched and cached or a Request object.
//
// NOTE: You can learn more about Request objects by reading my fetch API post
// (https://davidwalsh.name/fetch).
//
// To batch add URLs to cache, you can use the addAll method:
caches.open("test-cache").then(function(cache) {
    // The `addAll()` method accepts an array of URLs whose URLs and responses
    // should be cached. addAll returns a Promise.
    cache.addAll(["/", "/images/logo.png"]).then(function() {
        // Cached!
    });
});

// To add a single URL, use the `add()` method:
caches.open("test-cache").then(function(cache) {
    cache.add("/page/1"); // "/page/1" URL will be fetched and cached!
});

// add can also accept a custom Request:
caches.open("test-cache").then(function(cache) {
    cache.add(
        new Request("/page/1", {
            /* request options */
        })
    );
});

// Similar to add is put whereby you can add a URL and its Response object:
fetch("/page/1").then(function(response) {
    return caches.open("test-cache").then(function(cache) {
        return cache.put("/page/1", response);
    });
});

//
// Exploring Cache
//
// To view requests that have already been cached, you can use the individual
// cache's keys method to retrieve an array of cached Request objects:
caches.open("test-cache").then(function(cache) {
    cache.keys().then(function(cachedRequests) {
        console.log(cachedRequests); // [Request, Request]
    });
});

/*
Request {
  bodyUsed: false
  credentials: "omit"
  headers: Headers
  integrity: ""
  method: "GET"
  mode: "no-cors"
  redirect: "follow"
  referrer: ""
  url: "https://fullhost.tld/images/logo.png"
}
*/

// If you'd like to view the response of a cached Request, you can do so by
// using cache.match or cache.matchAll:
caches.open("test-cache").then(function(cache) {
    cache.match("/page/1").then(function(matchedResponse) {
        console.log(matchedResponse);
    });
});

/*
Response {
  body: (...),
  bodyUsed: false,
  headers: Headers,
  ok: true,
  status: 200,
  statusText: "OK",
  type: "basic",
  url: "https://davidwalsh.name/page/1"
}
*/

//
// Removing a Cached Request
//
// To remove a request from cache, use the cache's delete method:
caches.open("test-cache").then(function(cache) {
    cache.delete("/page/1"); // The cache will no longer contain /page/1!
});

//
// Getting Existing Cache Names
//
// To get the names of existing caches, use caches.keys:
caches.keys().then(function(cacheKeys) {
    console.log(cacheKeys); // ex: ["test-cache"]
    // `window.caches.keys()` again returns a promise (https://davidwalsh.name/tutorials/promises).
});

//
// Deleting A Cache
//
// Deleting a cache is simple once you have cache key name:
caches.delete("test-cache").then(function() {
    console.log("Cache successfully deleted!");
});

// You'll often delete a cache when you're replacing with a new one (to trigger
// re-installation of a new service worker):

// Assuming `CACHE_NAME` is the newest name
// Time to clean up the old!
var CACHE_NAME = "version-8";

// ...

caches.keys().then(function(cacheNames) {
    return Promise.all(
        cacheNames.map(function(cacheName) {
            if (cacheName != CACHE_NAME) {
                return caches.delete(cacheName);
            }
        })
    );
});

// You'll want to keep these snippets in your toolbox for when you look to
// become a service worker expert.  Chrome and Firefox now have service worker
// support so you'll be seeing many more sites/apps available (reliably) offline
// and loading at much faster rates.  Enjoy!