@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.
- package/README.md +28 -32
- package/dist/index.js +2 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +3 -8
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +29 -87
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +16 -30
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +31 -6
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/init.js +188 -11
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +2 -4
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/loader.js +34 -25
- package/dist/lib/config/loader.js.map +1 -1
- package/dist/lib/config/validator.js +202 -96
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/api-config.js +1 -1
- package/dist/lib/generators/file-generators/api-config.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-adapter.js +13 -0
- package/dist/lib/generators/file-generators/auth-adapter.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-check.js +40 -0
- package/dist/lib/generators/file-generators/auth-check.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-store.js +2 -5
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/background-sync.js +1 -1
- package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +2 -1
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector-bundle.js +15 -0
- package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -0
- package/dist/lib/generators/file-generators/client-injector.js +2 -1
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/connectivity-manager.js +12 -0
- package/dist/lib/generators/file-generators/connectivity-manager.js.map +1 -0
- package/dist/lib/generators/file-generators/connectivity.js +12 -0
- package/dist/lib/generators/file-generators/connectivity.js.map +1 -0
- package/dist/lib/generators/file-generators/context.js +7 -0
- package/dist/lib/generators/file-generators/context.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-framework-adapters.js +29 -20
- package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +2 -2
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +51 -1
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/invalidation-tags.js +2 -3
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +2 -2
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
- package/dist/lib/generators/file-generators/notification-generator.js +6 -0
- package/dist/lib/generators/file-generators/notification-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/open-db.js +6 -0
- package/dist/lib/generators/file-generators/open-db.js.map +1 -0
- package/dist/lib/generators/file-generators/push.js +1 -2
- package/dist/lib/generators/file-generators/push.js.map +1 -1
- package/dist/lib/generators/file-generators/pwa-install.js +2 -6
- package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
- package/dist/lib/generators/file-generators/server-push.js +1 -1
- package/dist/lib/generators/file-generators/server-push.js.map +1 -1
- package/dist/lib/generators/file-generators/storage-generator.js +6 -0
- package/dist/lib/generators/file-generators/storage-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/storage-notify.js +6 -0
- package/dist/lib/generators/file-generators/storage-notify.js.map +1 -0
- package/dist/lib/generators/file-generators/storage.js +6 -0
- package/dist/lib/generators/file-generators/storage.js.map +1 -0
- package/dist/lib/generators/file-generators/sw-generator-build.js +96 -45
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +0 -4
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-template.js +8 -9
- package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-version-gen.js +32 -0
- package/dist/lib/generators/file-generators/sw-version-gen.js.map +1 -0
- package/dist/lib/generators/file-generators/swoff-api-bundle.js +51 -0
- package/dist/lib/generators/file-generators/swoff-api-bundle.js.map +1 -0
- package/dist/lib/generators/sw-build-utils.js +69 -0
- package/dist/lib/generators/sw-build-utils.js.map +1 -0
- package/dist/lib/generators/sw-generator.js +23 -34
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +74 -23
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +15 -94
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +74 -72
- package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js +102 -0
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -0
- package/dist/lib/generators/sw-sections/config-header.js +2 -3
- package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
- package/dist/lib/generators/sw-sections/default-template.js +59 -6
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +621 -495
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/install-handler.js +40 -23
- package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/message-handler.js +25 -8
- package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/server-push-handler.js +10 -14
- package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/shared.js +68 -0
- package/dist/lib/generators/sw-sections/shared.js.map +1 -0
- package/dist/lib/generators/sw-sections/sw-push.js +2 -6
- package/dist/lib/generators/sw-sections/sw-push.js.map +1 -1
- package/dist/lib/generators/sw-sections/tag-management.js +55 -86
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +183 -59
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +67 -63
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/shared/feature-registry.js +198 -0
- package/dist/lib/shared/feature-registry.js.map +1 -0
- package/dist/lib/utils/detect-framework.js +52 -9
- package/dist/lib/utils/detect-framework.js.map +1 -1
- package/dist/runtime/api-config.js +2 -2
- package/dist/runtime/api-config.js.map +1 -1
- package/dist/runtime/auth-adapter.js +179 -0
- package/dist/runtime/auth-adapter.js.map +1 -0
- package/dist/runtime/auth-state.js +16 -6
- package/dist/runtime/auth-state.js.map +1 -1
- package/dist/runtime/auth-store.js +219 -213
- package/dist/runtime/auth-store.js.map +1 -1
- package/dist/runtime/auth-user.js +5 -19
- package/dist/runtime/auth-user.js.map +1 -1
- package/dist/runtime/background-sync.js +5 -2
- package/dist/runtime/background-sync.js.map +1 -1
- package/dist/runtime/cache.js +91 -3
- package/dist/runtime/cache.js.map +1 -1
- package/dist/runtime/client-injector-bundle.js +314 -0
- package/dist/runtime/client-injector-bundle.js.map +1 -0
- package/dist/runtime/client-injector.js +173 -30
- package/dist/runtime/client-injector.js.map +1 -1
- package/dist/runtime/connectivity-manager.js +83 -0
- package/dist/runtime/connectivity-manager.js.map +1 -0
- package/dist/runtime/connectivity.js +83 -0
- package/dist/runtime/connectivity.js.map +1 -0
- package/dist/runtime/fetch-wrapper.js +26 -59
- package/dist/runtime/fetch-wrapper.js.map +1 -1
- package/dist/runtime/gql-wrapper.js +15 -9
- package/dist/runtime/gql-wrapper.js.map +1 -1
- package/dist/runtime/invalidation-tags.js +12 -89
- package/dist/runtime/invalidation-tags.js.map +1 -1
- package/dist/runtime/mutation-queue.js +83 -31
- package/dist/runtime/mutation-queue.js.map +1 -1
- package/dist/runtime/mutation-state.js +3 -3
- package/dist/runtime/mutation-state.js.map +1 -1
- package/dist/runtime/notification.js +65 -0
- package/dist/runtime/notification.js.map +1 -0
- package/dist/runtime/open-db.js +41 -0
- package/dist/runtime/open-db.js.map +1 -0
- package/dist/runtime/push.js +15 -27
- package/dist/runtime/push.js.map +1 -1
- package/dist/runtime/pwa-injector.js +3 -32
- package/dist/runtime/pwa-injector.js.map +1 -1
- package/dist/runtime/pwa-prompt.js +35 -3
- package/dist/runtime/pwa-prompt.js.map +1 -1
- package/dist/runtime/reset.js +39 -42
- package/dist/runtime/reset.js.map +1 -1
- package/dist/runtime/server-push.js +23 -13
- package/dist/runtime/server-push.js.map +1 -1
- package/dist/runtime/storage.js +32 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/runtime/sw-injector.js +19 -178
- package/dist/runtime/sw-injector.js.map +1 -1
- package/dist/runtime/sw-version.js +13 -0
- package/dist/runtime/sw-version.js.map +1 -0
- package/dist/runtime/swoff-api-bundle.js +1491 -0
- package/dist/runtime/swoff-api-bundle.js.map +1 -0
- package/dist/runtime/type-definitions.js +8 -7
- package/dist/runtime/type-definitions.js.map +1 -1
- package/dist/runtime/utils.js +4 -0
- package/dist/runtime/utils.js.map +1 -1
- package/dist/swoff-nkdhhmw8. +18 -0
- package/dist/swoff.js +5 -0
- package/package.json +1 -1
- package/templates/react/useAuth.jsx +7 -4
- package/templates/react/useAuth.tsx +14 -14
- package/templates/react/useBackgroundSync.jsx +5 -4
- package/templates/react/useBackgroundSync.tsx +5 -4
- package/templates/react/useCachedFetch.jsx +8 -0
- package/templates/react/useCachedFetch.tsx +8 -0
- package/templates/react/useMutation.jsx +60 -56
- package/templates/react/useMutation.tsx +65 -64
- package/templates/react/useMutationQueue.jsx +5 -1
- package/templates/react/useMutationQueue.tsx +8 -2
- package/templates/react/useMutationState.jsx +3 -4
- package/templates/react/useMutationState.tsx +4 -8
- package/templates/react/useNetworkStatus.jsx +57 -17
- package/templates/react/useNetworkStatus.tsx +42 -20
- package/templates/react/useOfflineAnalytics.jsx +42 -0
- package/templates/react/useOfflineAnalytics.tsx +50 -0
- package/templates/react/usePwaInstall.jsx +26 -0
- package/templates/react/usePwaInstall.tsx +26 -0
- package/templates/react/useSWUpdate.jsx +7 -52
- package/templates/react/useSWUpdate.tsx +12 -51
- package/templates/react/useStorageEstimate.jsx +56 -0
- package/templates/react/useStorageEstimate.tsx +67 -0
- package/dist/__tests__/assemble-sw.test.js +0 -145
- package/dist/__tests__/assemble-sw.test.js.map +0 -1
- package/dist/__tests__/cli-integration.test.js +0 -231
- package/dist/__tests__/cli-integration.test.js.map +0 -1
- package/dist/__tests__/config-types.test.js +0 -124
- package/dist/__tests__/config-types.test.js.map +0 -1
- package/dist/__tests__/detect-language.test.js +0 -51
- package/dist/__tests__/detect-language.test.js.map +0 -1
- package/dist/__tests__/file-generators.test.js +0 -228
- package/dist/__tests__/file-generators.test.js.map +0 -1
- package/dist/__tests__/glob-matcher.test.js +0 -86
- package/dist/__tests__/glob-matcher.test.js.map +0 -1
- package/dist/__tests__/invalidation-tags.test.js +0 -283
- package/dist/__tests__/invalidation-tags.test.js.map +0 -1
- package/dist/__tests__/loader.test.js +0 -77
- package/dist/__tests__/loader.test.js.map +0 -1
- package/dist/__tests__/validator.test.js +0 -340
- package/dist/__tests__/validator.test.js.map +0 -1
- package/templates/react/useCacheInvalidation.jsx +0 -19
- package/templates/react/useCacheInvalidation.tsx +0 -52
- package/templates/react/useIsFetching.jsx +0 -32
- 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":"AAAA
|
|
1
|
+
{"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/fetch-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAClC,QA0CC,EACD,eAAwB,EACxB,oBAA6B,EAC7B,cAAwB,EACxB,kBAA2B,EAC3B,KAAe;IAEf,MAAM,EACJ,QAAQ,EAAE,EACR,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,iBAAiB,EAC/B,iBAAiB,EACjB,OAAO,EAAE,YAAY,GAAG,EAAE,EAC1B,kBAAkB,EAAE,WAAW,GAChC,EACD,UAAU,EAAE,EACV,IAAI,EAAE,OAAO,GAAG,KAAK,EACrB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,cAAc,GAAG,EAAE,EAC7B,KAAK,EAAE,QAAQ,GAAG,EAAE,GACrB,GACF,GAAG,QAAQ,CAAC;IAEb,MAAM,SAAS,GAAG,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;IACxE,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC;IAEjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GACf,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAC1E,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnE,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,qBAAqB,IAAI,CAAC,SAAS,CACjC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CACF;;;;;;;;;;;;;;;CAeN;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,QAAQ,GACZ,IAAI;QACJ,oCAAoC;QACpC,IAAI;QACJ,gCAAgC;QAChC,yDAAyD;QACzD,KAAK;QACL,IAAI;QACJ,+BAA+B;QAC/B,qDAAqD;QACrD,wBAAwB;QACxB,wCAAwC;QACxC,4CAA4C;QAC5C,6BAA6B;QAC7B,wCAAwC;QACxC,6CAA6C;QAC7C,gBAAgB;QAChB,gIAAgI;QAChI,mBAAmB;QACnB,WAAW;QACX,mCAAmC;QACnC,OAAO;QACP,eAAe;QACf,KAAK;QACL,IAAI;QACJ,uCAAuC;QACvC,+EAA+E;QAC/E,qDAAqD;QACrD,gDAAgD;QAChD,0BAA0B;QAC1B,qDAAqD;QACrD,6BAA6B;QAC7B,4BAA4B;QAC5B,mDAAmD;QACnD,kCAAkC;QAClC,yBAAyB;QACzB,kDAAkD;QAClD,0FAA0F;QAC1F,6FAA6F;QAC7F,4DAA4D;QAC5D,WAAW;QACX,yCAAyC;QACzC,sBAAsB;QACtB,eAAe;QACf,mBAAmB;QACnB,SAAS;QACT,yFAAyF;QACzF,qFAAqF;QACrF,mDAAmD;QACnD,aAAa;QACb,cAAc;QACd,OAAO;QACP,uDAAuD;QACvD,KAAK;QACL,IAAI,CAAC;IAEP,MAAM,SAAS,GACb,kCAAkC;QAClC,0BAA0B;QAC1B,ihBAAihB;QACjhB,8FAA8F;QAC9F,QAAQ;QACR,KAAK,CAAC;IAER,MAAM,OAAO,GAAG,eAAe;QAC7B,CAAC,CAAC;;;;;;;;;;;;;;IAcF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;mBAEU,WAAW;wBACN,YAAY;4BACR,eAAe;4BACf,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;iCACrB,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;2BACnD,YAAY,GAAG,IAAI;mBAC3B,SAAS;EAC1B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;EACzF,kBAAkB,CAAC,CAAC,CAAC,iCAAiC,kBAAkB,IAAI,CAAC,CAAC,CAAC,EAAE;;EAEjF,YAAY;;;;;;;;;EASZ,QAAQ;;;;;;;;;;;;;;;;qCAiBN,iBAAiB;QACf,CAAC,CAAC;;;;;IAKJ;QACE,CAAC,CAAC,EACN,GACE,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAC/C,CAAC,CAAC;;;qBAGa,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;;;IAGlD;QACE,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6JG,OAAO;;;;;;;;;;;;;;;;;;;;;;;;OAyBR,QAAQ;QACN,CAAC,CAAC;;;;;;;;;;MAUF;QACA,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;EAiBA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CT,iBAAiB;QACf,CAAC,CAAC;;;;;;;;;;;;;;;;;;CAkBL;QACG,CAAC,CAAC,EACN,kBAAkB,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwP5E,oBAAoB;QAClB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;OA0BF,WAAW,IAAI,WAAW,GAAG,CAAC;YAC5B,CAAC,CAAC;;mGAE2F;YAC7F,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwED;QACG,CAAC,CAAC,EACN;;+CAGI,kBAAkB;QAChB,CAAC,CAAC;;;;IAIJ;QACE,CAAC,CAAC,EACN,GACE,cAAc,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC;;;;IAIJ;QACE,CAAC,CAAC,EACN;;;;KAKE,oBAAoB;QAClB,CAAC,CAAC;;;;;;;IAOJ;QACE,CAAC,CAAC;;;IAIN;;;;;;;IAOE,CAAC;AACL,CAAC"}
|
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 === "
|
|
61
|
-
event.waitUntil(
|
|
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
|
|
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.
|
|
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", (
|
|
43
|
-
|
|
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
|
-
|
|
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.
|
|
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", (
|
|
122
|
-
|
|
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;;;;;;;;;;;;;;;;;;;;;;;
|
|
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":"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"}
|
|
@@ -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
|
|
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
|
-
|
|
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
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
100
|
+
tx.oncomplete = () => db.close();
|
|
132
101
|
|
|
133
|
-
const matching = allEntries.filter((entry) => matchGlob(entry.
|
|
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
|
|
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"}
|