@@ -25,6 +25,7 @@ import (
25
25
"github.com/optimizely/go-sdk/optimizely"
26
26
"github.com/optimizely/go-sdk/optimizely/config/datafileprojectconfig"
27
27
"github.com/optimizely/go-sdk/optimizely/logging"
28
+ "github.com/optimizely/go-sdk/optimizely/notification"
28
29
"github.com/optimizely/go-sdk/optimizely/utils"
29
30
)
30
31
@@ -37,18 +38,20 @@ var cmLogger = logging.GetLogger("PollingConfigManager")
37
38
38
39
// PollingProjectConfigManagerOptions used to create an instance with custom configuration
39
40
type PollingProjectConfigManagerOptions struct {
40
- Datafile []byte
41
- PollingInterval time.Duration
42
- Requester utils.Requester
41
+ Datafile []byte
42
+ PollingInterval time.Duration
43
+ Requester utils.Requester
44
+ NotificationCenter notification.Center
43
45
}
44
46
45
47
// PollingProjectConfigManager maintains a dynamic copy of the project config
46
48
type PollingProjectConfigManager struct {
47
- requester utils.Requester
48
- pollingInterval time.Duration
49
- projectConfig optimizely.ProjectConfig
50
- configLock sync.RWMutex
51
- err error
49
+ requester utils.Requester
50
+ pollingInterval time.Duration
51
+ projectConfig optimizely.ProjectConfig
52
+ configLock sync.RWMutex
53
+ err error
54
+ notificationCenter notification.Center
52
55
53
56
exeCtx utils.ExecutionCtx // context used for execution control
54
57
}
@@ -77,6 +80,16 @@ func (cm *PollingProjectConfigManager) SyncConfig(datafile []byte) {
77
80
} else {
78
81
cmLogger .Debug (fmt .Sprintf ("Received new datafile and updated config. Old revision number: %s. New revision number: %s" , cm .projectConfig .GetRevision (), projectConfig .GetRevision ()))
79
82
cm .projectConfig = projectConfig
83
+
84
+ if cm .notificationCenter != nil {
85
+ projectConfigUpdateNotification := notification.ProjectConfigUpdateNotification {
86
+ Type : notification .ProjectConfigUpdate ,
87
+ Revision : cm .projectConfig .GetRevision (),
88
+ }
89
+ if err = cm .notificationCenter .Send (notification .ProjectConfigUpdate , projectConfigUpdateNotification ); err != nil {
90
+ cmLogger .Warning ("Problem with sending notification" )
91
+ }
92
+ }
80
93
}
81
94
} else {
82
95
cm .projectConfig = projectConfig
@@ -120,7 +133,7 @@ func NewPollingProjectConfigManagerWithOptions(exeCtx utils.ExecutionCtx, sdkKey
120
133
pollingInterval = defaultPollingInterval
121
134
}
122
135
123
- pollingProjectConfigManager := PollingProjectConfigManager {requester : requester , pollingInterval : pollingInterval , exeCtx : exeCtx }
136
+ pollingProjectConfigManager := PollingProjectConfigManager {requester : requester , pollingInterval : pollingInterval , notificationCenter : options . NotificationCenter , exeCtx : exeCtx }
124
137
125
138
pollingProjectConfigManager .SyncConfig (options .Datafile ) // initial poll
126
139
@@ -142,3 +155,29 @@ func (cm *PollingProjectConfigManager) GetConfig() (optimizely.ProjectConfig, er
142
155
defer cm .configLock .RUnlock ()
143
156
return cm .projectConfig , cm .err
144
157
}
158
+
159
+ // OnProjectConfigUpdate registers a handler for ProjectConfigUpdate notifications
160
+ func (cm * PollingProjectConfigManager ) OnProjectConfigUpdate (callback func (notification.ProjectConfigUpdateNotification )) (int , error ) {
161
+ handler := func (payload interface {}) {
162
+ if projectConfigUpdateNotification , ok := payload .(notification.ProjectConfigUpdateNotification ); ok {
163
+ callback (projectConfigUpdateNotification )
164
+ } else {
165
+ cmLogger .Warning (fmt .Sprintf ("Unable to convert notification payload %v into ProjectConfigUpdateNotification" , payload ))
166
+ }
167
+ }
168
+ id , err := cm .notificationCenter .AddHandler (notification .ProjectConfigUpdate , handler )
169
+ if err != nil {
170
+ cmLogger .Warning ("Problem with adding notification handler" )
171
+ return 0 , err
172
+ }
173
+ return id , nil
174
+ }
175
+
176
+ // RemoveOnProjectConfigUpdate removes handler for ProjectConfigUpdate notification with given id
177
+ func (cm * PollingProjectConfigManager ) RemoveOnProjectConfigUpdate (id int ) error {
178
+ if err := cm .notificationCenter .RemoveHandler (id , notification .ProjectConfigUpdate ); err != nil {
179
+ cmLogger .Warning ("Problem with removing notification handler" )
180
+ return err
181
+ }
182
+ return nil
183
+ }
0 commit comments