diff --git a/splitio_web/lib/splitio_web.dart b/splitio_web/lib/splitio_web.dart index 6a0102f..799fe0b 100644 --- a/splitio_web/lib/splitio_web.dart +++ b/splitio_web/lib/splitio_web.dart @@ -321,6 +321,12 @@ class SplitioWeb extends SplitioPlatform { config.impressionListener = impressionListener; } + + if (configuration.configurationMap['fallbackTreatments'] != null) { + final fallbackTreatments = configuration.configurationMap['fallbackTreatments'] as Map; + // FallbackTreatmentsConfiguration has a compatible structure with JSFallbackTreatmentsConfiguration + config.fallbackTreatments = fallbackTreatments.jsify() as JSFallbackTreatmentsConfiguration; + } } return config; diff --git a/splitio_web/lib/src/js_interop.dart b/splitio_web/lib/src/js_interop.dart index df58d6e..4d5076d 100644 --- a/splitio_web/lib/src/js_interop.dart +++ b/splitio_web/lib/src/js_interop.dart @@ -90,6 +90,12 @@ extension type JSConfigurationStorage._(JSObject _) implements JSObject { external JSBoolean? clearOnInit; } +@JS() +extension type JSFallbackTreatmentsConfiguration._(JSObject _) implements JSObject { + external JSTreatmentWithConfig? global; + external JSObject? byFlag; +} + @JS() extension type JSConfiguration._(JSObject _) implements JSObject { external JSConfigurationCore core; @@ -102,6 +108,7 @@ extension type JSConfiguration._(JSObject _) implements JSObject { external JSImpressionListener? impressionListener; external JSAny? debug; external JSAny? storage; + external JSFallbackTreatmentsConfiguration? fallbackTreatments; } @JS() diff --git a/splitio_web/test/splitio_web_test.dart b/splitio_web/test/splitio_web_test.dart index 13c386e..44151c7 100644 --- a/splitio_web/test/splitio_web_test.dart +++ b/splitio_web/test/splitio_web_test.dart @@ -7,6 +7,8 @@ import 'package:splitio_web/src/js_interop.dart'; import 'package:splitio_platform_interface/split_certificate_pinning_configuration.dart'; import 'package:splitio_platform_interface/split_sync_config.dart'; import 'package:splitio_platform_interface/split_rollout_cache_configuration.dart'; +import 'package:splitio_platform_interface/split_fallback_treatment.dart'; +import 'package:splitio_platform_interface/split_fallback_treatments_configuration.dart'; import 'utils/js_interop_test_utils.dart'; extension on web.Window { @@ -685,39 +687,47 @@ void main() { matchingKey: 'matching-key', bucketingKey: 'bucketing-key', sdkConfiguration: SplitConfiguration( - featuresRefreshRate: 1, - segmentsRefreshRate: 2, - impressionsRefreshRate: 3, - telemetryRefreshRate: 4, - eventsQueueSize: 5, - impressionsQueueSize: 6, - eventFlushInterval: 7, - eventsPerPush: 8, // unsupported in Web - trafficType: 'user', - // ignore: deprecated_member_use - enableDebug: false, // deprecated, logLevel has precedence - streamingEnabled: false, - persistentAttributesEnabled: true, // unsupported in Web - impressionListener: true, - sdkEndpoint: 'https://sdk.domain/api', - eventsEndpoint: 'https://events.domain/api', - authServiceEndpoint: 'https://auth.domain/api/v2', - streamingServiceEndpoint: 'https://streaming.domain/sse', - telemetryServiceEndpoint: 'https://telemetry.domain/api/v1', - syncConfig: SyncConfig( - names: ['flag_1', 'flag_2'], prefixes: ['prefix_1']), - impressionsMode: ImpressionsMode.none, - syncEnabled: true, - userConsent: UserConsent.granted, - encryptionEnabled: true, // unsupported in Web - logLevel: SplitLogLevel.info, - readyTimeout: 1, - certificatePinningConfiguration: CertificatePinningConfiguration() - .addPin('host', 'pin'), // unsupported in Web - rolloutCacheConfiguration: RolloutCacheConfiguration( - expirationDays: 100, - clearOnInit: true, - ))); + featuresRefreshRate: 1, + segmentsRefreshRate: 2, + impressionsRefreshRate: 3, + telemetryRefreshRate: 4, + eventsQueueSize: 5, + impressionsQueueSize: 6, + eventFlushInterval: 7, + eventsPerPush: 8, // unsupported in Web + trafficType: 'user', + // ignore: deprecated_member_use + enableDebug: false, // deprecated, logLevel has precedence + streamingEnabled: false, + persistentAttributesEnabled: true, // unsupported in Web + impressionListener: true, + sdkEndpoint: 'https://sdk.domain/api', + eventsEndpoint: 'https://events.domain/api', + authServiceEndpoint: 'https://auth.domain/api/v2', + streamingServiceEndpoint: 'https://streaming.domain/sse', + telemetryServiceEndpoint: 'https://telemetry.domain/api/v1', + syncConfig: + SyncConfig(names: ['flag_1', 'flag_2'], prefixes: ['prefix_1']), + impressionsMode: ImpressionsMode.none, + syncEnabled: true, + userConsent: UserConsent.granted, + encryptionEnabled: true, // unsupported in Web + logLevel: SplitLogLevel.info, + readyTimeout: 1, + certificatePinningConfiguration: CertificatePinningConfiguration() + .addPin('host', 'pin'), // unsupported in Web + rolloutCacheConfiguration: RolloutCacheConfiguration( + expirationDays: 100, + clearOnInit: true, + ), + fallbackTreatments: FallbackTreatmentsConfiguration( + global: const FallbackTreatment('global-treatment'), + byFlag: { + 'flag_1': const FallbackTreatment('fallback_1', 'config_1'), + 'flag_2': const FallbackTreatment('fallback_2', null) + }, + ), + )); expect(mock.calls[mock.calls.length - 5].methodName, 'SplitFactory'); final actual = @@ -776,6 +786,13 @@ void main() { 'impressionListener': { 'logImpression': (actual as Map)['impressionListener'] ['logImpression'] + }, + 'fallbackTreatments': { + 'global': {'treatment': 'global-treatment', 'config': null}, + 'byFlag': { + 'flag_1': {'treatment': 'fallback_1', 'config': 'config_1'}, + 'flag_2': {'treatment': 'fallback_2', 'config': null} + } } }));