flutter_resilient_http 1.0.0
flutter_resilient_http: ^1.0.0 copied to clipboard
A resilient HTTP client wrapper for Flutter with exponential backoff retries, circuit breaker pattern, and offline request queueing.
flutter_resilient_http #
A production-ready, highly resilient HTTP client wrapper for Flutter & Dart. Built over standard http.Client, it provides exponential backoff retries with jitter, an enterprise circuit breaker pattern, and an offline request queueing & replay engine.
๐ Key Features #
- ๐ Exponential Backoff & Jitter: Automatically retries failing requests with configurable backoff timing and randomized jitter to prevent server overload.
- โก Circuit Breaker Pattern: Prevents cascading backend failures by tripping into
OPENstate after repeated HTTP 5xx or connection errors. - ๐ถ Offline Request Queueing: Intercepts POST/PUT/DELETE mutations while offline, stores them, and replays them when connectivity restores.
- ๐ ๏ธ Seamless
httpDrop-In: Directly extendshttp.BaseClient, making it fully compatible with existing Dart/Flutter network codebases. - ๐ Telemetry & Logging: Configurable hooks for tracking network attempt metrics, circuit state changes, and queue processing events.
๐ฆ Installation #
Add flutter_resilient_http to your pubspec.yaml:
dependencies:
flutter_resilient_http: ^1.0.0
Then run:
flutter pub get
๐ Quick Start #
1. Basic Usage with Retries #
import 'package:flutter_resilient_http/flutter_resilient_http.dart';
final client = ResilientHttpClient(
retryPolicy: const RetryPolicy(
maxRetries: 3,
initialDelay: Duration(milliseconds: 500),
useJitter: true,
),
);
// Use like standard http client
final response = await client.get(Uri.parse('https://api.example.com/data'));
print('Response: ${response.statusCode}');
2. Full Enterprise Configuration (Retries + Circuit Breaker + Offline Queue) #
import 'package:flutter_resilient_http/flutter_resilient_http.dart';
// Create Circuit Breaker
final circuitBreaker = CircuitBreaker(
failureThreshold: 5,
resetTimeout: Duration(seconds: 30),
onStateChange: (oldState, newState) {
print('Circuit Breaker transitioned from $oldState to $newState');
},
);
// Create Offline Queue
final offlineQueue = OfflineRequestQueue(maxCapacity: 50);
// Initialize ResilientHttpClient
final client = ResilientHttpClient(
retryPolicy: const RetryPolicy(
maxRetries: 3,
retryStatusCodes: {408, 429, 500, 502, 503, 504},
),
circuitBreaker: circuitBreaker,
offlineQueue: offlineQueue,
isOffline: () => checkConnectivityStatus(), // Connect your connectivity_plus logic
onLog: (msg) => print('[HTTP Log] $msg'),
);
// Send request
try {
final response = await client.post(
Uri.parse('https://api.example.com/orders'),
body: {'item': 'widget'},
);
} on OfflineRequestException catch (e) {
print('Device is offline! Request queued for replay: ${e.wasQueued}');
} on CircuitBreakerOpenException catch (e) {
print('Circuit is OPEN. Try again in ${e.timeRemaining.inSeconds} seconds.');
}
// When network restores, replay queued requests
await client.flushOfflineQueue();
๐๏ธ Architecture Overview #
+-----------------------------+
| ResilientHttpClient |
+--------------+--------------+
|
+-----------------------+-----------------------+
| |
[ Network Check ] [ Circuit Breaker ]
Is Device Offline? Is Circuit Open?
/ \ / \
YES NO YES NO
/ \ / \
[Queue Mutation] [Execute Request] [Throw CircuitOpen] [Run Retries]
๐งช Testing #
flutter_resilient_http comes with comprehensive unit tests:
flutter test
๐ License #
This project is licensed under the MIT License - see the LICENSE file for details.
Developed with โค๏ธ by Olamilekan Adeyemi (@lekthedeveloper).