From 6a6f42d179e76ca150746a0c14bec210d6139015 Mon Sep 17 00:00:00 2001 From: Dat Dang Date: Thu, 28 Nov 2024 17:49:12 +0700 Subject: [PATCH] Delegate cache control from Flutter to browser (#3289) (cherry picked from commit 9c3954a73803a0f1921926f86b9761156430dc2f) --- .../adr/0055-remove-flutter-service-worker.md | 28 +++++++++++++++ web/index.html | 36 ++++++++++++++----- 2 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 docs/adr/0055-remove-flutter-service-worker.md diff --git a/docs/adr/0055-remove-flutter-service-worker.md b/docs/adr/0055-remove-flutter-service-worker.md new file mode 100644 index 000000000..0a5276641 --- /dev/null +++ b/docs/adr/0055-remove-flutter-service-worker.md @@ -0,0 +1,28 @@ +# 55. Remove Flutter Service Worker + +Date: 2024-11-26 + +## Status + +Accepted + +## Context + +- Flutter Service Worker have many issues regarding updating cache resources + - https://github.com/flutter/flutter/issues/104509 + - https://github.com/flutter/flutter/issues/63500 +- Flutter is moving away from Flutter Service Worker + - https://github.com/flutter/flutter/issues/156910 + +## Decision + +- We remove the Flutter Service Worker and let the browser handle the cache by: + - Remove the Flutter Service Worker initialization + - Remove the existing Flutter Service Worker registration + +## Consequences + +- Twake Mail web now will validate cache with the server every time it is loaded + - If the status code is 200, new resources will be fetched + - If the status code is 304, old resources will be used +- All of the existing service workers will be removed, even if it is not Flutter Service Worker diff --git a/web/index.html b/web/index.html index 7fc5db253..8b28cd82c 100644 --- a/web/index.html +++ b/web/index.html @@ -104,15 +104,33 @@ loadLanguageResources().finally(initialTmailApp); - _flutter.loader.load({ - serviceWorkerSettings: { - serviceWorkerVersion: {{flutter_service_worker_version}}, - }, - onEntrypointLoaded: async function(engineInitializer) { - const appRunner = await engineInitializer.initializeEngine(); - await appRunner.runApp(); - } - }); + if ('serviceWorker' in navigator) { + navigator + .serviceWorker + .getRegistrations() + .then(async function(registrations) { + try { + await Promise.all(registrations.map(function(registration) { + return registration.unregister(); + })); + } catch (error) { + console.log('[Twake Mail] Error unregistering service worker: ', error); + } + _flutter.loader.load({ + onEntrypointLoaded: async function(engineInitializer) { + const appRunner = await engineInitializer.initializeEngine(); + await appRunner.runApp(); + } + }); + }); + } else { + _flutter.loader.load({ + onEntrypointLoaded: async function(engineInitializer) { + const appRunner = await engineInitializer.initializeEngine(); + await appRunner.runApp(); + } + }); + }