Read-it-later social network
at main 1.2 kB view raw
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 event.locals.authedAgent = authedAgent; 30 31 // set the authed user with decrypted session DID 32 const user = await authedAgent.getProfile({ actor: decrypted }); 33 event.locals.user = user.data; 34 } 35 36 return resolve(event); 37}