@@ -19,6 +19,7 @@ package client
19
19
import (
20
20
"errors"
21
21
"fmt"
22
+ "runtime/debug"
22
23
23
24
"github.com/optimizely/go-sdk/optimizely"
24
25
"github.com/optimizely/go-sdk/optimizely/decision"
@@ -36,19 +37,27 @@ type OptimizelyClient struct {
36
37
}
37
38
38
39
// IsFeatureEnabled returns true if the feature is enabled for the given user
39
- func (o * OptimizelyClient ) IsFeatureEnabled (featureKey string , userContext entities.UserContext ) (bool , error ) {
40
+ func (o * OptimizelyClient ) IsFeatureEnabled (featureKey string , userContext entities.UserContext ) (result bool , err error ) {
40
41
if ! o .isValid {
41
42
errorMessage := "Optimizely instance is not valid. Failing IsFeatureEnabled."
42
43
err := errors .New (errorMessage )
43
44
logger .Error (errorMessage , nil )
44
45
return false , err
45
46
}
46
47
48
+ defer func () {
49
+ if r := recover (); r != nil {
50
+ errorMessage := fmt .Sprintf (`Optimizely SDK is panicking with the error "%s"` , string (debug .Stack ()))
51
+ err = errors .New (errorMessage )
52
+ logger .Error (errorMessage , err )
53
+ }
54
+ }()
55
+
47
56
projectConfig := o .configManager .GetConfig ()
48
57
feature , err := projectConfig .GetFeatureByKey (featureKey )
49
58
if err != nil {
50
59
logger .Error ("Error retrieving feature" , err )
51
- return false , err
60
+ return result , err
52
61
}
53
62
featureDecisionContext := decision.FeatureDecisionContext {
54
63
Feature : & feature ,
@@ -60,17 +69,18 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
60
69
featureDecision , err := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
61
70
if err != nil {
62
71
logger .Error ("Received an error while computing feature decision" , err )
63
- return false , err
72
+ return result , err
64
73
}
65
74
66
75
logger .Debug (fmt .Sprintf (`Decision made for feature "%s" for user "%s" with the following reason: "%s". Source: "%s".` , featureKey , userID , featureDecision .Reason , featureDecision .Source ))
67
76
68
77
if featureDecision .Variation .FeatureEnabled == true {
78
+ result = true
69
79
logger .Info (fmt .Sprintf (`Feature "%s" is enabled for user "%s".` , featureKey , userID ))
70
80
} else {
71
81
logger .Info (fmt .Sprintf (`Feature "%s" is not enabled for user "%s".` , featureKey , userID ))
72
82
}
73
83
74
84
// @TODO(mng): send impression event
75
- return featureDecision . Variation . FeatureEnabled , nil
85
+ return result , nil
76
86
}
0 commit comments