| 
									
										
										
										
											2022-06-03 13:41:49 +02:00
										 |  |  | const version = "0.0.8-GITHUB-COMMIT" | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | interface ServiceWorkerFetchEvent extends Event { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     request: RequestInfo & { url: string } | 
					
						
							|  |  |  |     respondWith: (response: any | PromiseLike<Response>) => Promise<void> | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function install() { | 
					
						
							|  |  |  |     console.log("Installing service worker!") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | addEventListener("install", (e) => (<any>e).waitUntil(install())) | 
					
						
							|  |  |  | addEventListener("activate", (e) => (<any>e).waitUntil(activate())) | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | async function activate() { | 
					
						
							|  |  |  |     console.log("Activating service worker") | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     caches | 
					
						
							|  |  |  |         .keys() | 
					
						
							|  |  |  |         .then((keys) => { | 
					
						
							|  |  |  |             // Remove all old caches
 | 
					
						
							|  |  |  |             Promise.all(keys.map((key) => key !== version && caches.delete(key))) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .catch(console.error) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 17:47:30 +01:00
										 |  |  | const cacheFirst = async (event) => { | 
					
						
							|  |  |  |     await event.respondWith( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         caches.match(event.request, { ignoreSearch: true }).then((cacheResponse) => { | 
					
						
							|  |  |  |             if (cacheResponse !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  |                 console.log("Loaded from cache: ", event.request) | 
					
						
							|  |  |  |                 return cacheResponse | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return fetch(event.request).then((networkResponse) => { | 
					
						
							|  |  |  |                 return caches.open(version).then((cache) => { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     cache.put(event.request, networkResponse.clone()) | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  |                     console.log("Cached", event.request) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     return networkResponse | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  |                 }) | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 17:47:30 +01:00
										 |  |  | self.addEventListener("fetch", async (e) => { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     // Important: this lambda must run synchronously, as the browser will otherwise handle the request
 | 
					
						
							|  |  |  |     const event = <ServiceWorkerFetchEvent>e | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |         const origin = new URL(self.origin) | 
					
						
							|  |  |  |         const requestUrl = new URL(event.request.url) | 
					
						
							|  |  |  |         if (requestUrl.pathname.endsWith("service-worker-version")) { | 
					
						
							|  |  |  |             console.log("Sending version number...") | 
					
						
							| 
									
										
										
										
											2023-02-24 17:47:30 +01:00
										 |  |  |             await event.respondWith( | 
					
						
							|  |  |  |                 new Response(JSON.stringify({ "service-worker-version": version })) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const shouldBeCached = | 
					
						
							|  |  |  |             origin.host === requestUrl.host && | 
					
						
							|  |  |  |             origin.hostname !== "127.0.0.1" && | 
					
						
							|  |  |  |             origin.hostname !== "localhost" && | 
					
						
							|  |  |  |             !origin.host.endsWith(".gitpod.io") | 
					
						
							|  |  |  |         if (!shouldBeCached) { | 
					
						
							|  |  |  |             console.log("Not intercepting ", requestUrl.toString(), origin.host, requestUrl.host) | 
					
						
							|  |  |  |             // We return _without_ calling event.respondWith, which signals the browser that it'll have to handle it himself
 | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-02-24 17:47:30 +01:00
										 |  |  |         await cacheFirst(event) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     } catch (e) { | 
					
						
							|  |  |  |         console.error("CRASH IN SW:", e) | 
					
						
							| 
									
										
										
										
											2023-02-24 17:47:30 +01:00
										 |  |  |         await event.respondWith(fetch(event.request.url)) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | }) |