From 3b1459cca491199acfc5e5ddd1c7f1ace2b185e4 Mon Sep 17 00:00:00 2001 From: Vasilii Mikhailovskii Date: Sun, 15 Dec 2024 10:53:47 +0200 Subject: [PATCH] try to fix infinity preload --- apps/frontend/public/preloader.html | 11 ++++++++++- apps/frontend/public/service-worker.js | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/preloader.html b/apps/frontend/public/preloader.html index fdb2d45..6acf526 100644 --- a/apps/frontend/public/preloader.html +++ b/apps/frontend/public/preloader.html @@ -60,13 +60,21 @@ } if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/service-worker.js') + const registrationPromise = navigator.serviceWorker.register('/service-worker.js') + + registrationPromise.then(() => { + navigator.serviceWorker.controller.postMessage({ type: 'CHECK_MAIN_PAGE_READY' }) + }) navigator.serviceWorker.onmessage = (event) => { console.log('onmessage', event.data && event.data.type); if (event.data && event.data.type === 'MAIN_PAGE_READY') { + console.log('RELOAD!!!') location.reload(); } + if (event.data && event.data.type === 'MAIN_PAGE_IS_NOT_READY') { + console.log('MAIN_PAGE_IS_NOT_READY'); + } if (event.data && event.data.type === 'NETWORK_ERROR') { showOfflineMessage(); @@ -85,6 +93,7 @@ // Обрабатываем ответ от сервис-воркера messageChannel.port1.onmessage = (event) => { resolve(event.data.online); + console.log('resolve event.data.online', event.data.online); }; // Посылаем сообщение в сервис-воркер diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index e1bd72c..bd24b7c 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -43,6 +43,15 @@ const TEMP_CACHE = new Map() // Используем карту для врем async function handleNavigationRequest(request) { if (TEMP_CACHE.has(request.url) && navigator.onLine) { + console.log('notifying clients about MAIN_PAGE_READY in cache') + clients.matchAll({ type: 'window' }).then((allClients) => { + allClients.forEach((client) => + client.postMessage({ + type: 'MAIN_PAGE_READY', + }), + ) + }) + return TEMP_CACHE.get(request.url).clone() } @@ -59,6 +68,7 @@ async function handleNavigationRequest(request) { TEMP_CACHE.set(request.url, networkResponse) // Сообщаем клиенту, что основная страница готова + console.log('notifying clients about MAIN_PAGE_READY after fetch') const allClients = await clients.matchAll({ type: 'window' }) allClients.forEach((client) => client.postMessage({ @@ -114,6 +124,13 @@ async function updateStaticAssetsCache() { self.addEventListener('message', async (event) => { if (event.data && event.data.type === 'SKIP_WAITING') { self.skipWaiting() + } else if (event.data && event.data.type === 'CHECK_MAIN_PAGE_READY') { + console.log('CHECK_MAIN_PAGE_READY:', TEMP_CACHE.size ? 'ready' : 'not ready') + if (TEMP_CACHE.size === 0) { + event.source.postMessage({ type: 'MAIN_PAGE_IS_NOT_READY' }) + } else { + event.source.postMessage({ type: 'MAIN_PAGE_READY' }) + } } else if (event.data && event.data.type === 'CHECK_ONLINE_STATUS') { const isOnline = navigator.onLine // Проверяем состояние сети event.ports[0].postMessage({ online: isOnline }) // Отправляем результат обратно