Cache POST requests
Cache POST requests using the Cache API.
async function sha256(message) {  // encode as UTF-8  const msgBuffer = new TextEncoder().encode(message);
  // hash the message  const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
  // convert bytes to hex string  return [...new Uint8Array(hashBuffer)].map(b => b.toString(16).padStart(2, '0')).join('');
}
async function handlePostRequest(event) {  const request = event.request;  const body = await request.clone().text();
  // Hash the request body to use it as a part of the cache key  const hash = await sha256(body);  const cacheUrl = new URL(request.url);
  // Store the URL in cache by prepending the body's hash  cacheUrl.pathname = '/posts' + cacheUrl.pathname + hash;
  // Convert to a GET to be able to cache  const cacheKey = new Request(cacheUrl.toString(), {    headers: request.headers,    method: 'GET',  });
  const cache = caches.default;
  // Find the cache key in the cache  let response = await cache.match(cacheKey);
  // Otherwise, fetch response to POST request from origin  if (!response) {    response = await fetch(request);    event.waitUntil(cache.put(cacheKey, response.clone()));  }  return response;
}
addEventListener('fetch', event => {  try {    const request = event.request;    if (request.method.toUpperCase() === 'POST') return event.respondWith(handlePostRequest(event));    return event.respondWith(fetch(request));  } catch (e) {    return event.respondWith(new Response('Error thrown ' + e.message));  }
});