A self-hosted orchestration system crafted for power users. composia.xyz
Something went wrong. Try again.
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950import type { Handle } from "@sveltejs/kit";
import { redirect } from "@sveltejs/kit";
import { readSessionToken, sessionCookie } from "$lib/server/session";
import { jsonApiError } from "$lib/server/controller-route";import { normalizeLocale } from "$lib/i18n/locales";
const publicRoutes = new Set(["/login"]);
export const handle: Handle = async ({ event, resolve }) => { const locale = normalizeLocale(event.cookies.get("composia.locale")); const user = readSessionToken(event.cookies.get(sessionCookie())); event.locals.user = user;
const pathname = event.url.pathname; const isPublicRoute = isPublicPath(pathname); if (!user && !isPublicRoute) { if (isDocumentRequest(event)) { throw redirect( 303, `/login?next=${encodeURIComponent(pathname + event.url.search)}`, ); } return jsonApiError("AUTHENTICATION_REQUIRED", 401); }
if (user && pathname === "/login") { throw redirect(303, event.url.searchParams.get("next") || "/"); }
return resolve(event, { transformPageChunk: ({ html }) => html.replace('<html lang="en"', `<html lang="${locale}"`), });};
function isPublicPath(pathname: string) { if (publicRoutes.has(pathname)) { return true; } return pathname.startsWith("/favicon") || pathname.startsWith("/manifest");}
function isDocumentRequest(event: Parameters<Handle>[0]["event"]) { const accept = event.request.headers.get("accept") ?? ""; return event.request.method === "GET" && accept.includes("text/html");}