# API Error Handling & Resilience System
This document describes the comprehensive error handling infrastructure added to the GridPilot website to handle API connectivity issues, request errors, and provide graceful degradation.
## Overview
The system provides:
- **Enhanced error classification** with detailed error types
- **Automatic retry logic** with exponential backoff
- **Circuit breaker pattern** to prevent cascading failures
- **Connection health monitoring** with real-time status
- **User-friendly error messages** for production
- **Developer-friendly debugging tools** for development
- **Graceful degradation** with fallbacks and caching
- **Offline mode detection**
## Core Components
### 1. Enhanced Error Classification (`ApiError`)
**Location:** `lib/api/base/ApiError.ts`
**Error Types:**
- `NETWORK_ERROR` - Connection failed, CORS issues
- `AUTH_ERROR` - 401/403 authentication issues
- `VALIDATION_ERROR` - 400 bad request
- `NOT_FOUND` - 404 resource not found
- `SERVER_ERROR` - 500+ server issues
- `RATE_LIMIT_ERROR` - 429 too many requests
- `TIMEOUT_ERROR` - Request timeout
- `CANCELED_ERROR` - Request aborted
**Features:**
- Automatic error type classification
- User-friendly vs developer-friendly messages
- Retry capability detection
- Connectivity issue detection
- Severity levels for logging
### 2. Retry Handler & Circuit Breaker (`RetryHandler.ts`)
**Location:** `lib/api/base/RetryHandler.ts`
**Retry Logic:**
- Exponential backoff with jitter
- Configurable max retries (default: 3)
- Configurable timeout (default: 30s)
- Abort support for cancellation
**Circuit Breaker:**
- Tracks failures per endpoint
- Opens after threshold (default: 5 failures)
- Half-open state for recovery testing
- Automatic reset after timeout
### 3. Connection Monitor (`ApiConnectionMonitor.ts`)
**Location:** `lib/api/base/ApiConnectionMonitor.ts`
**Features:**
- Real-time connection status tracking
- Health check polling (every 30s)
- Reliability percentage calculation
- Event emitter for status changes
- Request/response time tracking
**Statuses:**
- `connected` - Healthy API
- `degraded` - Reduced reliability
- `disconnected` - Unavailable
- `checking` - Health check in progress
### 4. Enhanced BaseApiClient (`BaseApiClient.ts`)
**Location:** `lib/api/base/BaseApiClient.ts`
**Enhancements:**
- Automatic error classification
- Retry logic integration
- Circuit breaker usage
- Connection monitoring
- Timeout handling
- Request cancellation
**Usage:**
```typescript
const client = new BaseApiClient(
baseUrl,
errorReporter,
logger,
{ timeout: 30000, retry: true }
);
// All methods now support retry and graceful degradation
const data = await client.get('/api/endpoint');
```
### 5. Error UI Components
**Location:** `components/errors/`
**Components:**
- `ErrorDisplay.tsx` - User-friendly error screen
- `DevErrorPanel.tsx` - Developer debugging panel
- `ApiErrorBoundary.tsx` - React error boundary
- `ApiStatusToolbar.tsx` - Real-time status toolbar
- `NotificationIntegration.tsx` - Notification system integration
### 6. Graceful Degradation (`GracefulDegradation.ts`)
**Location:** `lib/api/base/GracefulDegradation.ts`
**Features:**
- Response caching with TTL
- Fallback data support
- Offline mode detection
- Service wrapper for easy usage
**Usage:**
```typescript
import { withGracefulDegradation, GracefulService } from './GracefulDegradation';
// Direct usage
const data = await withGracefulDegradation(
() => apiClient.getData(),
{
fallback: defaultData,
timeout: 5000,
useCache: true
}
);
// Service wrapper
const userService = new GracefulService(
'user-data',
() => apiClient.getUser(),
defaultUser
);
const user = await userService.get();
```
### 7. Enhanced Error Reporter (`EnhancedErrorReporter.ts`)
**Location:** `lib/infrastructure/EnhancedErrorReporter.ts`
**Features:**
- Environment-specific handling
- User notification integration
- Error buffering for batch reporting
- Custom error handlers
- External service integration (placeholder)
## Integration in Application
### Layout Integration
```tsx
// apps/website/app/layout.tsx
import { NotificationIntegration } from '@/components/errors/NotificationIntegration';
import { ApiErrorBoundary } from '@/components/errors/ApiErrorBoundary';
import { ApiStatusToolbar } from '@/components/errors/ApiStatusToolbar';
export default function RootLayout({ children }) {
return (
{/* Your app content */}
{children}
{/* Development toolbar */}
{process.env.NODE_ENV === 'development' && (
)}
);
}
```
### Service Integration
```typescript
// lib/services/DriverService.ts
import { BaseApiClient } from '@/lib/api/base/BaseApiClient';
import { EnhancedErrorReporter } from '@/lib/infrastructure/EnhancedErrorReporter';
import { ConsoleLogger } from '@/lib/infrastructure/ConsoleLogger';
// Enhanced service with error handling
export class DriverService {
private apiClient: BaseApiClient;
private errorReporter: EnhancedErrorReporter;
constructor() {
const logger = new ConsoleLogger();
this.errorReporter = new EnhancedErrorReporter(logger, {
showUserNotifications: true,
logToConsole: true,
reportToExternal: process.env.NODE_ENV === 'production',
});
this.apiClient = new BaseApiClient(
getWebsiteApiBaseUrl(),
this.errorReporter,
logger,
{ timeout: 30000, retry: true }
);
}
async getDriverProfile(driverId: string): Promise {
try {
const dto = await this.apiClient.getDriverProfile(driverId);
return new DriverProfileViewModel(dto);
} catch (error) {
// Error already handled by BaseApiClient
// Return null for graceful degradation
return null;
}
}
}
```
## Development Tools
### DevToolbar Integration
The enhanced DevToolbar includes:
- Real-time API status indicator
- Reliability percentage
- Circuit breaker status
- Health check button
- Stats reset
- Test error trigger
### ApiStatusToolbar
A floating toolbar that shows:
- Current connection status
- Request statistics
- Circuit breaker states
- Quick actions for testing
## Error Handling Patterns
### 1. Automatic Retry
```typescript
// Automatically retries failed requests
const data = await client.get('/api/data');
```
### 2. Graceful Fallback
```typescript
const data = await withGracefulDegradation(
() => client.get('/api/data'),
{ fallback: defaultData }
);
```
### 3. Error Boundary
```typescript
```
### 4. Manual Error Handling
```typescript
try {
const data = await client.get('/api/data');
} catch (error) {
if (isApiError(error)) {
if (error.isRetryable()) {
// Show retry button
}
if (error.isConnectivityIssue()) {
// Show connection error
}
}
}
```
## Environment-Specific Behavior
### Development
- Detailed error messages with stack traces
- Developer error panel with full context
- API status toolbar always visible
- Console logging with full details
- Test error triggers
### Production
- User-friendly error messages
- Modal notifications for critical errors
- Toast notifications for warnings
- No sensitive data in error messages
- Automatic error reporting to external services
## Monitoring & Debugging
### Connection Health
```typescript
import { connectionMonitor } from '@/lib/api/base/ApiConnectionMonitor';
// Get current status
const status = connectionMonitor.getStatus();
// Get detailed health
const health = connectionMonitor.getHealth();
// Run manual health check
const result = await connectionMonitor.performHealthCheck();
```
### Circuit Breaker Status
```typescript
import { CircuitBreakerRegistry } from '@/lib/api/base/RetryHandler';
const registry = CircuitBreakerRegistry.getInstance();
const status = registry.getStatus();
```
### Error Buffer
```typescript
import { getGlobalErrorReporter } from '@/lib/infrastructure/EnhancedErrorReporter';
const reporter = getGlobalErrorReporter();
const errors = reporter.getBufferedErrors();
reporter.flush(); // Send batch
```
## Best Practices
1. **Always use BaseApiClient** for API calls
2. **Wrap critical components** with ApiErrorBoundary
3. **Provide fallbacks** for graceful degradation
4. **Use error classification** for specific handling
5. **Monitor connection status** for user feedback
6. **Test error scenarios** in development
7. **Log appropriately** based on severity
8. **Use caching** for frequently accessed data
## Troubleshooting
### API Always Shows "Disconnected"
- Check API_BASE_URL environment variable
- Verify CORS configuration on API server
- Check browser console for network errors
- Use DevToolbar health check
### Requests Not Retrying
- Verify retry option is enabled in BaseApiClient
- Check error type is retryable
- Review circuit breaker status
### Notifications Not Showing
- Ensure NotificationProvider wraps your app
- Check NotificationIntegration is mounted
- Verify error severity levels
### Circuit Breaker Stays Open
- Check API server health
- Reset circuit breakers via DevToolbar
- Review error logs for root cause
## Future Enhancements
- External error reporting (Sentry, LogRocket)
- Persistent cache storage (IndexedDB)
- Offline queue for failed requests
- Performance metrics dashboard
- A/B testing for error recovery strategies