From 909ebae7c2e40508ee3d6b9f923dcb9a7a0a4689 Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 01:02:35 +0300 Subject: [PATCH] =?UTF-8?q?fix(pwa):=20=C3=B6nbellek=20v2=20=E2=80=94=20ya?= =?UTF-8?q?nl=C4=B1=C5=9F=20MIME=20ile=20saklanan=20pdf=20worker=20temizle?= =?UTF-8?q?nir,=20bozuk=20JS=20yan=C4=B1tlar=C4=B1=20art=C4=B1k=20=C3=B6nb?= =?UTF-8?q?elle=C4=9Fe=20al=C4=B1nmaz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nginx düzeltmesi tek başına yetmezdi: servis çalışanı /assets/ dosyalarını cache-first sakladığı için kullanıcıların tarayıcısındaki octet-stream'li worker kopyası redeploy sonrasında da kullanılmaya devam ederdi. Sürüm yükseltilince eski önbellek silinir; ayrıca .js/.mjs dosyaları yalnızca JavaScript MIME tipiyle ve 200 ile geldiğinde saklanır. Co-Authored-By: Claude Fable 5.1 --- public/sw.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/public/sw.js b/public/sw.js index 7d2092c..17e5f6a 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,6 +1,6 @@ /* İhaleist service worker — uygulama kabuğu çevrimdışı açılır, API her zaman ağdan. Sürüm değişince eski önbellek temizlenir (build her deploy'da yeni asset adı üretir). */ -const SURUM = 'ihaleist-v1'; +const SURUM = 'ihaleist-v2'; // v2: yanlış MIME ile saklanmış pdf worker kopyaları temizlensin const KABUK = ['/', '/manifest.webmanifest', '/icons/icon-192.png', '/icons/icon-512.png']; self.addEventListener('install', (e) => { @@ -17,7 +17,15 @@ self.addEventListener('fetch', (e) => { // Hash'li build varlıkları: cache-first (değişmez adlar) if (url.pathname.startsWith('/assets/')) { e.respondWith(caches.match(e.request).then((hit) => hit || fetch(e.request).then((r) => { - const kopya = r.clone(); caches.open(SURUM).then((c) => c.put(e.request, kopya)); return r; + // Yalnızca sağlıklı yanıt saklanır: 404 veya JavaScript dosyasının + // yanlış MIME tipiyle (octet-stream) gelmesi önbelleğe girerse + // sunucu düzeltilse bile kullanıcı eski bozuk kopyayı görmeye devam eder. + const tip = r.headers.get('content-type') || ''; + const jsMi = /\.m?js$/.test(url.pathname); + if (r.ok && (!jsMi || /javascript|ecmascript/i.test(tip))) { + const kopya = r.clone(); caches.open(SURUM).then((c) => c.put(e.request, kopya)); + } + return r; }))); return; }