import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';
import { getConfig } from '../config/index.js';
import { ErrorResponse } from '../types/limitless.js';
export class LimitlessClient {
private client: AxiosInstance;
private config = getConfig();
constructor() {
this.client = axios.create({
baseURL: this.config.limitless.baseUrl,
headers: {
'X-API-Key': this.config.limitless.apiKey,
'Content-Type': 'application/json',
},
timeout: 30000, // 30 seconds
});
// Add response interceptor for error handling
this.client.interceptors.response.use(
(response) => response,
(error: AxiosError<ErrorResponse>) => {
if (error.response?.data?.error) {
const apiError = error.response.data.error;
throw new Error(`Limitless API error (${error.response.status}): ${apiError.message}`);
} else if (error.response) {
throw new Error(`Limitless API error (${error.response.status}): ${error.message}`);
} else if (error.request) {
throw new Error(`Network error: ${error.message}`);
} else {
throw error;
}
}
);
}
async request<T>(endpoint: string, options?: AxiosRequestConfig): Promise<T> {
const response = await this.client.request<T>({
url: endpoint,
...options,
});
return response.data;
}
async get<T>(endpoint: string, params?: any): Promise<T> {
return this.request<T>(endpoint, { method: 'GET', params });
}
async post<T>(endpoint: string, data?: any): Promise<T> {
return this.request<T>(endpoint, { method: 'POST', data });
}
async patch<T>(endpoint: string, data?: any): Promise<T> {
return this.request<T>(endpoint, { method: 'PATCH', data });
}
async delete<T>(endpoint: string): Promise<T> {
return this.request<T>(endpoint, { method: 'DELETE' });
}
}