206 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var version = "v1.0" + __DATE__;
 | |
| var cacheName = "vinlottis";
 | |
| var CACHE_NAME = cacheName;
 | |
| var CACHE_NAME_API = cacheName + "::api";
 | |
| var STATIC_CACHE_URLS = ["/"];
 | |
| 
 | |
| console.log("Nåværende versjon:", version);
 | |
| self.addEventListener("activate", event => {
 | |
|   console.log("Aktiverer");
 | |
| 
 | |
|   event.waitUntil(self.clients.claim());
 | |
|   event.waitUntil(removeCache(CACHE_NAME));
 | |
|   event.waitUntil(removeCache(CACHE_NAME_API));
 | |
|   event.waitUntil(addCache(CACHE_NAME, STATIC_CACHE_URLS));
 | |
| });
 | |
| 
 | |
| self.addEventListener("notificationclick", function(event) {
 | |
|   event.notification.close();
 | |
|   if (
 | |
|     event.notification.data != undefined &&
 | |
|     event.notification.data.link != undefined
 | |
|   ) {
 | |
|     event.waitUntil(clients.openWindow(event.notification.data.link));
 | |
|   } else {
 | |
|     event.waitUntil(clients.openWindow("/"));
 | |
|   }
 | |
| });
 | |
| 
 | |
| self.addEventListener("message", event => {
 | |
|   if (!__PUBLICKEY__) {
 | |
|     return;
 | |
|   }
 | |
|   if (event.data === "updatePush") {
 | |
|     event.waitUntil(
 | |
|       new Promise((resolve, reject) => {
 | |
|         const applicationServerKey = urlB64ToUint8Array(__PUBLICKEY__);
 | |
|         const options = { applicationServerKey, userVisibleOnly: true };
 | |
|         self.registration.pushManager
 | |
|           .subscribe(options)
 | |
|           .then(subscription =>
 | |
|             saveSubscription(subscription)
 | |
|               .then(() => {
 | |
|                 try {
 | |
|                   const channel = new BroadcastChannel("updatePush");
 | |
|                   channel.postMessage({ success: true });
 | |
|                 } catch (e) {
 | |
|                   console.log("Using safari 'eh? No notifications for you.");
 | |
|                 }
 | |
|                 resolve();
 | |
|               })
 | |
|               .catch(() => {
 | |
|                 resolve();
 | |
|               })
 | |
|           )
 | |
|           .catch(() => {
 | |
|             console.log("Kunne ikke legge til pushnotifications");
 | |
|             reject();
 | |
|           });
 | |
|       })
 | |
|     );
 | |
|   }
 | |
| });
 | |
| 
 | |
| self.addEventListener("push", function(event) {
 | |
|   if (event.data) {
 | |
|     var message = JSON.parse(event.data.text());
 | |
|     var link = "/";
 | |
|     if (message.link != undefined) {
 | |
|       link = message.link;
 | |
|     }
 | |
| 
 | |
|     showLocalNotification(
 | |
|       message.title,
 | |
|       message.message,
 | |
|       link,
 | |
|       self.registration
 | |
|     );
 | |
|   } else {
 | |
|   }
 | |
| });
 | |
| 
 | |
| self.addEventListener("install", event => {
 | |
|   console.log("Arbeids arbeideren installerer seg.");
 | |
|   self.skipWaiting();
 | |
|   event.waitUntil(addCache(CACHE_NAME, STATIC_CACHE_URLS));
 | |
| });
 | |
| 
 | |
| self.addEventListener("fetch", event => {
 | |
|   if (
 | |
|     event.request.url.includes("/login") ||
 | |
|     event.request.url.includes("/update") ||
 | |
|     event.request.url.includes("/register") ||
 | |
|     event.request.method == "POST" ||
 | |
|     event.request.url.includes("/api/wines/prelottery") ||
 | |
|     event.request.url.includes("/api/virtual") ||
 | |
|     event.request.url.includes("/socket.io")
 | |
|   ) {
 | |
|     event.respondWith(fetch(event.request));
 | |
|     return;
 | |
|   }
 | |
|   if (
 | |
|     event.request.cache === "only-if-cached" &&
 | |
|     event.request.mode !== "same-origin"
 | |
|   )
 | |
|     return;
 | |
| 
 | |
|   if (event.request.url.includes("/api/")) {
 | |
|     event.respondWith(
 | |
|       fetch(event.request)
 | |
|         .then(response => cache(event.request, response))
 | |
|         .catch(function() {
 | |
|           return caches.match(event.request);
 | |
|         })
 | |
|     );
 | |
|   } else {
 | |
|     event.respondWith(
 | |
|       caches
 | |
|         .match(event.request) // check if the request has already been cached
 | |
|         .then(cached => cached || fetch(event.request)) // otherwise request network
 | |
|         .then(
 | |
|           response =>
 | |
|             staticCache(event.request, response) // put response in cache
 | |
|               .then(() => response) // resolve promise with the network response
 | |
|         )
 | |
|     );
 | |
|   }
 | |
| });
 | |
| 
 | |
| function showLocalNotification(title, body, link, swRegistration) {
 | |
|   const options = {
 | |
|     body,
 | |
|     icon: "https://lottis.vin/public/assets/images/favicon.png",
 | |
|     image: "https://lottis.vin/public/assets/images/favicon.png",
 | |
|     vibrate: [300],
 | |
|     data: { link: link }
 | |
|   };
 | |
|   swRegistration.showNotification(title, options);
 | |
| }
 | |
| 
 | |
| async function saveSubscription(subscription) {
 | |
|   const SERVER_URL = "/subscription/save-subscription";
 | |
|   const response = await fetch(SERVER_URL, {
 | |
|     method: "post",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     body: JSON.stringify(subscription)
 | |
|   });
 | |
|   return response.json();
 | |
| }
 | |
| 
 | |
| const urlB64ToUint8Array = base64String => {
 | |
|   const padding = "=".repeat((4 - (base64String.length % 4)) % 4);
 | |
|   const base64 = (base64String + padding)
 | |
|     .replace(/\-/g, "+")
 | |
|     .replace(/_/g, "/");
 | |
|   const rawData = atob(base64);
 | |
|   const outputArray = new Uint8Array(rawData.length);
 | |
|   for (let i = 0; i < rawData.length; ++i) {
 | |
|     outputArray[i] = rawData.charCodeAt(i);
 | |
|   }
 | |
|   return outputArray;
 | |
| };
 | |
| 
 | |
| function addCache(cacheKey, cacheUrls) {
 | |
|   return caches.open(cacheKey).then(cache => {
 | |
|     console.log("Legger til cache", cache);
 | |
|     return cache.addAll(cacheUrls);
 | |
|   });
 | |
| }
 | |
| 
 | |
| function removeCache(cacheKey) {
 | |
|   return caches
 | |
|     .keys()
 | |
|     .then(keys => keys.filter(key => key !== cacheKey))
 | |
|     .then(keys =>
 | |
|       Promise.all(
 | |
|         keys.map(key => {
 | |
|           console.log(`Sletter mellom-lager på nøkkel ${key}`);
 | |
|           return caches.delete(key);
 | |
|         })
 | |
|       )
 | |
|     );
 | |
| }
 | |
| 
 | |
| function staticCache(request, response) {
 | |
|   if (response.type === "error" || response.type === "opaque") {
 | |
|     return Promise.resolve(); // do not put in cache network errors
 | |
|   }
 | |
| 
 | |
|   return caches
 | |
|     .open(CACHE_NAME)
 | |
|     .then(cache => cache.put(request, response.clone()));
 | |
| }
 | |
| 
 | |
| function cache(request, response) {
 | |
|   if (response.type === "error" || response.type === "opaque") {
 | |
|     return response;
 | |
|   }
 | |
| 
 | |
|   return caches.open(CACHE_NAME_API).then(cache => {
 | |
|     cache.put(request, response.clone());
 | |
|     return response;
 | |
|   });
 | |
| }
 |