aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FrontEnd/package-lock.json42
-rw-r--r--FrontEnd/package.json2
-rw-r--r--FrontEnd/src/sw/sw.ts48
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) =>