Attic is a cozy space with lofty ambitions. attic.social
at main 51 lines 1.5 kB view raw
1import { dev } from "$app/environment"; 2import { acceptsLanguages } from "$lib/negotiation"; 3import { restoreSession } from "$lib/server/session"; 4import { isAuthEvent } from "$lib/types"; 5import { error, type Handle, redirect } from "@sveltejs/kit"; 6import { sequence } from "@sveltejs/kit/hooks"; 7 8/** 9 * {@link https://svelte.dev/docs/cli/devtools-json} 10 */ 11const devHandle: Handle = ({ event, resolve }) => { 12 const path = "/.well-known/appspecific/com.chrome.devtools.json"; 13 if (dev && event.url.pathname === path) { 14 return new Response(null, { status: 404 }); 15 } 16 return resolve(event); 17}; 18 19export const defaultHandle: Handle = async ({ event, resolve }) => { 20 if (isAuthEvent(event) === false) { 21 error(500); 22 } 23 24 const languages = acceptsLanguages(event.request); 25 event.locals.locale = languages[0] === "*" ? undefined : languages[0]; 26 27 // [TODO] necessary? 28 // if ( 29 // event.url.searchParams.has("session") || 30 // event.request.headers.has("x-session") || 31 // event.request.headers.get("sec-fetch-mode") === "navigate" || 32 // // event.request.headers.get("sec-fetch-dest") === "empty" 33 // ) { 34 await restoreSession(event); 35 // } 36 37 if ( 38 event.route.id?.startsWith("/(protected)/") && 39 event.locals.user === undefined 40 ) { 41 redirect(307, "/"); 42 } 43 44 return resolve(event, { 45 filterSerializedResponseHeaders: (name: string, _value: string) => { 46 return ["content-type"].includes(name.toLowerCase()); 47 }, 48 }); 49}; 50 51export const handle: Handle = sequence(devHandle, defaultHandle);