entry.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import './web_push_notifications';
  2. function openSystemCache() {
  3. return caches.open('mastodon-system');
  4. }
  5. function openWebCache() {
  6. return caches.open('mastodon-web');
  7. }
  8. function fetchRoot() {
  9. return fetch('/', { credentials: 'include' });
  10. }
  11. // Cause a new version of a registered Service Worker to replace an existing one
  12. // that is already installed, and replace the currently active worker on open pages.
  13. self.addEventListener('install', function(event) {
  14. event.waitUntil(Promise.all([openWebCache(), fetchRoot()]).then(([cache, root]) => cache.put('/', root)));
  15. });
  16. self.addEventListener('activate', function(event) {
  17. event.waitUntil(self.clients.claim());
  18. });
  19. self.addEventListener('fetch', function(event) {
  20. const url = new URL(event.request.url);
  21. if (url.pathname.startsWith('/web/')) {
  22. const asyncResponse = fetchRoot();
  23. const asyncCache = openWebCache();
  24. event.respondWith(asyncResponse.then(async response => {
  25. if (response.ok) {
  26. const cache = await asyncCache;
  27. await cache.put('/', response);
  28. return response.clone();
  29. }
  30. throw null;
  31. }).catch(() => asyncCache.then(cache => cache.match('/'))));
  32. } else if (url.pathname === '/auth/sign_out') {
  33. const asyncResponse = fetch(event.request);
  34. const asyncCache = openWebCache();
  35. event.respondWith(asyncResponse.then(async response => {
  36. if (response.ok || response.type === 'opaqueredirect') {
  37. const cache = await asyncCache;
  38. await cache.delete('/');
  39. }
  40. return response;
  41. }));
  42. } else if (process.env.CDN_HOST ? url.host === process.env.CDN_HOST : url.pathname.startsWith('/system/')) {
  43. event.respondWith(openSystemCache().then(async cache => {
  44. const cached = await cache.match(event.request.url);
  45. if (cached === undefined) {
  46. const fetched = await fetch(event.request);
  47. if (fetched.ok) {
  48. await cache.put(event.request.url, fetched);
  49. }
  50. return fetched.clone();
  51. }
  52. return cached;
  53. }));
  54. }
  55. });