diff options
-rw-r--r-- | FrontEnd/package-lock.json | 42 | ||||
-rw-r--r-- | FrontEnd/package.json | 2 | ||||
-rw-r--r-- | FrontEnd/src/sw/sw.ts | 48 |
3 files changed, 67 insertions, 25 deletions
diff --git a/FrontEnd/package-lock.json b/FrontEnd/package-lock.json index c31e3e9a..d3cba84c 100644 --- a/FrontEnd/package-lock.json +++ b/FrontEnd/package-lock.json @@ -30,6 +30,8 @@ "react-router-dom": "^5.2.0", "regenerator-runtime": "^0.13.7", "rxjs": "^6.6.3", + "workbox-cacheable-response": "^6.1.0", + "workbox-expiration": "^6.1.0", "workbox-precaching": "^6.1.0", "workbox-routing": "^6.1.0", "workbox-strategies": "^6.1.0", @@ -15670,7 +15672,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.1.0.tgz", "integrity": "sha512-oDAi0vXHGaE5p9NOo4N180UTcEKm6t2JMgmlrq0PkEW2PZEu9YR/atSnCwzMW7xpDqpKWaQr/LGP4+eixS8gcA==", - "dev": true, "dependencies": { "workbox-core": "^6.1.0" } @@ -15684,7 +15685,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.1.0.tgz", "integrity": "sha512-jp2xGk+LC4AhCoOxO/bC06GQkq/oVp0ZIf1zXLQh6OD2fWZPkXNjLLSuDnjXoGGPibYrq7gEE/xjAdYGjNWl1A==", - "dev": true, "dependencies": { "workbox-core": "^6.1.0" } @@ -17301,7 +17301,8 @@ "@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "requires": {} }, "@restart/hooks": { "version": "0.3.26", @@ -17974,7 +17975,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", - "dev": true + "dev": true, + "requires": {} }, "@webpack-cli/info": { "version": "1.2.2", @@ -17989,7 +17991,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", - "dev": true + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -18264,7 +18267,8 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -18282,13 +18286,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "4.1.1", @@ -18883,7 +18889,8 @@ "bootstrap": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", - "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==", + "requires": {} }, "bootstrap-icons": { "version": "1.3.0", @@ -20478,7 +20485,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.4", @@ -20631,7 +20639,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -21994,7 +22003,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -24552,7 +24562,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -25248,7 +25259,8 @@ "react-from-dom": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.5.1.tgz", - "integrity": "sha512-ki6OGVgSjDCF0Gt4SMl2cUNBA9ZB8g59bwv9ZiSEXQ37Cw9ZGY0s7EgfPFQYDvaiVx22jto7/dYgQeS+Qw1Mfw==" + "integrity": "sha512-ki6OGVgSjDCF0Gt4SMl2cUNBA9ZB8g59bwv9ZiSEXQ37Cw9ZGY0s7EgfPFQYDvaiVx22jto7/dYgQeS+Qw1Mfw==", + "requires": {} }, "react-i18next": { "version": "11.8.6", @@ -28191,7 +28203,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.1.0.tgz", "integrity": "sha512-oDAi0vXHGaE5p9NOo4N180UTcEKm6t2JMgmlrq0PkEW2PZEu9YR/atSnCwzMW7xpDqpKWaQr/LGP4+eixS8gcA==", - "dev": true, "requires": { "workbox-core": "^6.1.0" } @@ -28205,7 +28216,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.1.0.tgz", "integrity": "sha512-jp2xGk+LC4AhCoOxO/bC06GQkq/oVp0ZIf1zXLQh6OD2fWZPkXNjLLSuDnjXoGGPibYrq7gEE/xjAdYGjNWl1A==", - "dev": true, "requires": { "workbox-core": "^6.1.0" } diff --git a/FrontEnd/package.json b/FrontEnd/package.json index 7a922867..bac45273 100644 --- a/FrontEnd/package.json +++ b/FrontEnd/package.json @@ -28,6 +28,8 @@ "react-router-dom": "^5.2.0",
"regenerator-runtime": "^0.13.7",
"rxjs": "^6.6.3",
+ "workbox-cacheable-response": "^6.1.0",
+ "workbox-expiration": "^6.1.0",
"workbox-precaching": "^6.1.0",
"workbox-routing": "^6.1.0",
"workbox-strategies": "^6.1.0",
diff --git a/FrontEnd/src/sw/sw.ts b/FrontEnd/src/sw/sw.ts index b5225ec4..09d4715b 100644 --- a/FrontEnd/src/sw/sw.ts +++ b/FrontEnd/src/sw/sw.ts @@ -1,6 +1,12 @@ import { precacheAndRoute, matchPrecache } from "workbox-precaching"; -import { setDefaultHandler } from "workbox-routing"; -import { NetworkOnly } from "workbox-strategies"; +import { registerRoute, setDefaultHandler } from "workbox-routing"; +import { + NetworkFirst, + NetworkOnly, + StaleWhileRevalidate, +} from "workbox-strategies"; +import { CacheableResponsePlugin } from "workbox-cacheable-response"; +import { ExpirationPlugin } from "workbox-expiration"; declare let self: ServiceWorkerGlobalScope; @@ -14,15 +20,39 @@ precacheAndRoute(self.__WB_MANIFEST); const networkOnly = new NetworkOnly(); -const networkOnlyPaths = ["/api", "/swagger"]; +registerRoute("/swagger", new NetworkOnly()); + +registerRoute("/api/token", new NetworkOnly()); +registerRoute("/api/search", new NetworkOnly()); + +registerRoute( + /\/api\/users\/.+\/avatar/, + new StaleWhileRevalidate({ + cacheName: "avatars", + plugins: [ + new CacheableResponsePlugin({ + statuses: [200], + }), + new ExpirationPlugin({ + maxAgeSeconds: 60 * 60 * 24 * 30 * 3, // 3 months + }), + ], + }) +); + +registerRoute( + "/api", + new NetworkFirst({ + plugins: [ + new CacheableResponsePlugin({ + statuses: [200], + }), + ], + }) +); setDefaultHandler((options) => { - const { request, url } = options; - if (url) { - for (const p of networkOnlyPaths) { - if (url.pathname.startsWith(p)) return networkOnly.handle(options); - } - } + const { request } = options; if (request instanceof Request && request.destination === "document") return matchPrecache("/index.html").then((r) => |