UNPKG

@gooin/garmin-connect

Version:

Makes it simple to interface with Garmin Connect to get or set any data point

174 lines (173 loc) 4.92 kB
import { AxiosInstance, AxiosRequestConfig, AxiosResponse, RawAxiosRequestHeaders } from 'axios'; import OAuth from 'oauth-1.0a'; import { MFAManager } from './MFAManager'; import { UrlClass } from '../garmin/UrlClass'; import { GCConfig, IOauth1, IOauth1Consumer, IOauth1Token, IOauth2Token } from '../garmin/types'; export declare class HttpClient { client: AxiosInstance; url: UrlClass; config: GCConfig; oauth1Token: IOauth1Token | undefined; oauth2Token: IOauth2Token | undefined; OAUTH_CONSUMER: IOauth1Consumer | undefined; mfaManager: MFAManager; constructor(url: UrlClass, config: GCConfig); /** * 设置请求和响应拦截器 */ private setupInterceptors; /** * 记录响应跟踪信息 */ private logResponseTracking; /** * 处理响应错误 */ private handleResponseError; /** * 获取OAuth消费者信息 */ fetchOauthConsumer(): Promise<void>; /** * 检查令牌有效性 */ checkTokenVaild(): Promise<void>; /** * GET请求 */ get<T>(url: string, config?: AxiosRequestConfig<any>): Promise<T>; /** * POST请求 */ post<T>(url: string, data: any, config?: AxiosRequestConfig<any>): Promise<T>; /** * PUT请求 */ put<T>(url: string, data: any, config?: AxiosRequestConfig<any>): Promise<T>; /** * DELETE请求 */ delete<T>(url: string, config?: AxiosRequestConfig<any>): Promise<T>; /** * 设置通用请求头 */ setCommonHeader(headers: RawAxiosRequestHeaders): void; /** * 处理错误 */ handleError(response: AxiosResponse): void; /** * 处理HTTP错误 */ handleHttpError(response: AxiosResponse): void; /** * 登录到Garmin Connect * @param username 用户名 * @param password 密码 * @param mfaCallback MFA验证回调函数 * @param sessionId 会话ID,用于分步登录 * @returns Promise<HttpClient> */ login(username: string, password: string, sessionId?: string): Promise<HttpClient>; /** * 获取登录票据 * @param username 用户名 * @param password 密码 * @param mfaCallback MFA验证回调函数 * @param sessionId 会话ID,用于分步登录 * @returns 登录票据 */ private getLoginTicket; /** * 准备登录参数 */ private prepareLoginParams; /** * 执行登录步骤1:设置cookie */ private performLoginStep1; /** * 执行登录步骤2:获取CSRF令牌 */ private performLoginStep2; /** * 执行登录步骤3:提交凭据 */ private performLoginStep3; /** * 判断是否需要MFA验证 */ private isMFARequired; /** * 从响应中提取票据 */ private extractTicket; /** * 处理MFA验证(使用直接提供的验证码) * @param htmlStr HTML响应字符串 * @param signinParams 登录参数 * @param mfaCode MFA验证码 * @returns MFA验证后的响应字符串 */ handleMFAWithCode(htmlStr: string, signinParams: Record<string, any>, mfaCode: string): Promise<string>; /** * 处理MFA验证 * @param htmlStr HTML响应字符串 * @param signinParams 登录参数 * @param mfaCallback MFA验证回调函数 * @returns MFA验证后的响应字符串 */ handleMFA(htmlStr: string, signinParams: Record<string, any>, mfaCallback?: () => Promise<string>): Promise<string>; /** * 提交MFA验证码 */ private submitMFACode; /** * 验证MFA结果 */ private validateMFAResult; /** * 从HTML中提取CSRF令牌 * @param html HTML字符串 * @returns CSRF令牌或null */ extractCsrfToken(html: string): string | null; /** * 处理页面标题 * @param htmlStr HTML字符串 * @returns 页面标题 */ handlePageTitle(htmlStr: string): string; /** * 处理账户锁定状态 * @param htmlStr HTML字符串 */ handleAccountLocked(htmlStr: string): void; /** * 刷新OAuth2令牌 */ refreshOauth2Token(): Promise<void>; /** * 获取OAuth1令牌 * @param ticket 登录票据 * @returns OAuth1令牌和客户端 */ getOauth1Token(ticket: string): Promise<IOauth1>; /** * 获取OAuth客户端 * @param consumer OAuth消费者信息 * @returns OAuth客户端 */ getOauthClient(consumer: IOauth1Consumer): OAuth; /** * 交换OAuth2令牌 * @param oauth1 OAuth1令牌和客户端 */ exchange(oauth1: IOauth1): Promise<void>; /** * 设置OAuth2令牌过期时间 * @param token OAuth2令牌 * @returns 设置了过期时间的OAuth2令牌 */ setOauth2TokenExpiresAt(token: IOauth2Token): IOauth2Token; }