Highly ambitious ATProtocol AppView service and sdks
1/// <reference lib="deno.ns" />
2
3import { OAuthClient, SQLiteOAuthStorage } from "@slices/oauth";
4import { SessionStore, SQLiteAdapter, withOAuthSession } from "@slices/session";
5
6const OAUTH_CLIENT_ID = Deno.env.get("OAUTH_CLIENT_ID");
7const OAUTH_CLIENT_SECRET = Deno.env.get("OAUTH_CLIENT_SECRET");
8const OAUTH_REDIRECT_URI = Deno.env.get("OAUTH_REDIRECT_URI");
9const OAUTH_AIP_BASE_URL = Deno.env.get("OAUTH_AIP_BASE_URL");
10const SLICE_URI = Deno.env.get("VITE_SLICE_URI");
11const ADMIN_DIDS = Deno.env.get("VITE_ADMIN_DIDS");
12
13if (
14 !OAUTH_CLIENT_ID ||
15 !OAUTH_CLIENT_SECRET ||
16 !OAUTH_REDIRECT_URI ||
17 !OAUTH_AIP_BASE_URL
18) {
19 throw new Error(
20 "Missing OAuth configuration. Please ensure .env file contains:\n" +
21 "OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_REDIRECT_URI, OAUTH_AIP_BASE_URL",
22 );
23}
24
25if (!SLICE_URI || !ADMIN_DIDS) {
26 throw new Error(
27 "Missing slice configuration. Please ensure .env file contains:\n" +
28 "VITE_SLICE_URI, VITE_ADMIN_DIDS",
29 );
30}
31
32const DATABASE_URL = Deno.env.get("DATABASE_URL") || "slices.db";
33
34// OAuth setup
35export const oauthStorage = new SQLiteOAuthStorage(DATABASE_URL);
36export const oauthConfig = {
37 clientId: OAUTH_CLIENT_ID,
38 clientSecret: OAUTH_CLIENT_SECRET,
39 authBaseUrl: OAUTH_AIP_BASE_URL,
40 redirectUri: OAUTH_REDIRECT_URI,
41 scopes: [
42 "openid",
43 "email",
44 "profile",
45 "atproto",
46 "account:email",
47 "blob:image/*",
48 "repo:network.slices.slice",
49 "repo:network.slices.lexicon",
50 "repo:network.slices.actor.profile",
51 "repo:network.slices.waitlist.request",
52 ],
53};
54
55// Session setup (shared database)
56export const sessionStore = new SessionStore({
57 adapter: new SQLiteAdapter(DATABASE_URL),
58 cookieOptions: {
59 httpOnly: true,
60 secure: Deno.env.get("NODE_ENV") === "production",
61 sameSite: "lax",
62 path: "/",
63 },
64});
65
66// OAuth + Session integration
67export const oauthSessions = withOAuthSession(
68 sessionStore,
69 oauthConfig,
70 oauthStorage,
71 {
72 autoRefresh: true,
73 },
74);
75
76// Helper function to create session-scoped OAuth client
77export function createOAuthClient(sessionId: string): OAuthClient {
78 return new OAuthClient(oauthConfig, oauthStorage, sessionId);
79}
80
81// Export slice configuration
82export { SLICE_URI, ADMIN_DIDS };