openfeature_provider_intellitoggle
An OpenFeature provider for IntelliToggle, enabling Dart backends to evaluate feature flags using the OpenFeature API standard.
This package integrates seamlessly with openfeature_dart_server_sdk and supports IntelliToggle's advanced targeting, rule-based rollouts, and experimentation platform.
๐ง Features
- โ Supports Boolean, String, Number, and Object flag evaluations
- ๐ Tracking API support (OpenFeature spec Section 6)
- ๐ Real-time updates via IntelliToggle event system
- ๐งช Includes
InMemoryProviderfor local development and testing - ๐ Optional OFREP server support for remote evaluation (e.g. test suites)
- ๐ OpenTelemetry-compatible telemetry hooks
๐ป Installation
Add to your server-side Dart project:
dependencies:
openfeature_dart_server_sdk: ^0.0.17
openfeature_provider_intellitoggle: ^0.0.7
Then install:
dart pub get
๐ Getting Started
import 'package:openfeature_provider_intellitoggle/openfeature_provider_intellitoggle.dart';
void main() async {
print('Starting IntelliToggle provider with OAuth2 Credentials...\n');
final provider = IntelliToggleProvider(
clientId: "client_id",
clientSecret: "cs_secret",
tenantId: "tenant_id",
options: IntelliToggleOptions(enableLogging: true),
);
print('Provider created, initializing...\n');
await provider.initialize();
print('โ Provider initialized successfully!\n');
final api = OpenFeatureAPI();
api.setProvider(provider);
// Evaluate a boolean flag
// result.flagKey, result.value, result.evaluatedAt, result.reason
final result = await provider.getBooleanFlag('new-dashboard', false);
if (result.errorCode != null) {
print('โ Error Code: ${result.errorCode}');
print('โ Error Message: ${result.errorMessage}');
} else {
print('');
print('Flag value: ${result.value}'); // Flag evaluated value
}
print('');
await provider.shutdown();
print('โ Test completed successfully!');
}
๐งช IntelliToggleClient Test
import 'package:openfeature_dart_server_sdk/hooks.dart';
import 'package:openfeature_provider_intellitoggle/openfeature_provider_intellitoggle.dart';
void main() async {
print('Starting IntelliClient test with OAuth2...\n');
final provider = IntelliToggleProvider(
clientId: "client_id",
clientSecret: "cs_secret",
tenantId: "tenant_id",
options: IntelliToggleOptions(
enableLogging: true,
),
);
print('Provider created, initializing...\n');
await provider.initialize();
print('โ Provider initialized successfully!\n');
final api = OpenFeatureAPI();
api.setProvider(provider);
// Create a client
final clientMetadata = ClientMetadata(name: 'test-client', version: '0.0.1');
final hookManager = HookManager();
final defaultEvalContext = EvaluationContext(attributes: {});
final featureClient = FeatureClient(
metadata: clientMetadata,
provider: provider,
hookManager: hookManager,
defaultContext: defaultEvalContext,
);
final client = IntelliToggleClient(featureClient);
// Evaluate your feature flags
final newFeatureEnabled = await client.getBooleanValue('new-dashboard-ui', false);
print('Flag value: ${newFeatureEnabled}');
// Track a user action (OpenFeature spec Section 6)
await client.track(
'dashboard-viewed',
targetingKey: 'user-123',
trackingDetails: TrackingEventDetails(
value: 1.0,
attributes: {'source': 'sidebar'},
),
);
await provider.shutdown();
print('โ Test completed successfully!');
}
๐งช Local Development & Testing
Use the included InMemoryProvider for fast testing without external dependencies:
import 'package:openfeature_provider_intellitoggle/openfeature_provider_intellitoggle.dart';
import 'package:openfeature_dart_server_sdk/hooks.dart';
void main() async {
print('Starting IntelliToggle provider test with InMemoryProvider...\n');
final provider = InMemoryProvider();
print('Provider created, initializing...');
await provider.initialize();
print('โ Provider initialized successfully!\n');
final api = OpenFeatureAPI();
api.setProvider(provider);
// Create a client
final clientMetadata = ClientMetadata(name: 'test-client', version: '0.0.1');
final hookManager = HookManager();
final defaultEvalContext = EvaluationContext(attributes: {});
final featureClient = FeatureClient(
metadata: clientMetadata,
provider: provider,
hookManager: hookManager,
defaultContext: defaultEvalContext,
);
final client = IntelliToggleClient(featureClient);
provider.setFlag('bool-flag', true);
// Evaluate your feature flags
final newFeatureEnabled = await client.getBooleanValue('bool-flag', false);
print('Flag value: $newFeatureEnabled'); // true
await provider.shutdown();
print('โ Test completed successfully!');
}
โ๏ธ Remote Evaluation (Optional)
OREP Server
Start the local remote flag evaluation API:
dart run bin/orep_server.dart
Configure using environment variables:
| Variable | Default |
|---|---|
OREP_PORT |
8080 |
OREP_HOST |
0.0.0.0 |
OREP_AUTH_TOKEN |
changeme-token |
OFREP Client (Remote Evaluation)
The provider can call an OFREP-compliant endpoint for remote flag evaluation.
- Enable via options or environment variables.
- Maps OFREP responses to OpenFeature
ProviderEvaluationincludingvalue,variant,reason,errorCode, andflagMetadata. - Supports retries, timeouts, and optional in-memory cache keyed by
(flagKey + context).
Environment variables:
OFREP_ENABLED=true
OFREP_BASE_URL=https://ofrep.example.com
OFREP_AUTH_TOKEN=your_bearer_token
OFREP_TIMEOUT_MS=5000
OFREP_MAX_RETRIES=3
OFREP_CACHE_TTL_MS=60000
Code example:
final provider = IntelliToggleProvider(
clientId: 'client_id',
clientSecret: 'cs_secret',
tenantId: 'tenant_id',
options: IntelliToggleOptions(
useOfrep: true,
ofrepBaseUri: Uri.parse('https://ofrep.example.com'),
cacheTtl: const Duration(minutes: 1),
maxRetries: 3,
timeout: const Duration(seconds: 5),
),
);
await OpenFeatureAPI().setProvider(provider);
final client = IntelliToggleClient(
FeatureClient(
metadata: ClientMetadata(name: 'service-x'),
hookManager: HookManager(),
defaultContext: EvaluationContext(attributes: {}),
),
);
final result = await client.getBooleanValue(
'my-flag',
false,
targetingKey: 'user-123',
evaluationContext: {'region': 'us-east-1'},
);
๐ Resources
๐ License
Apache-2.0
Libraries
- hooks/intellitoggle_telemetry_hook
- openfeature_provider_intellitoggle
- Main entry point for the IntelliToggle OpenFeature provider package.
- utils/telemetry