sw.js.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. $oTemplate = BxDolTemplate::getInstance();
  12. $aAssets = [];
  13. foreach(['css' , 'js'] as $sType) {
  14. $aFiles = $oTemplate->includeFiles($sType, true, false);
  15. if(!is_array($aFiles))
  16. $aFiles = [$aFiles];
  17. $aAssets = array_merge($aAssets, $aFiles);
  18. }
  19. foreach($aAssets as $iKey => $sAsset)
  20. $aAssets[$iKey] = str_replace(BX_DOL_URL_ROOT, '/', $sAsset);
  21. header("Content-Type: text/javascript");
  22. ?>
  23. // Core assets
  24. let coreAssets = <?php echo json_encode($aAssets); ?>;
  25. // On install, cache core assets
  26. self.addEventListener('install', function (event) {
  27. // Cache core assets
  28. event.waitUntil(caches.open('app').then(function (cache) {
  29. for (let asset of coreAssets) {
  30. cache.add(new Request(asset));
  31. }
  32. return cache;
  33. }));
  34. });
  35. // Listen for request events
  36. self.addEventListener('fetch', function (event) {
  37. // Get the request
  38. let request = event.request;
  39. // Bug fix
  40. // https://stackoverflow.com/a/49719964
  41. if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') return;
  42. // HTML files
  43. // Network-first
  44. if (request.headers.get('Accept').includes('text/html')) {
  45. event.respondWith(
  46. fetch(request).then(function (response) {
  47. // Create a copy of the response and save it to the cache
  48. let copy = response.clone();
  49. event.waitUntil(caches.open('app').then(function (cache) {
  50. return cache.put(request, copy);
  51. }));
  52. // Return the response
  53. return response;
  54. }).catch(function (error) {
  55. // If there's no item in cache, respond with a fallback
  56. return caches.match(request).then(function (response) {
  57. return response || caches.match('/offline.html');
  58. });
  59. })
  60. );
  61. }
  62. // CSS & JavaScript
  63. // Offline-first
  64. if (request.headers.get('Accept').includes('text/css') || request.headers.get('Accept').includes('text/javascript')) {
  65. event.respondWith(
  66. caches.match(request).then(function (response) {
  67. return response || fetch(request).then(function (response) {
  68. // Return the response
  69. return response;
  70. });
  71. })
  72. );
  73. return;
  74. }
  75. // Images
  76. // Offline-first
  77. if (request.headers.get('Accept').includes('image')) {
  78. event.respondWith(
  79. caches.match(request).then(function (response) {
  80. return response || fetch(request).then(function (response) {
  81. // Save a copy of it in cache
  82. let copy = response.clone();
  83. event.waitUntil(caches.open('app').then(function (cache) {
  84. return cache.put(request, copy);
  85. }));
  86. // Return the response
  87. return response;
  88. });
  89. })
  90. );
  91. }
  92. });