execution_policy 0.2.0
execution_policy: ^0.2.0 copied to clipboard
A Dart resilience and transient-fault-handling library inspired by C# Polly.
execution_policy #
A Dart resilience and transient-fault-handling library inspired by C# Polly, with built-in hooks for APM error logging.
Features #
- Retry with fixed, linear, exponential, and jitter-ed backoff
- Timeout to abort long-running operations
- Fallback to recover gracefully from failures
- Circuit Breaker to stop hammering failing services
- Fluent
PolicyBuilder<T>
API for composition - PolicyDebugger for tracing start/success/failure of each policy
- APM-friendly
onError
hooks for integrating with observability tools
Installation #
Add to your pubspec.yaml
:
dependencies:
execution_policy:
Quick Start #
Fluent Builder #
Future<String> fetchWithResilience() async {
return await PolicyBuilder<String>()
.retry(
RetryOptions.exponentialJitter.copyWith(maxAttempts: 4),
retryIf: (error) => error is HttpException,
onError: (error, stack, attempt) async {
// Send to your APM or logging system:
// Example usecase for Firebase Crashlytics
// _crashlytics.recordError(error, stack, information: ["Failed attempt $attempt"]);
},
)
.timeout(Duration(seconds: 2))
.circuitBreaker(
failureThreshold: 3,
resetTimeout: Duration(seconds: 10),
)
.fallback(() async => 'default value')
.execute(() async {
// Your unstable operation:
return await httpClient.get('https://example.com').then((r) => r.body);
});
}
Debug Execution #
import 'dart:developer' as developer show log;
import 'package:execution_policy/execution_policy.dart';
void main () async {
final debugResult = await PolicyBuilder<String>()
.retry(RetryOptions.fixed)
.timeout(Duration(seconds: 1))
.debugExecute(
() async => unreliableOperation(),
developer.log, // attach debug logger like log or print
);
}
API Reference #
-
PolicyBuilder
.retry(RetryOptions options, {bool Function(Object)? retryIf, Future<void> Function(Object, StackTrace?, int)? onError})
.timeout(Duration duration)
.circuitBreaker({int failureThreshold, Duration resetTimeout})
.fallback(FutureFunction<T> fallbackFn)
.execute(FutureFunction<T> action)
.debugExecute(FutureFunction<T> action, void Function(String) logger)
-
RetryOptions
- Presets:
fixed
,linear
,exponential
,exponentialJitter
.copyWith({int? maxAttempts, Duration? baseDelay, RetryDelayType? delayType, double? jitterFactor, Duration? maxDelay})
.delayFor(int attempt) -> Duration
- Presets:
-
TimeoutPolicy
-
FallbackPolicy
-
CircuitBreakerPolicy
-
PolicyDebugger
Contributing #
- Fork the repo
- Create a branch (
git checkout -b feature/foo
) - Commit your changes (
git commit -am 'Add foo'
) - Push (
git push origin feature/foo
) - Open a PR
License #
This project is licensed under the MIT License. See LICENSE for details.