vers 1.1.6
- risolto problema cors ?!? - notifiche transazioni pendenti OK
This commit is contained in:
@@ -34,13 +34,15 @@ self.addEventListener('activate', (event) => {
|
||||
});
|
||||
|
||||
|
||||
const APP_VERSION = "1.1.4";
|
||||
const APP_VERSION = "1.1.6";
|
||||
|
||||
console.log(' [ VER-' + APP_VERSION + ' ] _---------________------ PAO: this is my custom service worker');
|
||||
|
||||
importScripts('js/idb.js', 'js/storage.js');
|
||||
|
||||
let port = self.location.hostname.startsWith('test') ? 3001 : 3000;
|
||||
let ISTEST = self.location.hostname.startsWith('test');
|
||||
let ISLOCALE = self.location.hostname.startsWith('localhost');
|
||||
console.log('SW- app ver ' + APP_VERSION + ' on port ' + port);
|
||||
|
||||
|
||||
@@ -172,8 +174,169 @@ if (workbox) {
|
||||
console.log(event.data);
|
||||
});
|
||||
|
||||
// Costanti di configurazione
|
||||
const DYNAMIC_CACHE = 'dynamic-cache-v1';
|
||||
const ENABLE_DYNAMIC_CACHING = true;
|
||||
const baseUrl = self.location.origin;
|
||||
console.log('baseUrl', baseUrl);
|
||||
const APP_DOMAIN = extractDomain(baseUrl);
|
||||
let API_DOMAIN = '';
|
||||
if (ISTEST) {
|
||||
API_DOMAIN = 'testapi.' + removeTestPrefix(APP_DOMAIN);
|
||||
} else {
|
||||
API_DOMAIN = 'api.' + APP_DOMAIN;
|
||||
}
|
||||
|
||||
function removeTestPrefix(str) {
|
||||
return str.startsWith('test.') ? str.slice(5) : str;
|
||||
}
|
||||
|
||||
function extractDomain(url) {
|
||||
return url.replace(/^https?:\/\//, '');
|
||||
}
|
||||
|
||||
// Funzione per verificare se una richiesta è cross-origin
|
||||
function isCrossOrigin(url) {
|
||||
try {
|
||||
const requestUrl = new URL(url);
|
||||
const baseUrl = self.location.origin;
|
||||
return requestUrl.origin !== baseUrl;
|
||||
} catch (e) {
|
||||
console.error('Error parsing URL:', e);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Funzione per gestire specificamente le richieste API
|
||||
async function handleApiRequest(request) {
|
||||
const modifiedRequest = new Request(request.url, {
|
||||
method: request.method,
|
||||
headers: {
|
||||
...Object.fromEntries(request.headers.entries()),
|
||||
'Origin': `https://${APP_DOMAIN}`,
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
mode: 'cors',
|
||||
// credentials: 'include'
|
||||
});
|
||||
|
||||
try {
|
||||
const response = await fetch(modifiedRequest);
|
||||
|
||||
// Se la risposta è ok, restituiscila
|
||||
if (response.ok) {
|
||||
return response;
|
||||
}
|
||||
|
||||
// Se riceviamo un errore CORS, prova con una richiesta no-cors
|
||||
if (response.status === 0 || response.type === 'opaque') {
|
||||
console.log('[Service Worker] Fallback to no-cors mode for:', request.url);
|
||||
return fetch(new Request(request.url, {
|
||||
method: 'GET',
|
||||
mode: 'no-cors',
|
||||
// credentials: 'include'
|
||||
}));
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('[Service Worker] API request error:', error);
|
||||
return new Response(JSON.stringify({
|
||||
error: 'Network error',
|
||||
message: 'Unable to fetch from API'
|
||||
}), {
|
||||
status: 503,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': `https://${APP_DOMAIN}`,
|
||||
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Content-Type'
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Funzione principale per gestire il fetch
|
||||
async function handleFetch(request) {
|
||||
try {
|
||||
// Verifica se è una richiesta all'API
|
||||
const url = new URL(request.url);
|
||||
const isApiRequest = url.hostname === API_DOMAIN;
|
||||
|
||||
// Se è una richiesta API, gestiscila separatamente
|
||||
if (isApiRequest) {
|
||||
return handleApiRequest(request);
|
||||
}
|
||||
|
||||
// Per le altre richieste, prova prima la cache
|
||||
const cachedResponse = await caches.match(request);
|
||||
if (cachedResponse) {
|
||||
return cachedResponse;
|
||||
}
|
||||
|
||||
// Se non è in cache, fai la richiesta di rete
|
||||
const response = await fetch(request);
|
||||
|
||||
// Verifica la validità della risposta
|
||||
if (!response || (!response.ok && response.type !== 'opaque')) {
|
||||
console.warn('[Service Worker] Invalid response for:', request.url);
|
||||
return response;
|
||||
}
|
||||
|
||||
// Cache solo le risorse dello stesso origine
|
||||
if (ENABLE_DYNAMIC_CACHING && !isCrossOrigin(request.url)) {
|
||||
try {
|
||||
const cache = await caches.open(DYNAMIC_CACHE);
|
||||
cache.put(request, response.clone());
|
||||
} catch (cacheError) {
|
||||
console.error('[Service Worker] Cache error:', cacheError);
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('[Service Worker] Fetch error:', error);
|
||||
|
||||
// Personalizza la risposta di errore in base al tipo di richiesta
|
||||
if (request.headers.get('Accept')?.includes('application/json')) {
|
||||
return new Response(JSON.stringify({
|
||||
error: 'Network error',
|
||||
message: 'Service unavailable'
|
||||
}), {
|
||||
status: 503,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': `https://${APP_DOMAIN}`
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return new Response('Network error', {
|
||||
status: 503,
|
||||
statusText: 'Service Unavailable'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Event listener per il fetch
|
||||
self.addEventListener('fetch', event => {
|
||||
// Ignora le richieste non-GET
|
||||
// Gestione delle richieste OPTIONS per CORS
|
||||
if (event.request.method === 'OPTIONS') {
|
||||
event.respondWith(
|
||||
new Response(null, {
|
||||
status: 204,
|
||||
headers: {
|
||||
'Access-Control-Allow-Origin': `https://${APP_DOMAIN}`,
|
||||
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Content-Type',
|
||||
'Access-Control-Max-Age': '86400'
|
||||
}
|
||||
})
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// Ignora le richieste non-GET che non sono OPTIONS
|
||||
if (event.request.method !== 'GET') return;
|
||||
|
||||
// Gestisci il caso 'only-if-cached'
|
||||
@@ -184,35 +347,15 @@ if (workbox) {
|
||||
event.respondWith(handleFetch(event.request));
|
||||
});
|
||||
|
||||
async function handleFetch(request) {
|
||||
try {
|
||||
// Prova prima a ottenere dalla cache
|
||||
const cachedResponse = await caches.match(request);
|
||||
if (cachedResponse) {
|
||||
return cachedResponse;
|
||||
}
|
||||
|
||||
// Se non è in cache, fai la richiesta di rete
|
||||
const response = await fetch(request);
|
||||
|
||||
// Controlla se la risposta è valida
|
||||
if (!response || response.status !== 200 || response.type !== 'basic') {
|
||||
return response;
|
||||
}
|
||||
|
||||
// Salva in cache se il caching dinamico è abilitato
|
||||
if (ENABLE_DYNAMIC_CACHING) {
|
||||
const cache = await caches.open(DYNAMIC_CACHE);
|
||||
cache.put(request, response.clone());
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('[Service Worker] Fetch error:', error);
|
||||
return new Response('Network error', { status: 503, statusText: 'Service Unavailable' });
|
||||
}
|
||||
}
|
||||
// Gestione degli errori non catturati
|
||||
self.addEventListener('unhandledrejection', event => {
|
||||
console.error('[Service Worker] Unhandled rejection:', event.reason);
|
||||
});
|
||||
|
||||
// Gestione degli errori globali
|
||||
self.addEventListener('error', event => {
|
||||
console.error('[Service Worker] Global error:', event.error);
|
||||
});
|
||||
// Funzione di utilità per il logging (decommentare se necessario)
|
||||
// function logFetchDetails(request) {
|
||||
// console.log('[Service Worker] Fetching:', request.url);
|
||||
|
||||
Reference in New Issue
Block a user