Skip to content

Commit dc63f59

Browse files
committed
sw: basic logged-out routing
1 parent b295f70 commit dc63f59

File tree

1 file changed

+118
-1
lines changed

1 file changed

+118
-1
lines changed

web/js/sw.js

+118-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22

3-
var version = 4;
3+
var version = 5;
44
var isOnline = true;
55
var isLoggedIn = false;
66
var cacheName = `ramblings-${version}`;
@@ -26,6 +26,7 @@ var urlsToCache = {
2626
self.addEventListener("install",onInstall);
2727
self.addEventListener("activate",onActivate);
2828
self.addEventListener("message",onMessage);
29+
self.addEventListener("fetch",onFetch);
2930

3031
main().catch(console.error);
3132

@@ -117,3 +118,119 @@ function onMessage({ data }) {
117118
console.log(`Service Worker (v${version}) status update... isOnline:${isOnline}, isLoggedIn:${isLoggedIn}`);
118119
}
119120
}
121+
122+
function onFetch(evt) {
123+
evt.respondWith(router(evt.request));
124+
}
125+
126+
async function router(req) {
127+
var url = new URL(req.url);
128+
var reqURL = url.pathname;
129+
var cache = await caches.open(cacheName);
130+
131+
// request for site's own URL?
132+
if (url.origin == location.origin) {
133+
// are we making an API request?
134+
if (/^\/api\/.+$/.test(reqURL)) {
135+
let res;
136+
137+
if (isOnline) {
138+
try {
139+
let fetchOptions = {
140+
method: req.method,
141+
headers: req.headers,
142+
credentials: "same-origin",
143+
cache: "no-store",
144+
};
145+
res = await fetch(req.url,fetchOptions);
146+
if (res && res.ok) {
147+
if (req.method == "GET") {
148+
await cache.put(reqURL,res.clone());
149+
}
150+
return res;
151+
}
152+
}
153+
catch (err) {}
154+
}
155+
156+
res = await cache.match(reqURL);
157+
if (res) {
158+
return res;
159+
}
160+
161+
return notFoundResponse();
162+
}
163+
// are we requesting a page?
164+
else if (req.headers.get("Accept").includes("text/html")) {
165+
// login-aware requests?
166+
if (/^\/(?:login|logout|add-post)$/.test(reqURL)) {
167+
// TODO
168+
}
169+
// otherwise, just use "network-and-cache"
170+
else {
171+
let res;
172+
173+
if (isOnline) {
174+
try {
175+
let fetchOptions = {
176+
method: req.method,
177+
headers: req.headers,
178+
cache: "no-store",
179+
};
180+
res = await fetch(req.url,fetchOptions);
181+
if (res && res.ok) {
182+
if (!res.headers.get("X-Not-Found")) {
183+
await cache.put(reqURL,res.clone());
184+
}
185+
return res;
186+
}
187+
}
188+
catch (err) {}
189+
}
190+
191+
// fetch failed, so try the cache
192+
res = await cache.match(reqURL);
193+
if (res) {
194+
return res;
195+
}
196+
197+
// otherwise, return an offline-friendly page
198+
return cache.match("/offline");
199+
}
200+
}
201+
// all other files use "cache-first"
202+
else {
203+
let res = await cache.match(reqURL);
204+
if (res) {
205+
return res;
206+
}
207+
else {
208+
if (isOnline) {
209+
try {
210+
let fetchOptions = {
211+
method: req.method,
212+
headers: req.headers,
213+
cache: "no-store",
214+
};
215+
res = await fetch(req.url,fetchOptions);
216+
if (res && res.ok) {
217+
await cache.put(reqURL,res.clone());
218+
return res;
219+
}
220+
}
221+
catch (err) {}
222+
}
223+
224+
// otherwise, force a network-level 404 response
225+
return notFoundResponse();
226+
}
227+
}
228+
}
229+
}
230+
231+
function notFoundResponse() {
232+
return new Response("",{
233+
status: 404,
234+
statusText: "Not Found"
235+
});
236+
}

0 commit comments

Comments
 (0)