Attic is a cozy space with lofty ambitions.
attic.social
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);