vers 1.1.6

- risolto problema cors ?!?
- notifiche transazioni pendenti OK
This commit is contained in:
Surya Paolo
2024-10-29 02:33:39 +01:00
parent baa4188746
commit b6f73019fe
82 changed files with 1771 additions and 294 deletions

View File

@@ -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);