UNPKG

@searcly/sdk

Version:
105 lines (94 loc) 2.9 kB
import axios, { AxiosInstance, AxiosError } from 'axios'; import FormData from 'form-data'; import { SearclyConfig, ImageAnalysisOptions, SearchOptions, AnalysisResult, SearchResult, BulkAnalysisRequest } from './types'; import { SearclyError } from './errors'; export class SearclyClient { private client: AxiosInstance; private baseUrl: string; constructor(config: SearclyConfig) { this.baseUrl = config.baseUrl || 'https://api.searcly.com/v1'; this.client = axios.create({ baseURL: this.baseUrl, headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); // Add response interceptor for error handling this.client.interceptors.response.use( response => response, (error: AxiosError) => { if (error.response) { throw new SearclyError( (error.response.data as any)?.message || 'API request failed', error.response.status, error.response.data ); } else if (error.request) { throw new SearclyError('No response received from API'); } else { throw new SearclyError('Error setting up request'); } } ); } async analyzeImage( imageUrl: string, options: ImageAnalysisOptions = {} ): Promise<AnalysisResult> { const response = await this.client.post('/api/v1/analyze-image', { image_url: imageUrl, ...options, }); return response.data; } async analyzeImageUpload( imageFile: Buffer | Blob, options: ImageAnalysisOptions = {} ): Promise<AnalysisResult> { const formData = new FormData(); formData.append('image', imageFile); formData.append('options', JSON.stringify(options)); const response = await this.client.post('/api/v1/analyze-image', formData, { headers: { ...formData.getHeaders(), }, }); return response.data; } async searchProducts( imageUrl: string, options: SearchOptions = {} ): Promise<SearchResult[]> { const response = await this.client.post('/api/v1/search-products', { image_url: imageUrl, ...options, }); return response.data.results; } async searchProductsByUpload( imageFile: Buffer | Blob, options: SearchOptions = {} ): Promise<SearchResult[]> { const formData = new FormData(); formData.append('image', imageFile); formData.append('options', JSON.stringify(options)); const response = await this.client.post('/api/v1/search-products', formData, { headers: { ...formData.getHeaders(), }, }); return response.data.results; } async bulkAnalyze(request: BulkAnalysisRequest): Promise<Record<string, AnalysisResult>> { const response = await this.client.post('/api/v1/bulk-analyze', request); return response.data.results; } }