const CACHE_NAME = 'shatat-games-v2'; // 🔥 تم تغيير الإصدار لفرض تحديث الكاش القديم const OFFLINE_URL = 'index.html'; // تأكد من وجود هذه الملفات في الجذر، أو احذف ما ليس موجوداً const FILES_TO_CACHE = [ '/', '/index.html', '/manifest.json', '/icon.png', 'https://unpkg.com/mqtt/dist/mqtt.min.js', 'https://fonts.googleapis.com/css2?family=Cairo:wght@400;600;700;800;900&display=swap' ]; // ============================================= // ✅ التثبيت - مع تخزين مسبق // ============================================= self.addEventListener('install', event => { console.log('[Service Worker] 📦 التثبيت...'); event.waitUntil( caches.open(CACHE_NAME) .then(cache => { console.log('[Service Worker] 💾 تخزين الملفات مسبقاً'); return cache.addAll(FILES_TO_CACHE).catch(err => { console.warn('[Service Worker] ⚠️ فشل تحميل بعض الملفات:', err); }); }) .then(() => { console.log('[Service Worker] ✅ التثبيت اكتمل، تخطي الانتظار...'); return self.skipWaiting(); // 🔥 فرض تفعيل الـ SW الجديد فوراً }) ); }); // ============================================= // ✅ التفعيل - حذف الكاش القديم // ============================================= self.addEventListener('activate', event => { console.log('[Service Worker] 🚀 التفعيل...'); event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cacheName => { if (cacheName !== CACHE_NAME) { console.log('[Service Worker] 🗑️ حذف الكاش القديم:', cacheName); return caches.delete(cacheName); } }) ); }) .then(() => { console.log('[Service Worker] ✅ التفعيل اكتمل، السيطرة على جميع الصفحات...'); return self.clients.claim(); // 🔥 السيطرة على الصفحات المفتوحة فوراً }) ); }); // ============================================= // ✅ استراتيجية Fetch محسّنة مع تحديث تلقائي // ============================================= self.addEventListener('fetch', event => { // تجاهل طلبات الإضافات (للتأمين) const requestURL = new URL(event.request.url); if (requestURL.protocol === 'chrome-extension:' || requestURL.protocol === 'moz-extension:') { return; } event.respondWith( caches.match(event.request) .then(cachedResponse => { // 🔥 استراتيجية: Cache First + تحديث في الخلفية if (cachedResponse) { // 🔥 تحديث الكاش في الخلفية (Network First في الخلفية) fetch(event.request) .then(networkResponse => { if (networkResponse && networkResponse.status === 200) { caches.open(CACHE_NAME).then(cache => { cache.put(event.request, networkResponse.clone()); console.log('[Service Worker] 🔄 تحديث الكاش:', event.request.url); }); } }) .catch(() => {}); return cachedResponse; // أرجاع النسخة المخزنة فوراً للسرعة } // إذا لم يكن في الكاش، حاول تجلبه من الشبكة return fetch(event.request) .then(networkResponse => { if (networkResponse && networkResponse.status === 200) { const responseToCache = networkResponse.clone(); caches.open(CACHE_NAME).then(cache => { cache.put(event.request, responseToCache); console.log('[Service Worker] 💾 تخزين جديد:', event.request.url); }); } return networkResponse; }) .catch(() => { // 🛑 الحل النهائي: إذا فشلت الشبكة وليس في الكاش، أعد الصفحة الرئيسية المخزنة مسبقاً console.warn('[Service Worker] ⚠️ فشل الشبكة، إرجاع الصفحة الرئيسية المخزنة'); return caches.match('/index.html'); }); }) ); }); // ============================================= // ✅ رسالة للمستخدم عند تحديث الصفحة تلقائياً // ============================================= self.addEventListener('message', event => { if (event.data && event.data.type === 'SKIP_WAITING') { console.log('[Service Worker] ⏭️ تخطي الانتظار بناءً على طلب الصفحة'); self.skipWaiting(); } });