'use strict';
const РЕДАКЦИЯ='4.8.0-wip';
const КЛЮЧ='война-ком-'+РЕДАКЦИЯ;
const ЯДРО=['./','./index.html','./404.html','./манифест.webmanifest','./ресурсы/стили/сайт.css?редакция=4.8.0','./ресурсы/стили/исполнение-хартии.css?редакция=4.8.0','./ресурсы/сценарии/сайт.js?редакция=4.8.0','./ресурсы/сценарии/фронт-4.js?редакция=4.8.0','./ресурсы/сценарии/доказательный-контур.js?редакция=4.8.0','./ресурсы/сценарии/доказательный-контур.js?редакция=4.8.0-wip','./ресурсы/сценарии/исполнитель-контура.js?редакция=4.8.0','./ресурсы/сценарии/поток-доказательного-контура.js?редакция=4.8.0-wip','./ресурсы/сценарии/методика.js?редакция=4.8.0','./ресурсы/изображения/знак.svg','./ресурсы/изображения/главный-герой.webp'];
const область=new URL(self.registration.scope);
const разрешено=url=>url.origin===область.origin&&url.pathname.startsWith(область.pathname)&&[...url.searchParams.keys()].every(k=>k==='редакция')&&(/\.(html|css|js|svg|png|webp|ico|webmanifest)$/.test(url.pathname)||url.pathname===область.pathname);
const сообщить=async(id,data)=>{try{const client=id?await self.clients.get(id):null;client?.postMessage(data);}catch{/* Доставка уведомления не подтверждена; сетевой ответ от неё не зависит. */}};
self.addEventListener('install',event=>event.waitUntil(caches.open(КЛЮЧ).then(cache=>cache.addAll(ЯДРО)).then(()=>self.skipWaiting())));
self.addEventListener('activate',event=>event.waitUntil(caches.keys().then(keys=>Promise.all(keys.filter(k=>k.startsWith('война-ком-')&&k!==КЛЮЧ).map(k=>caches.delete(k)))).then(()=>self.clients.claim())));
self.addEventListener('fetch',event=>{
 const request=event.request,url=new URL(request.url);
 if(request.method!=='GET'||!разрешено(url)||request.cache==='no-store')return;
 event.respondWith((async()=>{
  let cache=null;
  try{cache=await caches.open(КЛЮЧ);}catch{await сообщить(event.clientId,{вид:'ошибка-сохранения-копии',редакция:РЕДАКЦИЯ,этап:'открытие'});}
  try{
   const response=await fetch(request);
   if(cache&&response.ok&&response.type==='basic'&&!/no-store/i.test(response.headers.get('Cache-Control')||'')){
    try{await cache.put(request,response.clone());}catch{await сообщить(event.clientId,{вид:'ошибка-сохранения-копии',редакция:РЕДАКЦИЯ,этап:'запись'});}
   }
   // Отказ Cache Storage не превращает полученный сетевой ответ в ошибку или старую копию.
   return response;
  }catch{
   let saved=null;
   if(cache){try{saved=await cache.match(request);}catch{await сообщить(event.clientId,{вид:'ошибка-сохранения-копии',редакция:РЕДАКЦИЯ,этап:'чтение'});}}
   if(saved){await сообщить(event.clientId,{вид:'сохранённая-копия',редакция:РЕДАКЦИЯ});return saved;}
   // Никогда не выдавать HTML вместо отсутствующего JSON или сценария.
   return new Response('Сетевая выдача недоступна; сохранённой копии этого адреса нет.',{status:503,headers:{'Content-Type':'text/plain; charset=utf-8','Cache-Control':'no-store'}});
  }
 })());
});
