@@ -29,31 +29,67 @@ import (
29
29
"github.com/optimizely/go-sdk/optimizely/utils"
30
30
)
31
31
32
- const defaultPollingInterval = 5 * time .Minute // default to 5 minutes for polling
32
+ // DefaultPollingInterval sets default interval for polling manager
33
+ const DefaultPollingInterval = 5 * time .Minute // default to 5 minutes for polling
33
34
34
35
// DatafileURLTemplate is used to construct the endpoint for retrieving the datafile from the CDN
35
36
const DatafileURLTemplate = "https://cdn.optimizely.com/datafiles/%s.json"
36
37
37
38
var cmLogger = logging .GetLogger ("PollingConfigManager" )
38
39
39
- // PollingProjectConfigManagerOptions used to create an instance with custom configuration
40
- type PollingProjectConfigManagerOptions struct {
41
- Datafile []byte
42
- PollingInterval time.Duration
43
- Requester utils.Requester
44
- NotificationCenter notification.Center
45
- }
46
-
47
40
// PollingProjectConfigManager maintains a dynamic copy of the project config
48
41
type PollingProjectConfigManager struct {
49
42
requester utils.Requester
50
43
pollingInterval time.Duration
51
- projectConfig optimizely.ProjectConfig
52
- configLock sync.RWMutex
53
- err error
54
44
notificationCenter notification.Center
45
+ initDatafile []byte
46
+
47
+ configLock sync.RWMutex
48
+ err error
49
+ projectConfig optimizely.ProjectConfig
50
+ exeCtx utils.ExecutionCtx // context used for execution control
51
+ }
52
+
53
+ // OptionFunc is a type to a proper func
54
+ type OptionFunc func (* PollingProjectConfigManager )
55
+
56
+ // SetDefaultRequester is an optional function, sets default requester based on a key.
57
+ func SetDefaultRequester (sdkKey string ) OptionFunc {
58
+ return func (p * PollingProjectConfigManager ) {
59
+
60
+ url := fmt .Sprintf (DatafileURLTemplate , sdkKey )
61
+ requester := utils .NewHTTPRequester (url )
55
62
56
- exeCtx utils.ExecutionCtx // context used for execution control
63
+ p .requester = requester
64
+ }
65
+ }
66
+
67
+ // SetRequester is an optional function, sets a passed requester
68
+ func SetRequester (requester utils.Requester ) OptionFunc {
69
+ return func (p * PollingProjectConfigManager ) {
70
+ p .requester = requester
71
+ }
72
+ }
73
+
74
+ // SetPollingInterval is an optional function, sets a passed polling interval
75
+ func SetPollingInterval (interval time.Duration ) OptionFunc {
76
+ return func (p * PollingProjectConfigManager ) {
77
+ p .pollingInterval = interval
78
+ }
79
+ }
80
+
81
+ // SetNotification is an optional function, sets a passed notification
82
+ func SetNotification (notificationCenter notification.Center ) OptionFunc {
83
+ return func (p * PollingProjectConfigManager ) {
84
+ p .notificationCenter = notificationCenter
85
+ }
86
+ }
87
+
88
+ // SetInitialDatafile is an optional function, sets a passed datafile
89
+ func SetInitialDatafile (datafile []byte ) OptionFunc {
90
+ return func (p * PollingProjectConfigManager ) {
91
+ p .initDatafile = datafile
92
+ }
57
93
}
58
94
59
95
// SyncConfig gets current datafile and updates projectConfig
@@ -98,12 +134,7 @@ func (cm *PollingProjectConfigManager) SyncConfig(datafile []byte) {
98
134
cm .configLock .Unlock ()
99
135
}
100
136
101
- func (cm * PollingProjectConfigManager ) start (initialDatafile []byte , init bool ) {
102
-
103
- if init {
104
- cm .SyncConfig (initialDatafile )
105
- return
106
- }
137
+ func (cm * PollingProjectConfigManager ) start () {
107
138
108
139
t := time .NewTicker (cm .pollingInterval )
109
140
for {
@@ -117,38 +148,24 @@ func (cm *PollingProjectConfigManager) start(initialDatafile []byte, init bool)
117
148
}
118
149
}
119
150
120
- // NewPollingProjectConfigManagerWithOptions returns new instance of PollingProjectConfigManager with the given options
121
- func NewPollingProjectConfigManagerWithOptions (exeCtx utils.ExecutionCtx , sdkKey string , options PollingProjectConfigManagerOptions ) * PollingProjectConfigManager {
151
+ // NewPollingProjectConfigManager returns an instance of the polling config manager with the customized configuration
152
+ func NewPollingProjectConfigManager (exeCtx utils.ExecutionCtx , sdkKey string , pollingMangerOptions ... OptionFunc ) * PollingProjectConfigManager {
153
+ url := fmt .Sprintf (DatafileURLTemplate , sdkKey )
122
154
123
- var requester utils.Requester
124
- if options .Requester != nil {
125
- requester = options .Requester
126
- } else {
127
- url := fmt .Sprintf (DatafileURLTemplate , sdkKey )
128
- requester = utils .NewHTTPRequester (url )
129
- }
155
+ pollingProjectConfigManager := PollingProjectConfigManager {exeCtx : exeCtx , pollingInterval : DefaultPollingInterval , requester : utils .NewHTTPRequester (url )}
130
156
131
- pollingInterval := options .PollingInterval
132
- if pollingInterval == 0 {
133
- pollingInterval = defaultPollingInterval
157
+ for _ , opt := range pollingMangerOptions {
158
+ opt (& pollingProjectConfigManager )
134
159
}
135
160
136
- pollingProjectConfigManager := PollingProjectConfigManager {requester : requester , pollingInterval : pollingInterval , notificationCenter : options .NotificationCenter , exeCtx : exeCtx }
137
-
138
- pollingProjectConfigManager .SyncConfig (options .Datafile ) // initial poll
161
+ initDatafile := pollingProjectConfigManager .initDatafile
162
+ pollingProjectConfigManager .SyncConfig (initDatafile ) // initial poll
139
163
140
164
cmLogger .Debug ("Polling Config Manager Initiated" )
141
- go pollingProjectConfigManager .start ([] byte {}, false )
165
+ go pollingProjectConfigManager .start ()
142
166
return & pollingProjectConfigManager
143
167
}
144
168
145
- // NewPollingProjectConfigManager returns an instance of the polling config manager with the default configuration
146
- func NewPollingProjectConfigManager (exeCtx utils.ExecutionCtx , sdkKey string ) * PollingProjectConfigManager {
147
- options := PollingProjectConfigManagerOptions {}
148
- configManager := NewPollingProjectConfigManagerWithOptions (exeCtx , sdkKey , options )
149
- return configManager
150
- }
151
-
152
169
// GetConfig returns the project config
153
170
func (cm * PollingProjectConfigManager ) GetConfig () (optimizely.ProjectConfig , error ) {
154
171
cm .configLock .RLock ()
0 commit comments