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 0000000000..0a52766416 --- /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 7fc5db2536..8b28cd82ca 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(); + } + }); + }