diff --git a/changelog.md b/changelog.md index 28d267e..4425d9a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2025-02-03 - 3.0.59 - fix(serviceworker) +Fixed CORS and Cache Control handling for Service Worker + +- Improved handling of CORS settings for external requests. +- Preserved important headers while excluding caching headers. +- Ensured the presence of CORS headers in cached responses. +- Adjusted Cache-Control headers to prevent browser caching but allow service worker caching. + ## 2025-02-03 - 3.0.58 - fix(network-manager) Refined network management logic for better offline handling. diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index f33dfa8..cb50290 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@api.global/typedserver', - version: '3.0.58', + version: '3.0.59', description: 'A TypeScript-based project for easy serving of static files with support for live reloading, compression, and typed requests.' } diff --git a/ts_web_serviceworker/classes.cachemanager.ts b/ts_web_serviceworker/classes.cachemanager.ts index dfd87c4..d6deab4 100644 --- a/ts_web_serviceworker/classes.cachemanager.ts +++ b/ts_web_serviceworker/classes.cachemanager.ts @@ -23,9 +23,13 @@ export class CacheManager { // internal request matchRequest = requestArg; } else { + // For external requests, create a new request with appropriate CORS settings matchRequest = new Request(requestArg.url, { - ...requestArg.clone(), - mode: 'cors' + method: requestArg.method, + headers: requestArg.headers, + mode: 'cors', + credentials: 'same-origin', + redirect: 'follow' }); } return matchRequest; @@ -137,17 +141,29 @@ export class CacheManager { const responseToPutToCache = newResponse.clone(); const headers = new Headers(); responseToPutToCache.headers.forEach((value, key) => { - if ( - value !== 'Cache-Control' - && value !== 'cache-control' - && value !== 'Expires' - && value !== 'expires' - && value !== 'Pragma' - && value !== 'pragma' - ) { + // Preserve all headers except caching headers + if (![ + 'Cache-Control', + 'cache-control', + 'Expires', + 'expires', + 'Pragma', + 'pragma' + ].includes(key)) { headers.set(key, value); } }); + + // Ensure CORS headers are present in cached response + if (!headers.has('Access-Control-Allow-Origin')) { + headers.set('Access-Control-Allow-Origin', '*'); + } + if (!headers.has('Access-Control-Allow-Methods')) { + headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + } + if (!headers.has('Access-Control-Allow-Headers')) { + headers.set('Access-Control-Allow-Headers', 'Content-Type'); + } // Prevent browser caching while allowing service worker caching headers.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate'); headers.set('Pragma', 'no-cache');