···11-import type { PrivateUserData } from "$lib/valibot.ts";
11+import type { PrivateUserData } from "$lib/valibot";
22import type { OAuthClient } from "@atcute/oauth-node-client";
3344declare global {
+6-2
src/hooks.server.ts
···11import { dev } from "$app/environment";
22-import type { Handle } from "@sveltejs/kit";
22+import { restoreSession } from "$lib/server/session";
33+import { isAuthEvent } from "$lib/types";
44+import { error, type Handle } from "@sveltejs/kit";
35import { sequence } from "@sveltejs/kit/hooks";
44-import { restoreSession } from "./lib/server/session.ts";
5667/**
78 * {@link https://svelte.dev/docs/cli/devtools-json}
···1516};
16171718export const defaultHandle: Handle = async ({ event, resolve }) => {
1919+ if (isAuthEvent(event) === false) {
2020+ error(500);
2121+ }
1822 // [TODO] necessary?
1923 // if (
2024 // event.url.searchParams.has("session") ||
+4-9
src/lib/server/oauth.ts
···11import { dev } from "$app/environment";
22-import type {} from "$lexicons/index.ts";
32import {
43 OAUTH_COOKIE_PREFIX,
54 OAUTH_MAX_AGE,
65 SESSION_MAX_AGE,
77-} from "$lib/server/constants.ts";
88-import { decryptText, encryptText } from "$lib/server/crypto.ts";
66+} from "$lib/server/constants";
77+import { decryptText, encryptText } from "$lib/server/crypto";
88+import type { AuthEvent } from "$lib/types";
99import {
1010 CompositeDidDocumentResolver,
1111 CompositeHandleResolver,
···101101 }
102102}
103103104104-export function createOAuthClient(
105105- event: { cookies: Cookies; locals: App.Locals; platform?: App.Platform },
106106-): OAuthClient {
107107- if (event.platform === undefined) {
108108- throw new Error();
109109- }
104104+export function createOAuthClient(event: AuthEvent): OAuthClient {
110105 if (event.locals.oAuthClient) {
111106 return event.locals.oAuthClient;
112107 }
+11-9
src/lib/server/session.ts
···44 OAUTH_MAX_AGE,
55 SESSION_COOKIE,
66 SESSION_MAX_AGE,
77-} from "$lib/server/constants.ts";
88-import { decryptText, encryptText } from "$lib/server/crypto.ts";
99-import { createOAuthClient } from "$lib/server/oauth.ts";
1010-import { parsePublicUser, type PublicUserData } from "$lib/valibot.ts";
77+} from "$lib/server/constants";
88+import { decryptText, encryptText } from "$lib/server/crypto";
99+import { createOAuthClient } from "$lib/server/oauth";
1010+import type { AuthEvent } from "$lib/types";
1111+import { parsePublicUser, type PublicUserData } from "$lib/valibot";
1112import { Client } from "@atcute/client";
1213import { isHandle } from "@atcute/lexicons/syntax";
1313-import type { RequestEvent } from "@sveltejs/kit";
14141515/**
1616 * Logout
1717 */
1818export const destroySession = async (
1919- event: RequestEvent,
1919+ event: AuthEvent,
2020): Promise<void> => {
2121 event.cookies.delete(SESSION_COOKIE, { path: "/" });
2222 if (event.locals.user) {
···3636 * @returns {URL} OAuth redirect
3737 */
3838export const startSession = async (
3939- event: RequestEvent,
3939+ event: AuthEvent,
4040 handle: string,
4141): Promise<URL> => {
4242 if (isHandle(handle) === false) {
···6565 * Store the logged in user data
6666 */
6767export const updateSession = async (
6868- event: RequestEvent,
6868+ event: AuthEvent,
6969 user: PublicUserData,
7070) => {
7171 const { cookies, platform } = event;
···9292/**
9393 * Setup OAuth client from cookies
9494 */
9595-export const restoreSession = async (event: RequestEvent): Promise<void> => {
9595+export const restoreSession = async (
9696+ event: AuthEvent,
9797+): Promise<void> => {
9698 const { cookies, platform } = event;
9799 if (platform?.env === undefined) {
98100 throw new Error();
+9
src/lib/types.ts
···11+import type { RequestEvent } from "@sveltejs/kit";
22+33+export type AuthEvent = RequestEvent & {
44+ platform: App.Platform;
55+};
66+77+export const isAuthEvent = (event: RequestEvent): event is AuthEvent => {
88+ return event.platform?.env !== undefined;
99+};
+2-2
src/routes/+layout.server.ts
···11-import type { PublicUserData } from "$lib/valibot.ts";
22-import type { LayoutServerLoad } from "./$types.d.ts";
11+import type { PublicUserData } from "$lib/valibot";
22+import type { LayoutServerLoad } from "./$types";
3344export const load: LayoutServerLoad = (event) => {
55 let user: PublicUserData | undefined = undefined;
+22-5
src/routes/+page.server.ts
···11-import { HANDLE_COOKIE } from "$lib/server/constants.ts";
11+import { HANDLE_COOKIE } from "$lib/server/constants";
22import {
33 destroySession,
44 startSession,
55 updateSession,
66-} from "$lib/server/session.ts";
66+} from "$lib/server/session";
77+import { isAuthEvent } from "$lib/types";
88+import { parseActorProfile } from "$lib/valibot";
79import { Client } from "@atcute/client";
810import { type Actions, fail, redirect } from "@sveltejs/kit";
99-import { parseActorProfile } from "../lib/valibot.ts";
10111112export const actions = {
1213 logout: async (event) => {
1414+ if (isAuthEvent(event) === false) {
1515+ throw new Error();
1616+ }
1317 await destroySession(event);
1418 redirect(303, "/");
1519 },
1620 login: async (event) => {
2121+ if (isAuthEvent(event) === false) {
2222+ throw new Error();
2323+ }
1724 const formData = await event.request.formData();
1825 const handle = formData.get("handle");
1926 let url: URL;
···2734 redirect(303, url);
2835 },
2936 displayName: async (event) => {
3030- if (event.locals.user === undefined) return;
3737+ if (isAuthEvent(event) === false) {
3838+ throw new Error();
3939+ }
4040+ if (event.locals.user === undefined) {
4141+ return;
4242+ }
3143 const { user } = event.locals;
3244 try {
3345 const formData = await event.request.formData();
···5870 }
5971 },
6072 purge: async (event) => {
7373+ if (isAuthEvent(event) === false) {
7474+ throw new Error();
7575+ }
6176 const { user } = event.locals;
6262- if (user === undefined) return;
7777+ if (user === undefined) {
7878+ return;
7979+ }
6380 const rpc = new Client({ handler: user.session });
6481 const result = await rpc.post("com.atproto.repo.deleteRecord", {
6582 input: {
+2-1
src/routes/+page.svelte
···55</script>
6677<script lang="ts">
88- import type { PageProps } from "./$types.d.ts";
88+ import type { PageProps } from "./$types";
99 let { data, form }: PageProps = $props();
10101111 let handle = $derived(String(form?.handle ?? ""));
···179179 tabindex="-1"
180180 >
181181 {#each bskyUsers as user, i (user.did)}
182182+ <!-- svelte-ignore a11y_click_events_have_key_events -->
182183 <li
183184 class="avatar"
184185 role="option"
+6-2
src/routes/.well-known/jwks.json/+server.ts
···11-import { createOAuthClient } from "$lib/server/oauth.ts";
11+import { createOAuthClient } from "$lib/server/oauth";
22+import { isAuthEvent } from "$lib/types";
23import { error, json } from "@sveltejs/kit";
33-import type { RequestHandler } from "./$types.d.ts";
44+import type { RequestHandler } from "./$types";
4556export const GET: RequestHandler = (event) => {
67 try {
88+ if (isAuthEvent(event) === false) {
99+ throw new Error();
1010+ }
711 const oAuthClient = createOAuthClient(event);
812 return json(oAuthClient.jwks ?? { keys: [] });
913 } catch {
+1-1
src/routes/avatar/[did]/+server.ts
···22import { ok } from "@atcute/client";
33import { isDid } from "@atcute/lexicons/syntax";
44import { error } from "@sveltejs/kit";
55-import type { RequestHandler } from "./$types.d.ts";
55+import type { RequestHandler } from "./$types";
6677export const GET: RequestHandler = async (event) => {
88 const { params: { did }, locals: { user } } = event;
+1-1
src/routes/favicon.ico/+server.ts
···11import { error } from "@sveltejs/kit";
22-import type { RequestHandler } from "./$types.d.ts";
22+import type { RequestHandler } from "./$types";
3344export const GET: RequestHandler = async (event) => {
55 if (event.platform === undefined) {
+6-2
src/routes/oauth-client-metadata.json/+server.ts
···11-import { createOAuthClient } from "$lib/server/oauth.ts";
11+import { createOAuthClient } from "$lib/server/oauth";
22+import { isAuthEvent } from "$lib/types";
23import { error, json } from "@sveltejs/kit";
33-import type { RequestHandler } from "./$types.d.ts";
44+import type { RequestHandler } from "./$types";
4556export const GET: RequestHandler = (event) => {
67 try {
88+ if (isAuthEvent(event) === false) {
99+ throw new Error();
1010+ }
711 const oAuthClient = createOAuthClient(event);
812 return json(oAuthClient.metadata);
913 } catch {
+8-7
src/routes/oauth/callback/+server.ts
···11-import { HANDLE_COOKIE } from "$lib/server/constants.ts";
22-import { createOAuthClient } from "$lib/server/oauth.ts";
33-import { parseActorProfile, type PublicUserData } from "$lib/valibot.ts";
11+import { HANDLE_COOKIE } from "$lib/server/constants";
22+import { createOAuthClient } from "$lib/server/oauth";
33+import { updateSession } from "$lib/server/session";
44+import { isAuthEvent } from "$lib/types";
55+import { parseActorProfile, type PublicUserData } from "$lib/valibot";
46import { AppBskyActorGetProfile } from "@atcute/bluesky";
57import { Client, ok } from "@atcute/client";
68import { isHandle } from "@atcute/lexicons/syntax";
79import type { OAuthSession } from "@atcute/oauth-node-client";
810import { redirect } from "@sveltejs/kit";
99-import { updateSession } from "../../../lib/server/session.ts";
1010-import type { RequestHandler } from "./$types.d.ts";
1111+import type { RequestHandler } from "./$types";
11121213export const GET: RequestHandler = async (event) => {
1313- const { cookies, platform, url } = event;
1414- if (platform?.env === undefined) {
1414+ if (isAuthEvent(event) === false) {
1515 throw new Error();
1616 }
1717+ const { cookies, url } = event;
17181819 const handle = cookies.get(HANDLE_COOKIE);
1920 if (isHandle(handle) === false) {