A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: make offline service worker also handle server outages

+24 -15
+24 -15
src/service-worker-offline.js
··· 134 134 async function handleFetch(request) { 135 135 // When we know we're offline, skip the network entirely. 136 136 if (navigator.onLine) { 137 - const response = await fetch(request); 138 - 139 - // Partial content (range requests) — return as-is, do not cache. 140 - if (response.status === 206) return response; 141 - 142 - // Skip caching audio/video. 143 - const contentType = response.headers.get("content-type") ?? ""; 144 - if (MEDIA_CONTENT_TYPE.test(contentType)) return response; 145 - 146 - // Cache full successful responses, including opaque cross-origin ones. 147 - if (response.status === 200 || response.type === "opaque") { 148 - store(request, response.clone()); 149 - } 150 - 151 - return response; 137 + try { 138 + return await fetchAndStore(request); 139 + } catch {} 152 140 } 153 141 154 142 const cached = await lookup(request); ··· 159 147 statusText: "Unavailable asset, not cached", 160 148 }); 161 149 } 150 + 151 + /** 152 + * @param {Request} request 153 + */ 154 + async function fetchAndStore(request) { 155 + const response = await fetch(request); 156 + 157 + // Partial content (range requests) — return as-is, do not cache. 158 + if (response.status === 206) return response; 159 + 160 + // Skip caching audio/video. 161 + const contentType = response.headers.get("content-type") ?? ""; 162 + if (MEDIA_CONTENT_TYPE.test(contentType)) return response; 163 + 164 + // Cache full successful responses, including opaque cross-origin ones. 165 + if (response.status === 200 || response.type === "opaque") { 166 + store(request, response.clone()); 167 + } 168 + 169 + return response; 170 + }