| 
									
										
										
										
											2024-07-16 16:11:14 +02:00
										 |  |  | const version = "0.0.0" | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  | async function clearCaches(exceptVersion = undefined) { | 
					
						
							|  |  |  |     const keys = await caches.keys() | 
					
						
							|  |  |  |     await Promise.all(keys.map((k) => k !== version && caches.delete(k))) | 
					
						
							|  |  |  |     console.log("Cleared caches") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | async function activate() { | 
					
						
							|  |  |  |     console.log("Activating service worker") | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  |     await clearCaches(version) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function fetchAndCache(event: ServiceWorkerFetchEvent): Promise<Response> { | 
					
						
							|  |  |  |     let networkResponse = await fetch(event.request) | 
					
						
							|  |  |  |     let cache = await caches.open(version) | 
					
						
							|  |  |  |     await cache.put(event.request, networkResponse.clone()) | 
					
						
							|  |  |  |     console.log("Cached", event.request) | 
					
						
							|  |  |  |     return networkResponse | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  | async function cacheFirst(event: ServiceWorkerFetchEvent, attemptUpdate: boolean = false) { | 
					
						
							|  |  |  |     const cacheResponse = await caches.match(event.request, { ignoreSearch: true }) | 
					
						
							|  |  |  |     if (cacheResponse === undefined) { | 
					
						
							|  |  |  |         return fetchAndCache(event) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     console.debug("Loaded from cache: ", event.request) | 
					
						
							|  |  |  |     if (attemptUpdate) { | 
					
						
							|  |  |  |         fetchAndCache(event) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return cacheResponse | 
					
						
							| 
									
										
										
										
											2024-07-16 16:11:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 12:48:15 +02:00
										 |  |  | const neverCache: RegExp[] = [/\.html$/, /service-worker/] | 
					
						
							|  |  |  | const neverCacheHost: RegExp[] = [/127\.0\.0\.[0-9]+/, /\.local/, /\.gitpod\.io/, /localhost/] | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | async function handleRequest(event: ServiceWorkerFetchEvent) { | 
					
						
							|  |  |  |     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...") | 
					
						
							| 
									
										
										
										
											2024-09-02 12:48:15 +02:00
										 |  |  |         await event.respondWith(new Response(JSON.stringify({ "service-worker-version": version }))) | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  |         return | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (requestUrl.pathname.endsWith("/service-worker-clear")) { | 
					
						
							|  |  |  |         await clearCaches() | 
					
						
							| 
									
										
										
										
											2024-09-02 12:48:15 +02:00
										 |  |  |         await event.respondWith(new Response(JSON.stringify({ "cache-cleared": true }))) | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  |         return | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const shouldBeCached = | 
					
						
							|  |  |  |         origin.host === requestUrl.host && | 
					
						
							| 
									
										
										
										
											2024-09-02 12:48:15 +02:00
										 |  |  |         !neverCacheHost.some((blacklisted) => origin.host.match(blacklisted)) && | 
					
						
							|  |  |  |         !neverCache.some((blacklisted) => event.request.url.match(blacklisted)) | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  |     if (!shouldBeCached) { | 
					
						
							|  |  |  |         console.debug("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 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     await event.respondWith(await cacheFirst(event)) | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  |     const event: ServiceWorkerFetchEvent = <ServiceWorkerFetchEvent>e | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2024-08-26 03:42:02 +02:00
										 |  |  |         await handleRequest(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
										 |  |  |     } | 
					
						
							|  |  |  | }) |