import { BrowserOAuthClient } from '@atproto/oauth-client-browser' import { Agent } from '@atproto/api' // client_id must always point to the publicly accessible metadata file // so the PDS can fetch it — even in local dev. const PROD_URL = 'https://coffee.apoena.dev' // redirect_uri is dynamic so local dev redirects back to localhost const ORIGIN = window.location.origin let _client: BrowserOAuthClient | null = null export function getOAuthClient(): BrowserOAuthClient { if (!_client) { _client = new BrowserOAuthClient({ clientMetadata: { client_id: `${PROD_URL}/client-metadata.json`, client_name: 'Coffee Map', client_uri: PROD_URL, redirect_uris: [`${ORIGIN}/oauth/callback`], grant_types: ['authorization_code', 'refresh_token'], response_types: ['code'], scope: 'atproto transition:generic', dpop_bound_access_tokens: true, token_endpoint_auth_method: 'none', application_type: 'web', }, handleResolver: 'https://bsky.social', }) } return _client } export function createAgent(session: Awaited>): Agent { if (!session) throw new Error('No session') return new Agent(session) }