|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const TARGET_URL_PREFIX = 'https://generativelanguage.googleapis.com'; |
|
|
|
|
|
|
|
|
self.addEventListener('install', (event) => { |
|
|
try { |
|
|
console.log('Service Worker: Installing...'); |
|
|
event.waitUntil(self.skipWaiting()); |
|
|
} catch (error) { |
|
|
console.error('Service Worker: Error during install event:', error); |
|
|
|
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
self.addEventListener('activate', (event) => { |
|
|
try { |
|
|
console.log('Service Worker: Activating...'); |
|
|
event.waitUntil(self.clients.claim()); |
|
|
} catch (error) { |
|
|
console.error('Service Worker: Error during activate event:', error); |
|
|
|
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
self.addEventListener('fetch', (event) => { |
|
|
try { |
|
|
const requestUrl = event.request.url; |
|
|
|
|
|
if (requestUrl.startsWith(TARGET_URL_PREFIX)) { |
|
|
console.log(`Service Worker: Intercepting request to ${requestUrl}`); |
|
|
|
|
|
const remainingPathAndQuery = requestUrl.substring(TARGET_URL_PREFIX.length); |
|
|
const proxyUrl = `${self.location.origin}/api-proxy${remainingPathAndQuery}`; |
|
|
|
|
|
console.log(`Service Worker: Proxying to ${proxyUrl}`); |
|
|
|
|
|
|
|
|
const newHeaders = new Headers(); |
|
|
|
|
|
|
|
|
|
|
|
const headersToCopy = [ |
|
|
'Content-Type', |
|
|
'Accept', |
|
|
'Access-Control-Request-Method', |
|
|
'Access-Control-Request-Headers', |
|
|
]; |
|
|
|
|
|
for (const headerName of headersToCopy) { |
|
|
if (event.request.headers.has(headerName)) { |
|
|
newHeaders.set(headerName, event.request.headers.get(headerName)); |
|
|
} |
|
|
} |
|
|
|
|
|
if (event.request.method === 'POST') { |
|
|
|
|
|
|
|
|
if (!newHeaders.has('Content-Type')) { |
|
|
console.warn("Service Worker: POST request to proxy was missing Content-Type in newHeaders. Defaulting to application/json."); |
|
|
newHeaders.set('Content-Type', 'application/json'); |
|
|
} else { |
|
|
console.log(`Service Worker: POST request to proxy has Content-Type: ${newHeaders.get('Content-Type')}`); |
|
|
} |
|
|
} |
|
|
|
|
|
const requestOptions = { |
|
|
method: event.request.method, |
|
|
headers: newHeaders, |
|
|
body: event.request.body, |
|
|
mode: event.request.mode, |
|
|
credentials: event.request.credentials, |
|
|
cache: event.request.cache, |
|
|
redirect: event.request.redirect, |
|
|
referrer: event.request.referrer, |
|
|
integrity: event.request.integrity, |
|
|
}; |
|
|
|
|
|
|
|
|
if (event.request.method !== 'GET' && event.request.method !== 'HEAD' && event.request.body ) { |
|
|
requestOptions.duplex = 'half'; |
|
|
} |
|
|
|
|
|
const promise = fetch(new Request(proxyUrl, requestOptions)) |
|
|
.then((response) => { |
|
|
console.log(`Service Worker: Successfully proxied request to ${proxyUrl}, Status: ${response.status}`); |
|
|
return response; |
|
|
}) |
|
|
.catch((error) => { |
|
|
|
|
|
console.error(`Service Worker: Error proxying request to ${proxyUrl}. Message: ${error.message}, Name: ${error.name}, Stack: ${error.stack}`); |
|
|
return new Response( |
|
|
JSON.stringify({ error: 'Proxying failed', details: error.message, name: error.name, proxiedUrl: proxyUrl }), |
|
|
{ |
|
|
status: 502, |
|
|
headers: { 'Content-Type': 'application/json' } |
|
|
} |
|
|
); |
|
|
}); |
|
|
|
|
|
event.respondWith(promise); |
|
|
|
|
|
} else { |
|
|
|
|
|
event.respondWith(fetch(event.request)); |
|
|
} |
|
|
} catch (error) { |
|
|
|
|
|
console.error('Service Worker: Unhandled error in fetch event handler. Message:', error.message, 'Name:', error.name, 'Stack:', error.stack); |
|
|
event.respondWith( |
|
|
new Response( |
|
|
JSON.stringify({ error: 'Service worker fetch handler failed', details: error.message, name: error.name }), |
|
|
{ |
|
|
status: 500, |
|
|
headers: { 'Content-Type': 'application/json' } |
|
|
} |
|
|
) |
|
|
); |
|
|
} |
|
|
}); |
|
|
|