@@ -35,7 +35,7 @@ type OptimizelyFactory struct {
35
35
}
36
36
37
37
// OptionFunc is a type to a proper func
38
- type OptionFunc func (* OptimizelyClient , utils. ExecutionCtx )
38
+ type OptionFunc func (* OptimizelyClient )
39
39
40
40
// Client gets client and sets some parameters
41
41
func (f OptimizelyFactory ) Client (clientOptions ... OptionFunc ) (* OptimizelyClient , error ) {
@@ -45,79 +45,94 @@ func (f OptimizelyFactory) Client(clientOptions ...OptionFunc) (*OptimizelyClien
45
45
appClient := & OptimizelyClient {
46
46
executionCtx : executionCtx ,
47
47
DecisionService : decision .NewCompositeService (f .SDKKey ),
48
- EventProcessor : event .NewEventProcessor (executionCtx , event .BatchSize (event .DefaultBatchSize ),
48
+ EventProcessor : event .NewEventProcessor (event .BatchSize (event .DefaultBatchSize ),
49
49
event .QueueSize (event .DefaultEventQueueSize ), event .FlushInterval (event .DefaultEventFlushInterval )),
50
50
}
51
51
52
52
for _ , opt := range clientOptions {
53
- opt (appClient , executionCtx )
53
+ opt (appClient )
54
54
}
55
55
56
56
if f .SDKKey == "" && f .Datafile == nil && appClient .ConfigManager == nil {
57
57
return nil , errors .New ("unable to instantiate client: no project config manager, SDK key, or a Datafile provided" )
58
58
}
59
59
60
60
if appClient .ConfigManager == nil { // if it was not passed then assign here
61
-
62
- appClient .ConfigManager = config .NewPollingProjectConfigManager (executionCtx , f .SDKKey ,
61
+ appClient .ConfigManager = config .NewPollingProjectConfigManager (f .SDKKey ,
63
62
config .InitialDatafile (f .Datafile ), config .PollingInterval (config .DefaultPollingInterval ))
64
63
}
65
64
65
+ // Initialize the default services with the execution context
66
+ if pollingConfigManager , ok := appClient .ConfigManager .(* config.PollingProjectConfigManager ); ok {
67
+ pollingConfigManager .Start (appClient .executionCtx )
68
+ }
69
+
70
+ if queueingProcessor , ok := appClient .EventProcessor .(* event.QueueingEventProcessor ); ok {
71
+ queueingProcessor .Start (appClient .executionCtx )
72
+ }
73
+
66
74
return appClient , nil
67
75
}
68
76
69
- // PollingConfigManager sets polling config manager on a client
70
- func PollingConfigManager (sdkKey string , pollingInterval time.Duration , initDataFile []byte ) OptionFunc {
71
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
72
- f .ConfigManager = config .NewPollingProjectConfigManager (f . executionCtx , sdkKey , config .InitialDatafile (initDataFile ),
77
+ // WithPollingConfigManager sets polling config manager on a client
78
+ func WithPollingConfigManager (sdkKey string , pollingInterval time.Duration , initDataFile []byte ) OptionFunc {
79
+ return func (f * OptimizelyClient ) {
80
+ f .ConfigManager = config .NewPollingProjectConfigManager (sdkKey , config .InitialDatafile (initDataFile ),
73
81
config .PollingInterval (pollingInterval ))
74
82
}
75
83
}
76
84
77
- // PollingConfigManagerRequester sets polling config manager on a client
78
- func PollingConfigManagerRequester (requester utils.Requester , pollingInterval time.Duration , initDataFile []byte ) OptionFunc {
79
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
80
- f .ConfigManager = config .NewPollingProjectConfigManager (f . executionCtx , "" , config .InitialDatafile (initDataFile ),
85
+ // WithPollingConfigManagerRequester sets polling config manager on a client
86
+ func WithPollingConfigManagerRequester (requester utils.Requester , pollingInterval time.Duration , initDataFile []byte ) OptionFunc {
87
+ return func (f * OptimizelyClient ) {
88
+ f .ConfigManager = config .NewPollingProjectConfigManager ("" , config .InitialDatafile (initDataFile ),
81
89
config .PollingInterval (pollingInterval ), config .Requester (requester ))
82
90
}
83
91
}
84
92
85
- // ConfigManager sets polling config manager on a client
86
- func ConfigManager (configManager optimizely.ProjectConfigManager ) OptionFunc {
87
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
93
+ // WithConfigManager sets polling config manager on a client
94
+ func WithConfigManager (configManager optimizely.ProjectConfigManager ) OptionFunc {
95
+ return func (f * OptimizelyClient ) {
88
96
f .ConfigManager = configManager
89
97
}
90
98
}
91
99
92
- // CompositeDecisionService sets decision service on a client
93
- func CompositeDecisionService (sdkKey string ) OptionFunc {
94
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
100
+ // WithCompositeDecisionService sets decision service on a client
101
+ func WithCompositeDecisionService (sdkKey string ) OptionFunc {
102
+ return func (f * OptimizelyClient ) {
95
103
f .DecisionService = decision .NewCompositeService (sdkKey )
96
104
}
97
105
}
98
106
99
- // DecisionService sets decision service on a client
100
- func DecisionService (decisionService decision.Service ) OptionFunc {
101
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
107
+ // WithDecisionService sets decision service on a client
108
+ func WithDecisionService (decisionService decision.Service ) OptionFunc {
109
+ return func (f * OptimizelyClient ) {
102
110
f .DecisionService = decisionService
103
111
}
104
112
}
105
113
106
- // BatchEventProcessor sets event processor on a client
107
- func BatchEventProcessor (batchSize , queueSize int , flushInterval time.Duration ) OptionFunc {
108
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
109
- f .EventProcessor = event .NewEventProcessor (executionCtx , event .BatchSize (batchSize ),
114
+ // WithBatchEventProcessor sets event processor on a client
115
+ func WithBatchEventProcessor (batchSize , queueSize int , flushInterval time.Duration ) OptionFunc {
116
+ return func (f * OptimizelyClient ) {
117
+ f .EventProcessor = event .NewEventProcessor (event .BatchSize (batchSize ),
110
118
event .QueueSize (queueSize ), event .FlushInterval (flushInterval ))
111
119
}
112
120
}
113
121
114
- // EventProcessor sets event processor on a client
115
- func EventProcessor (eventProcessor event.Processor ) OptionFunc {
116
- return func (f * OptimizelyClient , executionCtx utils. ExecutionCtx ) {
122
+ // WithEventProcessor sets event processor on a client
123
+ func WithEventProcessor (eventProcessor event.Processor ) OptionFunc {
124
+ return func (f * OptimizelyClient ) {
117
125
f .EventProcessor = eventProcessor
118
126
}
119
127
}
120
128
129
+ // WithExecutionContext allows user to pass in their own execution context to override the default one in the client
130
+ func WithExecutionContext (executionContext utils.ExecutionCtx ) OptionFunc {
131
+ return func (f * OptimizelyClient ) {
132
+ f .executionCtx = executionContext
133
+ }
134
+ }
135
+
121
136
// StaticClient returns a client initialized with a static project config
122
137
func (f OptimizelyFactory ) StaticClient () (* OptimizelyClient , error ) {
123
138
var configManager optimizely.ProjectConfigManager
@@ -142,9 +157,9 @@ func (f OptimizelyFactory) StaticClient() (*OptimizelyClient, error) {
142
157
}
143
158
144
159
optlyClient , e := f .Client (
145
- ConfigManager (configManager ),
146
- CompositeDecisionService (f .SDKKey ),
147
- BatchEventProcessor (event .DefaultBatchSize , event .DefaultEventQueueSize , event .DefaultEventFlushInterval ),
160
+ WithConfigManager (configManager ),
161
+ WithCompositeDecisionService (f .SDKKey ),
162
+ WithBatchEventProcessor (event .DefaultBatchSize , event .DefaultEventQueueSize , event .DefaultEventFlushInterval ),
148
163
)
149
164
return optlyClient , e
150
165
}
0 commit comments