[READ-ONLY] Mirror of https://github.com/flo-bit/bluesky-website-generator.
bluesky-website-generator.vercel.app
1.3 kB
43 lines
1import { atclient } from '$lib/server/client';
2import { Agent, AtpBaseClient } from '@atproto/api';
3
4import { decryptToString } from '$lib/server/crypts';
5import { decodeBase64, decodeBase64urlIgnorePadding } from '@oslojs/encoding';
6
7import type { Handle } from '@sveltejs/kit';
8import { env } from '$env/dynamic/private';
9
10export const handle: Handle = async ({ event, resolve }) => {
11 const sid = event.cookies.get('sid');
12 if (sid) {
13 try {
14 if (event.locals.user) {
15 return resolve(event);
16 }
17 const decoded = decodeBase64urlIgnorePadding(sid);
18 const key = decodeBase64(env.KEY ?? '');
19 const decrypted = await decryptToString(key, decoded);
20 const oauthSession = await atclient.restore(decrypted);
21
22 const agent = new Agent(oauthSession);
23 event.locals.agent = agent;
24
25 const user = await agent.getProfile({ actor: decrypted });
26 event.locals.user = user.data;
27 } catch (error) {
28 console.error(error);
29 event.cookies.delete('sid', { path: '/' });
30
31 const agent = new AtpBaseClient({ service: 'https://api.bsky.app' });
32 event.locals.agent = agent;
33 }
34 } else {
35 if (event.locals.agent) {
36 return resolve(event);
37 }
38 const agent = new AtpBaseClient({ service: 'https://api.bsky.app' });
39 event.locals.agent = agent;
40 }
41
42 return resolve(event);
43};