function uint8ArrayToHex(arr) {return Array.prototype.map.call(arr, (x) => (('0' + x.toString(16)).slice(-2))).join('');}// sha256 署名ダイジェストasync function sha256(message) {const msgBuffer = new TextEncoder().encode(message);const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);return uint8ArrayToHex(new Uint8Array(hashBuffer));}async function fetchContent(event, cacheKey) {const cache = caches.default;// キャッシュがヒットしなかったため、オリジンにアクセスしてキャッシュを使用します。const response = await fetch(event.request);// レスポンスヘッダーにCache-Controlを追加し、キャッシュ時間を設定します。response.headers.set('Cache-Control', 's-maxage=10');event.waitUntil(cache.put(cacheKey, response.clone()));// キャッシュがヒットしなかったため、レスポンスヘッダーに識別子を設定します。response.headers.append('x-edgefunctions-cache', 'miss');return response;}async function handleRequest(event) {const request = event.request;const body = await request.clone().text();// // request bodyに基づいてハッシュを計算します。const hash = await sha256(body);// request bodyから計算したハッシュ値をcacheKeyの一部として使用します。const cacheKey = `${request.url}${hash}`;const cache = caches.default;try {// 関連するキャッシュResponseを取得します。let response = await cache.match(cacheKey);if (!response) {return fetchContent(event, cacheKey);}// キャッシュにヒットしたため、レスポンスヘッダーに識別子を設定します。response.headers.append('x-edgefunctions-cache', 'hit');return response;} catch (error) {await cache.delete(cacheKey);// キャッシュが期限切れまたは存在しないため、リモートリソースを再取得します。return fetchContent(event, cacheKey);}return response;}addEventListener('fetch', (event) => {try {const request = event.request;// POSTリクエストを処理します。if (request.method.toUpperCase() === 'POST') {return event.respondWith(handleRequest(event));}// post以外のリクエストです。return event.respondWith(fetch(request));} catch (e) {return event.respondWith(new Response('Error thrown ' + e.message));}});


フィードバック