A social knowledge tool for researchers built on ATProto
at development 84 lines 2.4 kB view raw
1import { BaseClient } from './BaseClient'; 2import { 3 LoginWithAppPasswordRequest, 4 InitiateOAuthSignInRequest, 5 CompleteOAuthSignInRequest, 6 RefreshAccessTokenRequest, 7 GenerateExtensionTokensRequest, 8 LoginWithAppPasswordResponse, 9 InitiateOAuthSignInResponse, 10 CompleteOAuthSignInResponse, 11 RefreshAccessTokenResponse, 12 GenerateExtensionTokensResponse, 13} from '../types'; 14 15export class UserClient extends BaseClient { 16 async loginWithAppPassword( 17 request: LoginWithAppPasswordRequest, 18 ): Promise<LoginWithAppPasswordResponse> { 19 return this.request<LoginWithAppPasswordResponse>( 20 'POST', 21 '/api/users/login/app-password', 22 request, 23 ); 24 } 25 26 async initiateOAuthSignIn( 27 request?: InitiateOAuthSignInRequest, 28 ): Promise<InitiateOAuthSignInResponse> { 29 const params = new URLSearchParams(); 30 if (request?.handle) { 31 params.set('handle', request.handle); 32 } 33 const queryString = params.toString(); 34 const endpoint = queryString 35 ? `/api/users/login?${queryString}` 36 : '/api/users/login'; 37 return this.request<InitiateOAuthSignInResponse>('GET', endpoint); 38 } 39 40 async completeOAuthSignIn( 41 request: CompleteOAuthSignInRequest, 42 ): Promise<CompleteOAuthSignInResponse> { 43 const params = new URLSearchParams({ 44 code: request.code, 45 state: request.state, 46 iss: request.iss, 47 }); 48 return this.request<CompleteOAuthSignInResponse>( 49 'GET', 50 `/api/users/oauth/callback?${params}`, 51 ); 52 } 53 54 async refreshAccessToken( 55 request: RefreshAccessTokenRequest, 56 ): Promise<RefreshAccessTokenResponse> { 57 return this.request<RefreshAccessTokenResponse>( 58 'POST', 59 '/api/users/oauth/refresh', 60 request, 61 ); 62 } 63 64 async generateExtensionTokens( 65 request?: GenerateExtensionTokensRequest, 66 ): Promise<GenerateExtensionTokensResponse> { 67 return this.request<GenerateExtensionTokensResponse>( 68 'GET', 69 '/api/users/extension/tokens', 70 ); 71 } 72 73 async logout(): Promise<{ success: boolean; message: string }> { 74 if (!this.tokenManager) { 75 throw new Error('TokenManager is required for logout'); 76 } 77 const refreshToken = await this.tokenManager.getRefreshToken(); 78 return this.request<{ success: boolean; message: string }>( 79 'POST', 80 '/api/users/logout', 81 { refreshToken }, 82 ); 83 } 84}