54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { logInfo, logError } from '../utils';
|
|
import { ErrorType } from '../types/interfaces';
|
|
import { ErrorClassifier } from './engine';
|
|
|
|
export interface ApiResponse<T> {
|
|
success: boolean;
|
|
data?: T;
|
|
error?: {
|
|
type: ErrorType;
|
|
message: string;
|
|
isRecoverable: boolean;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* ExternalApiHandler: 외부 서비스(Ollama, Gemini, Search API 등)와의
|
|
* 모든 통신을 중앙 집중적으로 관리하며, 인증 복구 및 속도 제한 대응을 담당합니다.
|
|
*/
|
|
export class ExternalApiHandler {
|
|
/**
|
|
* 인증 오류 발생 시 복구 가능성을 판단하고 재시도 로직을 제어합니다.
|
|
*/
|
|
public static async handleAuthRecovery(error: any): Promise<boolean> {
|
|
logInfo(`[ApiHandler] 인증 오류 감지. 복구 시도 중...`);
|
|
// TODO: 실제 프로젝트의 인증 스키마(API Key, OAuth 등)에 따른 복구 로직 구현
|
|
// 예: 환경 변수 재로드, 만료된 토큰 갱신 요청 등
|
|
return false; // 현재는 기본적으로 수동 개입 필요로 처리
|
|
}
|
|
|
|
public static async request<T>(
|
|
call: () => Promise<T>,
|
|
context: string
|
|
): Promise<ApiResponse<T>> {
|
|
try {
|
|
const data = await call();
|
|
return { success: true, data };
|
|
} catch (error: any) {
|
|
logError(`[ApiHandler] [${context}] 호출 실패:`, error);
|
|
|
|
// ErrorClassifier를 통해 시스템 통합 분류 적용
|
|
const { type, rule } = ErrorClassifier.classify(error);
|
|
|
|
return {
|
|
success: false,
|
|
error: {
|
|
type,
|
|
message: error.message,
|
|
isRecoverable: type === ErrorType.TRANSIENT || type === ErrorType.AUTH_FAILURE
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|