import fetch from 'node-fetch'; export interface ApiResponse { data?: T; error?: string; status: number; } export class ApiClient { constructor(private baseUrl: string) {} async get(path: string): Promise> { try { const response = await fetch(`${this.baseUrl}${path}`); const data = await response.json(); return { data: response.ok ? data : undefined, error: response.ok ? undefined : data.error || 'Request failed', status: response.status }; } catch (error) { return { error: error.message, status: 0 }; } } async post(path: string, body: any): Promise> { try { const response = await fetch(`${this.baseUrl}${path}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const data = await response.json(); return { data: response.ok ? data : undefined, error: response.ok ? undefined : data.error || 'Request failed', status: response.status }; } catch (error) { return { error: error.message, status: 0 }; } } async put(path: string, body: any): Promise> { try { const response = await fetch(`${this.baseUrl}${path}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const data = await response.json(); return { data: response.ok ? data : undefined, error: response.ok ? undefined : data.error || 'Request failed', status: response.status }; } catch (error) { return { error: error.message, status: 0 }; } } async delete(path: string): Promise> { try { const response = await fetch(`${this.baseUrl}${path}`, { method: 'DELETE' }); const data = response.status === 204 ? {} : await response.json(); return { data: response.ok ? data : undefined, error: response.ok ? undefined : data.error || 'Request failed', status: response.status }; } catch (error) { return { error: error.message, status: 0 }; } } async health(): Promise> { return this.get('/health'); } async waitForHealth(timeout: number = 30000): Promise { const startTime = Date.now(); while (Date.now() - startTime < timeout) { try { const response = await this.health(); if (response.status === 200 && response.data?.status === 'healthy') { return true; } } catch (error) { // Continue waiting } await new Promise(resolve => setTimeout(resolve, 1000)); } return false; } }