@@ -65,27 +65,28 @@ type sdkStorages struct {
6565
6666// SplitFactory struct is responsible for instantiating and storing instances of client and manager.
6767type SplitFactory struct {
68- startTime time.Time // Tracking startTime
69- metadata dtos.Metadata
70- storages sdkStorages
71- apikey string
72- status atomic.Value
73- readinessSubscriptors map [int ]chan int
74- operationMode string
75- mutex sync.Mutex
76- cfg * conf.SplitSdkConfig
77- impressionListener * impressionlistener.WrapperImpressionListener
78- logger logging.LoggerInterface
79- syncManager synchronizer.Manager
80- telemetrySync telemetry.TelemetrySynchronizer // To execute SynchronizeInit
81- impressionManager provisional.ImpressionManager
68+ startTime time.Time // Tracking startTime
69+ metadata dtos.Metadata
70+ storages sdkStorages
71+ apikey string
72+ status atomic.Value
73+ readinessSubscriptors map [int ]chan int
74+ operationMode string
75+ mutex sync.Mutex
76+ cfg * conf.SplitSdkConfig
77+ impressionListener * impressionlistener.WrapperImpressionListener
78+ logger logging.LoggerInterface
79+ syncManager synchronizer.Manager
80+ telemetrySync telemetry.TelemetrySynchronizer // To execute SynchronizeInit
81+ impressionManager provisional.ImpressionManager
82+ fallbackTreatmentCalculator dtos.FallbackTreatmentCalculator
8283}
8384
8485// Client returns the split client instantiated by the factory
8586func (f * SplitFactory ) Client () * SplitClient {
8687 return & SplitClient {
8788 logger : f .logger ,
88- evaluator : evaluator .NewEvaluator (f .storages .splits , f .storages .segments , f .storages .ruleBasedSegments , nil , engine .NewEngine (f .logger ), f .logger , f .cfg .Advanced .FeatureFlagRules , f .cfg .Advanced .RuleBasedSegmentRules ),
89+ evaluator : evaluator .NewEvaluator (f .storages .splits , f .storages .segments , f .storages .ruleBasedSegments , nil , engine .NewEngine (f .logger ), f .logger , f .cfg .Advanced .FeatureFlagRules , f .cfg .Advanced .RuleBasedSegmentRules , f . fallbackTreatmentCalculator ),
8990 impressions : f .storages .impressions ,
9091 events : f .storages .events ,
9192 validator : inputValidation {
@@ -297,7 +298,15 @@ func setupInMemoryFactory(
297298 splitAPI := api .NewSplitAPI (apikey , advanced , logger , metadata )
298299
299300 isProxy := splitAPI .SplitFetcher .IsProxy ()
300- evaluator := evaluator .NewEvaluator (splitsStorage , segmentsStorage , ruleBasedSegmentStorage , nil , engine .NewEngine (logger ), logger , cfg .Advanced .FeatureFlagRules , cfg .Advanced .RuleBasedSegmentRules )
301+
302+ fallbackTreatmentConf := dtos.FallbackTreatmentConfig {}
303+ if cfg .Advanced .FallbackTreatment != nil {
304+ fallbackTreatmentConf .GlobalFallbackTreatment = conf .SanitizeGlobalFallbackTreatment (cfg .Advanced .FallbackTreatment .GlobalFallbackTreatment , logger )
305+ fallbackTreatmentConf .ByFlagFallbackTreatment = conf .SanitizeByFlagFallBackTreatment (cfg .Advanced .FallbackTreatment .ByFlagFallbackTreatment , logger )
306+ }
307+ fallbackTreatmentCalculator := dtos .NewFallbackTreatmentCalculatorImp (& fallbackTreatmentConf )
308+
309+ evaluator := evaluator .NewEvaluator (splitsStorage , segmentsStorage , ruleBasedSegmentStorage , nil , engine .NewEngine (logger ), logger , cfg .Advanced .FeatureFlagRules , cfg .Advanced .RuleBasedSegmentRules , fallbackTreatmentCalculator )
301310 ruleBuilder := grammar .NewRuleBuilder (segmentsStorage , ruleBasedSegmentStorage , nil , cfg .Advanced .FeatureFlagRules , cfg .Advanced .RuleBasedSegmentRules , logger , evaluator )
302311 workers := synchronizer.Workers {
303312 SplitUpdater : split .NewSplitUpdater (splitsStorage , ruleBasedSegmentStorage , splitAPI .SplitFetcher , logger , telemetryStorage , dummyHC , flagSetFilter , ruleBuilder , isProxy , advanced .FlagsSpecVersion ),
@@ -360,17 +369,18 @@ func setupInMemoryFactory(
360369 }
361370
362371 splitFactory := SplitFactory {
363- startTime : time .Now ().UTC (),
364- apikey : apikey ,
365- cfg : cfg ,
366- metadata : metadata ,
367- logger : logger ,
368- operationMode : conf .InMemoryStandAlone ,
369- storages : storages ,
370- readinessSubscriptors : make (map [int ]chan int ),
371- syncManager : syncManager ,
372- telemetrySync : workers .TelemetryRecorder ,
373- impressionManager : impressionManager ,
372+ startTime : time .Now ().UTC (),
373+ apikey : apikey ,
374+ cfg : cfg ,
375+ metadata : metadata ,
376+ logger : logger ,
377+ operationMode : conf .InMemoryStandAlone ,
378+ storages : storages ,
379+ readinessSubscriptors : make (map [int ]chan int ),
380+ syncManager : syncManager ,
381+ telemetrySync : workers .TelemetryRecorder ,
382+ impressionManager : impressionManager ,
383+ fallbackTreatmentCalculator : fallbackTreatmentCalculator ,
374384 }
375385 splitFactory .status .Store (sdkStatusInitializing )
376386 setFactory (splitFactory .apikey , splitFactory .logger )
@@ -438,18 +448,26 @@ func setupRedisFactory(apikey string, cfg *conf.SplitSdkConfig, logger logging.L
438448
439449 syncManager := synchronizer .NewSynchronizerManagerRedis (syncImpl , logger )
440450
451+ fallbackTreatmentConf := dtos.FallbackTreatmentConfig {}
452+ if cfg .Advanced .FallbackTreatment != nil {
453+ fallbackTreatmentConf .GlobalFallbackTreatment = conf .SanitizeGlobalFallbackTreatment (cfg .Advanced .FallbackTreatment .GlobalFallbackTreatment , logger )
454+ fallbackTreatmentConf .ByFlagFallbackTreatment = conf .SanitizeByFlagFallBackTreatment (cfg .Advanced .FallbackTreatment .ByFlagFallbackTreatment , logger )
455+ }
456+ fallbackTreatmentCalculator := dtos .NewFallbackTreatmentCalculatorImp (& fallbackTreatmentConf )
457+
441458 factory := & SplitFactory {
442- startTime : time .Now ().UTC (),
443- apikey : apikey ,
444- cfg : cfg ,
445- metadata : metadata ,
446- logger : logger ,
447- operationMode : conf .RedisConsumer ,
448- storages : storages ,
449- readinessSubscriptors : make (map [int ]chan int ),
450- telemetrySync : telemetry .NewSynchronizerRedis (telemetryStorage , logger ),
451- impressionManager : impressionManager ,
452- syncManager : syncManager ,
459+ startTime : time .Now ().UTC (),
460+ apikey : apikey ,
461+ cfg : cfg ,
462+ metadata : metadata ,
463+ logger : logger ,
464+ operationMode : conf .RedisConsumer ,
465+ storages : storages ,
466+ readinessSubscriptors : make (map [int ]chan int ),
467+ telemetrySync : telemetry .NewSynchronizerRedis (telemetryStorage , logger ),
468+ impressionManager : impressionManager ,
469+ syncManager : syncManager ,
470+ fallbackTreatmentCalculator : fallbackTreatmentCalculator ,
453471 }
454472 factory .status .Store (sdkStatusInitializing )
455473 setFactory (factory .apikey , factory .logger )
@@ -514,6 +532,13 @@ func setupLocalhostFactory(
514532 return nil , err
515533 }
516534
535+ fallbackTreatmentConf := dtos.FallbackTreatmentConfig {}
536+ if cfg .Advanced .FallbackTreatment != nil {
537+ fallbackTreatmentConf .GlobalFallbackTreatment = conf .SanitizeGlobalFallbackTreatment (cfg .Advanced .FallbackTreatment .GlobalFallbackTreatment , logger )
538+ fallbackTreatmentConf .ByFlagFallbackTreatment = conf .SanitizeByFlagFallBackTreatment (cfg .Advanced .FallbackTreatment .ByFlagFallbackTreatment , logger )
539+ }
540+ fallbackTreatmentCalculator := dtos .NewFallbackTreatmentCalculatorImp (& fallbackTreatmentConf )
541+
517542 splitFactory := & SplitFactory {
518543 startTime : time .Now ().UTC (),
519544 apikey : apikey ,
@@ -530,9 +555,10 @@ func setupLocalhostFactory(
530555 evaluationTelemetry : telemetryStorage ,
531556 runtimeTelemetry : telemetryStorage ,
532557 },
533- readinessSubscriptors : make (map [int ]chan int ),
534- syncManager : syncManager ,
535- telemetrySync : & telemetry.NoOp {},
558+ readinessSubscriptors : make (map [int ]chan int ),
559+ syncManager : syncManager ,
560+ telemetrySync : & telemetry.NoOp {},
561+ fallbackTreatmentCalculator : fallbackTreatmentCalculator ,
536562 }
537563 splitFactory .status .Store (sdkStatusInitializing )
538564
0 commit comments