Superpowered to do lists. No signup required.
1import { Agent } from "@atproto/api";
2import { atclient } from "$lib/atproto";
3
4import { decryptToString } from "$lib/server/encryption";
5import { decodeBase64, decodeBase64urlIgnorePadding } from "@oslojs/encoding";
6
7import type { Handle } from "@sveltejs/kit";
8import { ENCRYPTION_PASSWORD } from "$env/static/private";
9
10// runs everytime there's a new request
11export const handle: Handle = async ({ event, resolve }) => {
12 const sid = event.cookies.get("sid");
13
14 // if there is a session cookie
15 if (sid) {
16 // if a user is already authed, skip reauthing
17 if (event.locals.user) { return resolve(event); }
18
19 // decrypt session cookie
20 const decoded = decodeBase64urlIgnorePadding(sid);
21 const key = decodeBase64(ENCRYPTION_PASSWORD);
22 const decrypted = await decryptToString(key, decoded);
23
24 // get oauth session from client using decrypted cookie
25 const oauthSession = await atclient.restore(decrypted);
26
27 // set the authed agent
28 const authedAgent = new Agent(oauthSession);
29 if (!event.locals.authedAgent) {
30 event.locals.authedAgent = authedAgent;
31 }
32
33 // set the authed user with decrypted session DID
34 const user = await authedAgent.getProfile({ actor: decrypted });
35 event.locals.user = user.data;
36 }
37
38 return resolve(event);
39}
40
41