sw.js.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaCore UNA Core
  7. * @{
  8. */
  9. define('BX_SERVICE_WORKER', true);
  10. require_once('./inc/header.inc.php');
  11. $aAssets = BxDolPreloader::getInstance()->getSystemAssets(BxDolTemplate::getInstance());
  12. header("Content-Type: text/javascript");
  13. ?>
  14. // Core assets
  15. let coreAssets = <?php echo json_encode($aAssets); ?>;
  16. // On install, cache core assets
  17. self.addEventListener('install', function (event) {
  18. // Cache core assets
  19. event.waitUntil(caches.open('app').then(function (cache) {
  20. for (let asset of coreAssets) {
  21. cache.add(new Request(asset));
  22. }
  23. return cache;
  24. }));
  25. });
  26. // Listen for request events
  27. self.addEventListener('fetch', function (event) {
  28. // Get the request
  29. let request = event.request;
  30. // Bug fix
  31. // https://stackoverflow.com/a/49719964
  32. if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') return;
  33. // HTML files
  34. // Network-first
  35. if (request.headers.get('Accept').includes('text/html')) {
  36. event.respondWith(
  37. fetch(request).then(function (response) {
  38. // Create a copy of the response and save it to the cache
  39. let copy = response.clone();
  40. event.waitUntil(caches.open('app').then(function (cache) {
  41. return cache.put(request, copy);
  42. }));
  43. // Return the response
  44. return response;
  45. }).catch(function (error) {
  46. // If there's no item in cache, respond with a fallback
  47. return caches.match(request).then(function (response) {
  48. return response || caches.match('/offline.html');
  49. });
  50. })
  51. );
  52. }
  53. // CSS & JavaScript
  54. // Offline-first
  55. if (request.headers.get('Accept').includes('text/css') || request.headers.get('Accept').includes('text/javascript')) {
  56. event.respondWith(
  57. caches.match(request).then(function (response) {
  58. return response || fetch(request).then(function (response) {
  59. // Return the response
  60. return response;
  61. });
  62. })
  63. );
  64. return;
  65. }
  66. // Images
  67. // Offline-first
  68. if (request.headers.get('Accept').includes('image')) {
  69. event.respondWith(
  70. caches.match(request).then(function (response) {
  71. return response || fetch(request).then(function (response) {
  72. // Save a copy of it in cache
  73. let copy = response.clone();
  74. event.waitUntil(caches.open('app').then(function (cache) {
  75. return cache.put(request, copy);
  76. }));
  77. // Return the response
  78. return response;
  79. });
  80. })
  81. );
  82. }
  83. });