// Cannot use Set-Cookie header for security reasons, use IndexedDB instead self.addEventListener("fetch", event =>{ //TODO: make an endpoint to set the localStorage up then set the form to go to there and have it HTTP 302 or 307 with handle_html for html responses and handle_redirect for the other case event.respondWith((async ()=>{ const resp = await fetch(event.request); const body = await resp.text(); const url = new URL(event.request.url); if(url.pathname.endsWith("light-dark-toggle")){ return await handle_redirect(req); } else { return await handle_html(req,resp); } })()); }) async function handle_redirect(req){ const go_back_to = req.referrer; const db_req = self.indexedDB.open("light-dark-store"); const up_promise = new Promise((res)=>{ db_req.onupgradeneeded = (event) => { const db = event.target.result; IDB_cond_create(db, "light-dark-store", {}).then(res); } }); const suc_promise = new Promise((res)=>{ db_req.onsuccess = (event) => { const db = event.target.result; const transaction = db.transaction("light-dark-store"); transaction.oncomplete = res; transaction.objectStore("light-dark-store", "readwrite"); toggleLightDark(transaction); transaction.commit(); }; }); await Promise.all([up_promise, suc_promise]); const referrer = request.headers.get('Referer') || '/'; return new Response("You should be getting redirected back to the page you came from shortly",{ status: 302, headers: { 'Location': referrer } }); } function IDB_cond_create(db, objectStoreName, opts={}){ return new Promise((res)=>{ if(!db.objectStoreNames.contains(objectStoreName)){ db.createObjectStore(objectStoreName, opts); res(); }); } function toggleLightDark(transaction){ return new Promise((res)=>{ const obj_store = transaction.objectStore("light-dark-store"); const grab = obj_store.get(1); grab.onsuccess = (event)=>{ const val = event.result; if(val){ const yeet = obj_store.delete(1); yeet.onsuccess = res; } else { const plonk = obj_store.add({id:1}); plonk.onsuccess = res; } } }); } async function handle_html(req, resp){ // TODO: read from indexDB to figure out if we fiddle with the body classes or not const obj_store = transaction.objectStore("light-dark-store"); const grab = obj_store.get(1); const toggled = await (new Promise((res)=>{ grab.onsuccess = (event)=>{ const val = event.result; const toggled = !!val; res(toggled); } })); if(!toggled) return resp; return new Response(body.replace("", ''), { headers:resp.headers, status: resp.status }); }