@swoff/cli 0.3.13 → 0.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +28 -32
  2. package/dist/index.js +2 -13
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/cli/help.js +3 -8
  5. package/dist/lib/cli/help.js.map +1 -1
  6. package/dist/lib/commands/add.js +29 -87
  7. package/dist/lib/commands/add.js.map +1 -1
  8. package/dist/lib/commands/generate-guide.js +16 -30
  9. package/dist/lib/commands/generate-guide.js.map +1 -1
  10. package/dist/lib/commands/generate.js +31 -6
  11. package/dist/lib/commands/generate.js.map +1 -1
  12. package/dist/lib/commands/init.js +188 -11
  13. package/dist/lib/commands/init.js.map +1 -1
  14. package/dist/lib/commands/validate.js +2 -4
  15. package/dist/lib/commands/validate.js.map +1 -1
  16. package/dist/lib/config/loader.js +34 -25
  17. package/dist/lib/config/loader.js.map +1 -1
  18. package/dist/lib/config/validator.js +202 -96
  19. package/dist/lib/config/validator.js.map +1 -1
  20. package/dist/lib/generators/file-generators/api-config.js +1 -1
  21. package/dist/lib/generators/file-generators/api-config.js.map +1 -1
  22. package/dist/lib/generators/file-generators/auth-adapter.js +13 -0
  23. package/dist/lib/generators/file-generators/auth-adapter.js.map +1 -0
  24. package/dist/lib/generators/file-generators/auth-check.js +40 -0
  25. package/dist/lib/generators/file-generators/auth-check.js.map +1 -0
  26. package/dist/lib/generators/file-generators/auth-store.js +2 -5
  27. package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
  28. package/dist/lib/generators/file-generators/background-sync.js +1 -1
  29. package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
  30. package/dist/lib/generators/file-generators/cache.js +2 -1
  31. package/dist/lib/generators/file-generators/cache.js.map +1 -1
  32. package/dist/lib/generators/file-generators/client-injector-bundle.js +15 -0
  33. package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -0
  34. package/dist/lib/generators/file-generators/client-injector.js +2 -1
  35. package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
  36. package/dist/lib/generators/file-generators/connectivity-manager.js +12 -0
  37. package/dist/lib/generators/file-generators/connectivity-manager.js.map +1 -0
  38. package/dist/lib/generators/file-generators/connectivity.js +12 -0
  39. package/dist/lib/generators/file-generators/connectivity.js.map +1 -0
  40. package/dist/lib/generators/file-generators/context.js +7 -0
  41. package/dist/lib/generators/file-generators/context.js.map +1 -1
  42. package/dist/lib/generators/file-generators/fetch-wrapper.js +1 -1
  43. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
  44. package/dist/lib/generators/file-generators/generate-framework-adapters.js +29 -20
  45. package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
  46. package/dist/lib/generators/file-generators/gql-wrapper.js +2 -2
  47. package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
  48. package/dist/lib/generators/file-generators/guide-generator.js +51 -1
  49. package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
  50. package/dist/lib/generators/file-generators/invalidation-tags.js +2 -3
  51. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
  52. package/dist/lib/generators/file-generators/mutation-queue.js +2 -2
  53. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
  54. package/dist/lib/generators/file-generators/mutation-state.js +1 -1
  55. package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
  56. package/dist/lib/generators/file-generators/notification-generator.js +6 -0
  57. package/dist/lib/generators/file-generators/notification-generator.js.map +1 -0
  58. package/dist/lib/generators/file-generators/open-db.js +6 -0
  59. package/dist/lib/generators/file-generators/open-db.js.map +1 -0
  60. package/dist/lib/generators/file-generators/push.js +1 -2
  61. package/dist/lib/generators/file-generators/push.js.map +1 -1
  62. package/dist/lib/generators/file-generators/pwa-install.js +2 -6
  63. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
  64. package/dist/lib/generators/file-generators/server-push.js +1 -1
  65. package/dist/lib/generators/file-generators/server-push.js.map +1 -1
  66. package/dist/lib/generators/file-generators/storage-generator.js +6 -0
  67. package/dist/lib/generators/file-generators/storage-generator.js.map +1 -0
  68. package/dist/lib/generators/file-generators/storage-notify.js +6 -0
  69. package/dist/lib/generators/file-generators/storage-notify.js.map +1 -0
  70. package/dist/lib/generators/file-generators/storage.js +6 -0
  71. package/dist/lib/generators/file-generators/storage.js.map +1 -0
  72. package/dist/lib/generators/file-generators/sw-generator-build.js +96 -45
  73. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
  74. package/dist/lib/generators/file-generators/sw-injector.js +0 -4
  75. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  76. package/dist/lib/generators/file-generators/sw-template.js +8 -9
  77. package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
  78. package/dist/lib/generators/file-generators/sw-version-gen.js +32 -0
  79. package/dist/lib/generators/file-generators/sw-version-gen.js.map +1 -0
  80. package/dist/lib/generators/file-generators/swoff-api-bundle.js +51 -0
  81. package/dist/lib/generators/file-generators/swoff-api-bundle.js.map +1 -0
  82. package/dist/lib/generators/sw-build-utils.js +69 -0
  83. package/dist/lib/generators/sw-build-utils.js.map +1 -0
  84. package/dist/lib/generators/sw-generator.js +23 -34
  85. package/dist/lib/generators/sw-generator.js.map +1 -1
  86. package/dist/lib/generators/sw-sections/activate-handler.js +74 -23
  87. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
  88. package/dist/lib/generators/sw-sections/assemble-sw.js +15 -94
  89. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  90. package/dist/lib/generators/sw-sections/background-sync-handler.js +74 -72
  91. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
  92. package/dist/lib/generators/sw-sections/batch-refresh-queue.js +102 -0
  93. package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -0
  94. package/dist/lib/generators/sw-sections/config-header.js +2 -3
  95. package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
  96. package/dist/lib/generators/sw-sections/default-template.js +59 -6
  97. package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
  98. package/dist/lib/generators/sw-sections/fetch-handler.js +621 -495
  99. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
  100. package/dist/lib/generators/sw-sections/install-handler.js +40 -23
  101. package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
  102. package/dist/lib/generators/sw-sections/message-handler.js +25 -8
  103. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
  104. package/dist/lib/generators/sw-sections/server-push-handler.js +10 -14
  105. package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
  106. package/dist/lib/generators/sw-sections/shared.js +68 -0
  107. package/dist/lib/generators/sw-sections/shared.js.map +1 -0
  108. package/dist/lib/generators/sw-sections/sw-push.js +2 -6
  109. package/dist/lib/generators/sw-sections/sw-push.js.map +1 -1
  110. package/dist/lib/generators/sw-sections/tag-management.js +55 -86
  111. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
  112. package/dist/lib/generators/swoff-files-generator.js +183 -59
  113. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  114. package/dist/lib/shared/config-types.js +67 -63
  115. package/dist/lib/shared/config-types.js.map +1 -1
  116. package/dist/lib/shared/feature-registry.js +198 -0
  117. package/dist/lib/shared/feature-registry.js.map +1 -0
  118. package/dist/lib/utils/detect-framework.js +52 -9
  119. package/dist/lib/utils/detect-framework.js.map +1 -1
  120. package/dist/runtime/api-config.js +2 -2
  121. package/dist/runtime/api-config.js.map +1 -1
  122. package/dist/runtime/auth-adapter.js +179 -0
  123. package/dist/runtime/auth-adapter.js.map +1 -0
  124. package/dist/runtime/auth-state.js +16 -6
  125. package/dist/runtime/auth-state.js.map +1 -1
  126. package/dist/runtime/auth-store.js +219 -213
  127. package/dist/runtime/auth-store.js.map +1 -1
  128. package/dist/runtime/auth-user.js +5 -19
  129. package/dist/runtime/auth-user.js.map +1 -1
  130. package/dist/runtime/background-sync.js +5 -2
  131. package/dist/runtime/background-sync.js.map +1 -1
  132. package/dist/runtime/cache.js +91 -3
  133. package/dist/runtime/cache.js.map +1 -1
  134. package/dist/runtime/client-injector-bundle.js +314 -0
  135. package/dist/runtime/client-injector-bundle.js.map +1 -0
  136. package/dist/runtime/client-injector.js +173 -30
  137. package/dist/runtime/client-injector.js.map +1 -1
  138. package/dist/runtime/connectivity-manager.js +83 -0
  139. package/dist/runtime/connectivity-manager.js.map +1 -0
  140. package/dist/runtime/connectivity.js +83 -0
  141. package/dist/runtime/connectivity.js.map +1 -0
  142. package/dist/runtime/fetch-wrapper.js +26 -59
  143. package/dist/runtime/fetch-wrapper.js.map +1 -1
  144. package/dist/runtime/gql-wrapper.js +15 -9
  145. package/dist/runtime/gql-wrapper.js.map +1 -1
  146. package/dist/runtime/invalidation-tags.js +12 -89
  147. package/dist/runtime/invalidation-tags.js.map +1 -1
  148. package/dist/runtime/mutation-queue.js +83 -31
  149. package/dist/runtime/mutation-queue.js.map +1 -1
  150. package/dist/runtime/mutation-state.js +3 -3
  151. package/dist/runtime/mutation-state.js.map +1 -1
  152. package/dist/runtime/notification.js +65 -0
  153. package/dist/runtime/notification.js.map +1 -0
  154. package/dist/runtime/open-db.js +41 -0
  155. package/dist/runtime/open-db.js.map +1 -0
  156. package/dist/runtime/push.js +15 -27
  157. package/dist/runtime/push.js.map +1 -1
  158. package/dist/runtime/pwa-injector.js +3 -32
  159. package/dist/runtime/pwa-injector.js.map +1 -1
  160. package/dist/runtime/pwa-prompt.js +35 -3
  161. package/dist/runtime/pwa-prompt.js.map +1 -1
  162. package/dist/runtime/reset.js +39 -42
  163. package/dist/runtime/reset.js.map +1 -1
  164. package/dist/runtime/server-push.js +23 -13
  165. package/dist/runtime/server-push.js.map +1 -1
  166. package/dist/runtime/storage.js +32 -0
  167. package/dist/runtime/storage.js.map +1 -0
  168. package/dist/runtime/sw-injector.js +19 -178
  169. package/dist/runtime/sw-injector.js.map +1 -1
  170. package/dist/runtime/sw-version.js +13 -0
  171. package/dist/runtime/sw-version.js.map +1 -0
  172. package/dist/runtime/swoff-api-bundle.js +1491 -0
  173. package/dist/runtime/swoff-api-bundle.js.map +1 -0
  174. package/dist/runtime/type-definitions.js +8 -7
  175. package/dist/runtime/type-definitions.js.map +1 -1
  176. package/dist/runtime/utils.js +4 -0
  177. package/dist/runtime/utils.js.map +1 -1
  178. package/dist/swoff-nkdhhmw8. +18 -0
  179. package/dist/swoff.js +5 -0
  180. package/package.json +1 -1
  181. package/templates/react/useAuth.jsx +7 -4
  182. package/templates/react/useAuth.tsx +14 -14
  183. package/templates/react/useBackgroundSync.jsx +5 -4
  184. package/templates/react/useBackgroundSync.tsx +5 -4
  185. package/templates/react/useCachedFetch.jsx +8 -0
  186. package/templates/react/useCachedFetch.tsx +8 -0
  187. package/templates/react/useMutation.jsx +60 -56
  188. package/templates/react/useMutation.tsx +65 -64
  189. package/templates/react/useMutationQueue.jsx +5 -1
  190. package/templates/react/useMutationQueue.tsx +8 -2
  191. package/templates/react/useMutationState.jsx +3 -4
  192. package/templates/react/useMutationState.tsx +4 -8
  193. package/templates/react/useNetworkStatus.jsx +57 -17
  194. package/templates/react/useNetworkStatus.tsx +42 -20
  195. package/templates/react/useOfflineAnalytics.jsx +42 -0
  196. package/templates/react/useOfflineAnalytics.tsx +50 -0
  197. package/templates/react/usePwaInstall.jsx +26 -0
  198. package/templates/react/usePwaInstall.tsx +26 -0
  199. package/templates/react/useSWUpdate.jsx +7 -52
  200. package/templates/react/useSWUpdate.tsx +12 -51
  201. package/templates/react/useStorageEstimate.jsx +56 -0
  202. package/templates/react/useStorageEstimate.tsx +67 -0
  203. package/dist/__tests__/assemble-sw.test.js +0 -145
  204. package/dist/__tests__/assemble-sw.test.js.map +0 -1
  205. package/dist/__tests__/cli-integration.test.js +0 -231
  206. package/dist/__tests__/cli-integration.test.js.map +0 -1
  207. package/dist/__tests__/config-types.test.js +0 -124
  208. package/dist/__tests__/config-types.test.js.map +0 -1
  209. package/dist/__tests__/detect-language.test.js +0 -51
  210. package/dist/__tests__/detect-language.test.js.map +0 -1
  211. package/dist/__tests__/file-generators.test.js +0 -228
  212. package/dist/__tests__/file-generators.test.js.map +0 -1
  213. package/dist/__tests__/glob-matcher.test.js +0 -86
  214. package/dist/__tests__/glob-matcher.test.js.map +0 -1
  215. package/dist/__tests__/invalidation-tags.test.js +0 -283
  216. package/dist/__tests__/invalidation-tags.test.js.map +0 -1
  217. package/dist/__tests__/loader.test.js +0 -77
  218. package/dist/__tests__/loader.test.js.map +0 -1
  219. package/dist/__tests__/validator.test.js +0 -340
  220. package/dist/__tests__/validator.test.js.map +0 -1
  221. package/templates/react/useCacheInvalidation.jsx +0 -19
  222. package/templates/react/useCacheInvalidation.tsx +0 -52
  223. package/templates/react/useIsFetching.jsx +0 -32
  224. package/templates/react/useIsFetching.tsx +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/fetch-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/fetch-handler.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,51 @@
1
1
  /**
2
2
  * Generates the SW install event handler (asset pre-caching with progress).
3
+ * Also exports a reusable precacheAssets() function used by both install and
4
+ * the RESET_CACHE message handler.
3
5
  */
4
6
  export function generateInstallHandler() {
5
7
  return `
8
+ async function precacheAssets() {
9
+ const cache = await caches.open("precache");
10
+ // Clear stale entries from previous builds before repopulating
11
+ const stale = await cache.keys();
12
+ await Promise.all(stale.map(function(req) { return cache.delete(req); }));
13
+ let downloaded = 0;
14
+ let attempted = 0;
15
+ const allClients = await self.clients.matchAll({ includeUncontrolled: true });
16
+ for (const asset of ASSETS_TO_CACHE) {
17
+ attempted++;
18
+ try {
19
+ const request = new Request(asset.url, asset.options);
20
+ await cache.add(request);
21
+ downloaded++;
22
+ } catch (err) {
23
+ console.error(\`Failed to cache \${asset.url}:\`, err);
24
+ allClients.forEach((client) => {
25
+ client.postMessage({
26
+ type: "SW_NOTIFICATION",
27
+ level: "warn",
28
+ code: "PRECACHE_FAILED",
29
+ message: \`Failed to precache \${asset.url}\`,
30
+ });
31
+ });
32
+ }
33
+ const percent = Math.round((attempted / ASSETS_TO_CACHE.length) * 100);
34
+ allClients.forEach((client) => {
35
+ client.postMessage({
36
+ type: "SW_PROGRESS",
37
+ percent,
38
+ downloaded,
39
+ total: ASSETS_TO_CACHE.length,
40
+ });
41
+ });
42
+ }
43
+ }
44
+
6
45
  self.addEventListener("install", (event) => {
7
46
  event.waitUntil(
8
47
  (async () => {
9
- const cache = await caches.open(CACHE_NAME);
10
- let downloaded = 0;
11
- let attempted = 0;
12
- for (const asset of ASSETS_TO_CACHE) {
13
- attempted++;
14
- try {
15
- const request = new Request(asset.url, asset.options);
16
- await cache.add(request);
17
- downloaded++;
18
- } catch (err) {
19
- console.error(\`Failed to cache \${asset.url}:\`, err);
20
- }
21
- const percent = Math.round((attempted / ASSETS_TO_CACHE.length) * 100);
22
- const clients = await self.clients.matchAll({ includeUncontrolled: true });
23
- clients.forEach((client) => {
24
- client.postMessage({
25
- type: "SW_PROGRESS",
26
- percent,
27
- downloaded,
28
- total: ASSETS_TO_CACHE.length,
29
- });
30
- });
31
- }
48
+ await precacheAssets();
32
49
  if (AUTO_SKIP_WAITING) self.skipWaiting();
33
50
  })(),
34
51
  );
@@ -1 +1 @@
1
- {"version":3,"file":"install-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/install-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8BL,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"install-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/install-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6CL,CAAC;AACL,CAAC"}
@@ -31,6 +31,27 @@ function debouncedInvalidate(tag) {
31
31
  self.addEventListener("message", (event) => {
32
32
  if (event.data.type === "SKIP_WAITING") {
33
33
  self.skipWaiting();
34
+ }
35
+ if (event.data.type === "FOCUS") {
36
+ if (typeof handleRefetch === "function") handleRefetch("refetchOnFocus");
37
+ }
38
+ if (event.data.type === "ONLINE") {
39
+ if (typeof handleRefetch === "function") handleRefetch("refetchOnReconnect");
40
+ }
41
+ if (event.data.type === "OFFLINE") {
42
+ // Client went offline — the SW already serves from cache transparently.
43
+ // No action needed; reactive refetches will resume on next ONLINE signal.
44
+ }
45
+ if (event.data.type === "RESET_CACHE") {
46
+ event.waitUntil(
47
+ (async () => {
48
+ const keys = await caches.keys();
49
+ await Promise.all(keys.map((k) => caches.delete(k)));
50
+ await precacheAssets();
51
+ const port = event.ports?.[0];
52
+ port?.postMessage({ type: "RESET_CACHE_COMPLETE" });
53
+ })(),
54
+ );
34
55
  }`;
35
56
  if (tagInvalidation) {
36
57
  const invalidateCall = debounceMs > 0
@@ -42,13 +63,13 @@ self.addEventListener("message", (event) => {
42
63
  }
43
64
  if (event.data.type === "GET_URLS_FOR_TAG" && event.data.tag) {
44
65
  const urls = getUrlsForTag(event.data.tag);
45
- if (event.ports && event.ports[0]) {
66
+ if (event.ports?.[0]) {
46
67
  event.ports[0].postMessage({ type: "URLS_FOR_TAG", urls });
47
68
  }
48
69
  }
49
70
  if (event.data.type === "GET_TAGS_FOR_URL" && event.data.url) {
50
71
  const tags = getTagsForUrl(event.data.url);
51
- if (event.ports && event.ports[0]) {
72
+ if (event.ports?.[0]) {
52
73
  event.ports[0].postMessage({ type: "TAGS_FOR_URL", tags });
53
74
  }
54
75
  }
@@ -57,13 +78,9 @@ self.addEventListener("message", (event) => {
57
78
  }`;
58
79
  }
59
80
  code += `
60
- if (event.data.type === "ONLINE") {
61
- event.waitUntil(handleOnline());
81
+ if (event.data.type === "AUTH_CLEARED") {
82
+ event.waitUntil(broadcastToClients("AUTH_CLEARED"));
62
83
  }
63
- if (event.data.type === "FOCUS") {
64
- event.waitUntil(handleOnFocus());
65
- }
66
-
67
84
  });`;
68
85
  return code;
69
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/message-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,eAAwB,EAAE,aAAqB,CAAC;IACrF,MAAM,gBAAgB,GAAG,eAAe,IAAI,UAAU,GAAG,CAAC;QACxD,CAAC,CAAC;mCAC6B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;CAwB5C;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,IAAI,GAAG,GAAG,gBAAgB;;;;IAI5B,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;YACnC,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,kDAAkD,CAAC;QAEvD,IAAI,IAAI;;MAEN,cAAc;;;;;;;;;;;;;;;;IAgBhB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;;;;;;;;IAQN,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/message-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,eAAwB,EAAE,aAAqB,CAAC;IACrF,MAAM,gBAAgB,GAAG,eAAe,IAAI,UAAU,GAAG,CAAC;QACxD,CAAC,CAAC;mCAC6B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;CAwB5C;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,IAAI,GAAG,GAAG,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;IAyB5B,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;YACnC,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,kDAAkD,CAAC;QAEvD,IAAI,IAAI;;MAEN,cAAc;;;;;;;;;;;;;;;;IAgBhB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;;;;IAIN,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -14,11 +14,11 @@ let pushReconnectTimer = null;
14
14
  async function connectPushEvents() {
15
15
  try {
16
16
  pushWs = new WebSocket("${endpoint}");
17
- pushWs.onmessage = (event) => {
17
+ pushWs.onmessage = async (event) => {
18
18
  try {
19
19
  const data = JSON.parse(event.data);
20
20
  if (data.type === "invalidate" && data.tags) {
21
- data.tags.forEach((tag) => invalidateByTag(tag));
21
+ await Promise.all(data.tags.map((tag) => invalidateByTag(tag)));
22
22
  }
23
23
  } catch {}
24
24
  };
@@ -36,11 +36,11 @@ async function connectPushEvents() {
36
36
 
37
37
  function scheduleReconnect() {
38
38
  if (pushReconnectTimer) clearTimeout(pushReconnectTimer);
39
- pushReconnectTimer = setTimeout(connectPushEvents, ${reconnectDelayMs});
39
+ pushReconnectTimer = setTimeout(connectPushEvents, Math.max(1000, ${reconnectDelayMs}));
40
40
  }
41
41
 
42
- self.addEventListener("activate", (event) => {
43
- event.waitUntil(connectPushEvents());
42
+ self.addEventListener("activate", () => {
43
+ connectPushEvents();
44
44
  });
45
45
  `;
46
46
  }
@@ -49,11 +49,7 @@ self.addEventListener("activate", (event) => {
49
49
  // --- Server Push Events (SSE) ---
50
50
 
51
51
  function notifyClientsSSE(connected) {
52
- self.clients.matchAll().then(function(clients) {
53
- clients.forEach(function(client) {
54
- client.postMessage({ type: "SSE_STATUS", connected: !!connected });
55
- });
56
- });
52
+ broadcastToClients("SSE_STATUS", { connected: !!connected });
57
53
  }
58
54
 
59
55
  let pushReconnectTimer = null;
@@ -97,7 +93,7 @@ async function connectPushEvents() {
97
93
  try {
98
94
  const parsed = JSON.parse(dataStr);
99
95
  if (parsed.tags) {
100
- parsed.tags.forEach((tag) => invalidateByTag(tag));
96
+ await Promise.all(parsed.tags.map((tag) => invalidateByTag(tag)));
101
97
  }
102
98
  } catch {}
103
99
  }
@@ -115,11 +111,11 @@ async function connectPushEvents() {
115
111
 
116
112
  function scheduleReconnect() {
117
113
  if (pushReconnectTimer) clearTimeout(pushReconnectTimer);
118
- pushReconnectTimer = setTimeout(connectPushEvents, ${reconnectDelayMs});
114
+ pushReconnectTimer = setTimeout(connectPushEvents, Math.max(1000, ${reconnectDelayMs}));
119
115
  }
120
116
 
121
- self.addEventListener("activate", (event) => {
122
- event.waitUntil(connectPushEvents());
117
+ self.addEventListener("activate", () => {
118
+ connectPushEvents();
123
119
  });
124
120
  `;
125
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server-push-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/server-push-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,yBAAyB,CACvC,IAAyB,EACzB,QAAgB,EAChB,gBAAwB;IAExB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO;;;;;;;;8BAQmB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;uDAuBiB,gBAAgB;;;;;;CAMtE,CAAC;IACA,CAAC;IAED,qCAAqC;IACrC,OAAO;;;;;;;;;;;;;;;;;oCAiB2B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAqDW,gBAAgB;;;;;;CAMtE,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"server-push-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/server-push-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,yBAAyB,CACvC,IAAyB,EACzB,QAAgB,EAChB,gBAAwB;IAExB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO;;;;;;;;8BAQmB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;sEAuBgC,gBAAgB;;;;;;CAMrF,CAAC;IACF,CAAC;IAEC,qCAAqC;IACrC,OAAO;;;;;;;;;;;;;oCAa2B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAqD0B,gBAAgB;;;;;;CAMrF,CAAC;AACF,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { generateFetchHandler } from "./fetch-handler.js";
2
+ import { generateActivateHandler } from "./activate-handler.js";
3
+ import { generateInstallHandler } from "./install-handler.js";
4
+ import { generateMessageHandler } from "./message-handler.js";
5
+ import { generateTagManagement } from "./tag-management.js";
6
+ import { generateBatchRefreshQueue } from "./batch-refresh-queue.js";
7
+ import { generateSwPushHandlers } from "./sw-push.js";
8
+ import { generateServerPushHandler } from "./server-push-handler.js";
9
+ import { generateBackgroundSyncHandler } from "./background-sync-handler.js";
10
+ const COOKIE_AUTH_TYPES = ["cookie"];
11
+ function isCookieAuth(authType) {
12
+ return COOKIE_AUTH_TYPES.includes(authType);
13
+ }
14
+ export function shouldIncludeBackgroundSync(config) {
15
+ const { features } = config;
16
+ return !!(features.mutationQueue.backgroundSync &&
17
+ features.mutationQueue.enabled &&
18
+ (!features.auth.enabled || isCookieAuth(features.auth.type)));
19
+ }
20
+ export function shouldIncludeServerPush(config) {
21
+ const { features } = config;
22
+ return !!(features.serverPush?.enabled &&
23
+ (!features.auth.enabled || isCookieAuth(features.auth.type)));
24
+ }
25
+ export function generateBackgroundSyncCode(config) {
26
+ const { features } = config;
27
+ const authType = features.auth.enabled ? features.auth.type : undefined;
28
+ const mq = features.mutationQueue;
29
+ const maxCacheAge = features.serviceWorker.strategy.maxRuntimeCacheAge;
30
+ return `\n\n${generateBackgroundSyncHandler(authType, mq.batchSize, mq.batchDelayMs, mq.retry, true, maxCacheAge)}`;
31
+ }
32
+ /**
33
+ * Applies all SW section generators (fetch, activate, install, message,
34
+ * tag management, push, server push) into the template code.
35
+ *
36
+ * @param code - The template code with placeholder markers
37
+ * @param config - Swoff configuration
38
+ * @param useApiBasePlaceholder - When true, prepend SWOFF_API_BASE to server-push endpoint
39
+ * @returns The code with all sections replaced
40
+ */
41
+ export function applySwSections(code, config, useApiBasePlaceholder, debug) {
42
+ const { features } = config;
43
+ const { serviceWorker } = features;
44
+ const { strategy, navigation } = serviceWorker;
45
+ const { refetchQueue } = features;
46
+ const maxCacheAge = strategy.maxRuntimeCacheAge;
47
+ const spEnabled = shouldIncludeServerPush(config);
48
+ const spEndpoint = features.serverPush?.endpoint ?? "";
49
+ code = code.replace("// [[FETCH_HANDLER]]", () => generateFetchHandler({ strategy, navigation, refetchQueue }, features.tagInvalidation.enabled, features.mutationQueue.enabled, features.auth.routePaths, spEnabled ? spEndpoint : undefined, debug));
50
+ code = code.replace("// [[ACTIVATE_HANDLER]]", () => generateActivateHandler(navigation.preload, maxCacheAge));
51
+ code = code.replace("// [[INSTALL_HANDLER]]", () => generateInstallHandler());
52
+ code = code.replace("// [[BATCH_REFRESH_QUEUE]]", () => generateBatchRefreshQueue(refetchQueue.retry, refetchQueue.batchSize, refetchQueue.batchDelayMs));
53
+ code = code.replace("// [[MESSAGE_HANDLER]]", () => generateMessageHandler(features.tagInvalidation.enabled, features.tagInvalidation.debounceMs ?? 0));
54
+ code = features.tagInvalidation.enabled
55
+ ? code.replace("// [[TAG_MANAGEMENT]]", () => generateTagManagement(maxCacheAge))
56
+ : code.replace("// [[TAG_MANAGEMENT]]", "");
57
+ const endpoint = useApiBasePlaceholder
58
+ ? "SWOFF_API_BASE" + spEndpoint
59
+ : spEndpoint;
60
+ code = features.pushNotifications
61
+ ? code.replace("// [[PUSH_HANDLERS]]", () => generateSwPushHandlers())
62
+ : code.replace("// [[PUSH_HANDLERS]]", "");
63
+ code = spEnabled
64
+ ? code.replace("// [[SERVER_PUSH_HANDLER]]", () => generateServerPushHandler(features.serverPush.type, endpoint, features.serverPush.reconnectDelayMs))
65
+ : code.replace("// [[SERVER_PUSH_HANDLER]]", "");
66
+ return code;
67
+ }
68
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,MAAM,iBAAiB,GAAG,CAAC,QAAQ,CAAC,CAAC;AAErC,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAmB;IAC7D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,CAAC,CACP,QAAQ,CAAC,aAAa,CAAC,cAAc;QACrC,QAAQ,CAAC,aAAa,CAAC,OAAO;QAC9B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAmB;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,CAAC,CACP,QAAQ,CAAC,UAAU,EAAE,OAAO;QAC5B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAmB;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC;IAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACvE,OAAO,OAAO,6BAA6B,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AACtH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,MAAmB,EACnB,qBAA8B,EAC9B,KAAe;IAEf,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC;IAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IAChD,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;IAEvD,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,sBAAsB,EACtB,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAC1M,CAAC;IAEF,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,yBAAyB,EACzB,GAAG,EAAE,CAAC,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAC/D,CAAC;IAEF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC9E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAC/E,YAAY,CAAC,KAAK,EAClB,YAAY,CAAC,SAAS,EACtB,YAAY,CAAC,YAAY,CAC1B,CAAC,CAAC;IAEH,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;IACxJ,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,OAAO;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACjF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,qBAAqB;QACpC,CAAC,CAAC,gBAAgB,GAAG,UAAU;QAC/B,CAAC,CAAC,UAAU,CAAC;IAEf,IAAI,GAAG,QAAQ,CAAC,iBAAiB;QAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAE7C,IAAI,GAAG,SAAS;QACd,CAAC,CAAC,IAAI,CAAC,OAAO,CACV,4BAA4B,EAC5B,GAAG,EAAE,CAAC,yBAAyB,CAC7B,QAAQ,CAAC,UAAU,CAAC,IAAI,EACxB,QAAQ,EACR,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CACrC,CACF;QACH,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAEnD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -41,10 +41,6 @@ self.addEventListener("notificationclick", (event) => {
41
41
 
42
42
  event.waitUntil(
43
43
  (async () => {
44
- if (action) {
45
- // Handle action clicks (e.g., "reply", "dismiss")
46
- }
47
-
48
44
  const clients = await self.clients.matchAll({ type: "window" });
49
45
 
50
46
  for (const client of clients) {
@@ -56,8 +52,8 @@ self.addEventListener("notificationclick", (event) => {
56
52
  }
57
53
  }
58
54
 
59
- if (clients.openWindow) {
60
- return clients.openWindow(url);
55
+ if (self.clients.openWindow) {
56
+ return self.clients.openWindow(url);
61
57
  }
62
58
  })(),
63
59
  );
@@ -1 +1 @@
1
- {"version":3,"file":"sw-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/sw-push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"sw-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/sw-push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDR,CAAC;AACF,CAAC"}
@@ -1,99 +1,32 @@
1
- /**
2
- * Generates IndexedDB-based tag invalidation logic for the SW.
3
- * After invalidation, tries to re-fetch URLs in the background.
4
- * On failure, keeps the old entry as stale-while-revalidate fallback.
5
- *
6
- * Cascading is handled by the client — the SW processes one tag at a time.
7
- */
8
- export function generateTagManagement() {
1
+ export function generateTagManagement(maxAge) {
2
+ const evict = maxAge && maxAge > 0;
9
3
  return `
10
- const staleVersions = new Map();
11
- const STALE_VERSIONS_MAX = 100;
12
- const STALE_VERSION_TTL = 30 * 60 * 1000;
13
4
  const TAG_DB_NAME = "swoff-cache-tags";
14
5
  const TAG_STORE_NAME = "tags";
15
6
  // Bump this when adding new indexes/stores for schema migration
16
7
  const TAG_DB_VERSION = 1;
17
8
 
18
- function cleanStaleVersions() {
19
- const now = Date.now();
20
- for (const [url, ts] of staleVersions) {
21
- if (staleVersions.size > STALE_VERSIONS_MAX || now - ts > STALE_VERSION_TTL) {
22
- staleVersions.delete(url);
9
+ async function cacheTagUrl(url, actualUrl, tags, method, body, contentType) {
10
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION, function(db) {
11
+ if (!db.objectStoreNames.contains(TAG_STORE_NAME)) {
12
+ const store = db.createObjectStore(TAG_STORE_NAME, { keyPath: "url" });
13
+ store.createIndex("by-tag", "tags", { multiEntry: true });
23
14
  }
24
- }
25
- }
26
-
27
- function openTagDB() {
28
- return new Promise((resolve, reject) => {
29
- const request = indexedDB.open(TAG_DB_NAME, TAG_DB_VERSION);
30
- request.onupgradeneeded = (e) => {
31
- const db = e.target.result;
32
- if (!db.objectStoreNames.contains(TAG_STORE_NAME)) {
33
- const store = db.createObjectStore(TAG_STORE_NAME, { keyPath: "url" });
34
- store.createIndex("by-tag", "tags", { multiEntry: true });
35
- }
36
- };
37
- request.onsuccess = (e) => resolve(e.target.result);
38
- request.onerror = (e) => reject(e.target.error);
39
15
  });
40
- }
41
-
42
- async function cacheTagUrl(url, actualUrl, tags, method, body, contentType) {
43
- const db = await openTagDB();
44
- const tx = db.transaction(TAG_STORE_NAME, "readwrite");
16
+ ${evict
17
+ ? `await pruneStaleStore(db, TAG_STORE_NAME, Date.now() - MAX_RUNTIME_CACHE_AGE * 1000);
18
+ `
19
+ : ""}const tx = db.transaction(TAG_STORE_NAME, "readwrite");
45
20
  const store = tx.objectStore(TAG_STORE_NAME);
46
- store.put({ url, actualUrl, tags, method: method || "GET", body: body || null, contentType: contentType || null });
21
+ store.put({ url, actualUrl, tags, method: method || "GET", body: body || null, contentType: contentType || null, timestamp: Date.now() });
47
22
  await new Promise((resolve, reject) => {
48
23
  tx.oncomplete = () => resolve();
49
24
  tx.onerror = () => reject(tx.error);
50
25
  });
51
26
  }
52
27
 
53
- async function invalidateByTag(tag) {
54
- const db = await openTagDB();
55
- const tx = db.transaction(TAG_STORE_NAME, "readonly");
56
- const store = tx.objectStore(TAG_STORE_NAME);
57
- const index = store.index("by-tag");
58
- const entries = await new Promise((resolve, reject) => {
59
- const request = index.getAll(tag);
60
- request.onsuccess = () => resolve(request.result);
61
- request.onerror = () => reject(request.error);
62
- });
63
- await db.close();
64
-
65
- // Remove from tag index and runtime cache
66
- const writeDb = await openTagDB();
67
- const writeTx = writeDb.transaction(TAG_STORE_NAME, "readwrite");
68
- const writeStore = writeTx.objectStore(TAG_STORE_NAME);
69
- for (const entry of entries) {
70
- writeStore.delete(entry.url);
71
- }
72
- await new Promise((resolve, reject) => {
73
- writeTx.oncomplete = () => resolve();
74
- writeTx.onerror = () => reject(writeTx.error);
75
- });
76
- writeDb.close();
77
-
78
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
79
- for (const entry of entries) {
80
- await runtimeCache.delete(entry.url);
81
- }
82
-
83
- // Enqueue background refetch through batched refresh queue
84
- for (const entry of entries) {
85
- staleVersions.set(entry.url, Date.now());
86
- queueRefresh(entry.url, entry.actualUrl, entry.tags, entry.method, entry.body, entry.contentType);
87
- }
88
-
89
- const clients = await self.clients.matchAll();
90
- clients.forEach((client) => {
91
- client.postMessage({ type: "TAG_INVALIDATED", tag });
92
- });
93
- }
94
-
95
28
  async function getUrlsForTag(tag) {
96
- const db = await openTagDB();
29
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
97
30
  const tx = db.transaction(TAG_STORE_NAME, "readonly");
98
31
  const store = tx.objectStore(TAG_STORE_NAME);
99
32
  const index = store.index("by-tag");
@@ -102,12 +35,12 @@ async function getUrlsForTag(tag) {
102
35
  request.onsuccess = () => resolve(request.result);
103
36
  request.onerror = () => reject(request.error);
104
37
  });
105
- await db.close();
38
+ tx.oncomplete = () => db.close();
106
39
  return entries.map((e) => ({ url: e.url, actualUrl: e.actualUrl }));
107
40
  }
108
41
 
109
42
  async function getTagsForUrl(url) {
110
- const db = await openTagDB();
43
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
111
44
  const tx = db.transaction(TAG_STORE_NAME, "readonly");
112
45
  const store = tx.objectStore(TAG_STORE_NAME);
113
46
  const entry = await new Promise((resolve, reject) => {
@@ -115,12 +48,48 @@ async function getTagsForUrl(url) {
115
48
  request.onsuccess = () => resolve(request.result);
116
49
  request.onerror = () => reject(request.error);
117
50
  });
118
- await db.close();
51
+ tx.oncomplete = () => db.close();
119
52
  return entry ? entry.tags : [];
120
53
  }
121
54
 
55
+ async function invalidateByTag(tag) {
56
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
57
+ const tx = db.transaction(TAG_STORE_NAME, "readwrite");
58
+ const store = tx.objectStore(TAG_STORE_NAME);
59
+ const index = store.index("by-tag");
60
+ const entries = await new Promise((resolve, reject) => {
61
+ const request = index.getAll(tag);
62
+ request.onsuccess = () => resolve(request.result);
63
+ request.onerror = () => reject(request.error);
64
+ });
65
+
66
+ if (!entries || entries.length === 0) {
67
+ tx.oncomplete = () => db.close();
68
+ return;
69
+ }
70
+
71
+ for (const entry of entries) {
72
+ store.delete(entry.url);
73
+ }
74
+ await new Promise((resolve, reject) => {
75
+ tx.oncomplete = () => resolve();
76
+ tx.onerror = () => reject(tx.error);
77
+ });
78
+ db.close();
79
+
80
+ const runtimeCache = await caches.open("swoff-runtime");
81
+ const rscCache = await caches.open("swoff-runtime-html");
82
+ for (const entry of entries) {
83
+ await runtimeCache.delete(entry.url);
84
+ await rscCache.delete(entry.url);
85
+ queueRefresh(entry.actualUrl);
86
+ }
87
+
88
+ broadcastToClients("TAG_INVALIDATED", { tag });
89
+ }
90
+
122
91
  async function invalidateMatching(globPattern) {
123
- const db = await openTagDB();
92
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
124
93
  const tx = db.transaction(TAG_STORE_NAME, "readonly");
125
94
  const store = tx.objectStore(TAG_STORE_NAME);
126
95
  const allEntries = await new Promise((resolve, reject) => {
@@ -128,9 +97,9 @@ async function invalidateMatching(globPattern) {
128
97
  request.onsuccess = () => resolve(request.result);
129
98
  request.onerror = () => reject(request.error);
130
99
  });
131
- await db.close();
100
+ tx.oncomplete = () => db.close();
132
101
 
133
- const matching = allEntries.filter((entry) => matchGlob(entry.url, globPattern));
102
+ const matching = allEntries.filter((entry) => matchGlob(entry.actualUrl, globPattern));
134
103
  const tags = new Set();
135
104
  for (const entry of matching) {
136
105
  for (const tag of entry.tags) {
@@ -1 +1 @@
1
- {"version":3,"file":"tag-management.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/tag-management.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoIP,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tag-management.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/tag-management.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM,KAAK,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC;IAEnC,OAAO;;;;;;;;;;;;;IAcL,KAAK;QACH,CAAC,CAAC;GACL;QACG,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FA,CAAC;AACH,CAAC"}