Highly ambitious ATProtocol AppView service and sdks
at main 82 lines 2.3 kB view raw
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 };