urbi-exhibitions
Version:
92 lines (85 loc) • 3.5 kB
JavaScript
function r(e) {
const s = (e == null ? void 0 : e.cacheName) ?? "map-cache", t = (e == null ? void 0 : e.requiredRequestUrl) ?? "2gis.com", n = (e == null ? void 0 : e.ttl) ?? 864e5;
return `
const CACHE_NAME = '${s}';
const REQUIRED_REQUEST_URL = '${t}';
const TTL = ${n};
function addTimestamp(response) {
if (!response) return response;
const clonedResponse = response.clone();
const newHeaders = new Headers(clonedResponse.headers);
newHeaders.set('x-sw-cache-timestamp', Date.now().toString());
if ([204, 205, 304].includes(clonedResponse.status)) {
return Promise.resolve(new Response(null, {
status: clonedResponse.status,
statusText: clonedResponse.statusText,
headers: newHeaders
}));
}
return clonedResponse.blob().then(blob =>
new Response(blob, {
status: clonedResponse.status,
statusText: clonedResponse.statusText,
headers: newHeaders,
})
);
}
self.addEventListener("install", (event) => {
console.log("[SW]: установлен");
});
self.addEventListener("activate", (event) => {
console.log("[SW]: активирован");
});
self.addEventListener("fetch", (event) => {
const requestUrl = event.request.url;
const isGetMethod = event.request.method === "GET";
if (requestUrl.includes(REQUIRED_REQUEST_URL) && isGetMethod) {
event.respondWith(
caches.open(CACHE_NAME).then((cache) => {
return cache.match(event.request).then((response) => {
if (response) {
const timestamp = response.headers.get('x-sw-cache-timestamp');
if (!timestamp || Date.now() - parseInt(timestamp, 10) <= TTL) {
console.log('[SW]: Используется кэш');
return response;
} else {
console.log("[SW]: Кэш просрочен");
}
}
return fetch(event.request)
.then((networkResponse) => {
addTimestamp(networkResponse).then((responseWithTimestamp) => {
// Кэшируем версию с timestamp
cache.put(event.request, responseWithTimestamp)
.catch((error) => {
console.error("[SW]: Не удалось закэшировать ответ запроса", error);
});
});
console.log('[SW]: Используется сеть');
return networkResponse;
})
.catch((error) => {
console.error("[SW]: Ответ не удалось найти в кэше и сфетчить из сети", error);
// Возвращаем пустой Response
return new Response('', {
status: 503,
statusText: 'Tile not available (offline, no cache)',
headers: { 'Content-Type': 'text/plain' }
});
});
})
}).catch((error) => {
return new Response('', {
status: 503,
statusText: 'Tile not available (cache error)',
headers: { 'Content-Type': 'text/plain' }
});
})
);
}
});
`.trim();
}
export {
r as g
};