@@ -25,6 +25,7 @@ import (
2525 "github.com/optimizely/go-sdk/optimizely"
2626 "github.com/optimizely/go-sdk/optimizely/config/datafileprojectconfig"
2727 "github.com/optimizely/go-sdk/optimizely/logging"
28+ "github.com/optimizely/go-sdk/optimizely/notification"
2829 "github.com/optimizely/go-sdk/optimizely/utils"
2930)
3031
@@ -37,18 +38,20 @@ var cmLogger = logging.GetLogger("PollingConfigManager")
3738
3839// PollingProjectConfigManagerOptions used to create an instance with custom configuration
3940type 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
4345}
4446
4547// PollingProjectConfigManager maintains a dynamic copy of the project config
4648type 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
5255
5356 exeCtx utils.ExecutionCtx // context used for execution control
5457}
@@ -77,6 +80,16 @@ func (cm *PollingProjectConfigManager) SyncConfig(datafile []byte) {
7780 } else {
7881 cmLogger .Debug (fmt .Sprintf ("Received new datafile and updated config. Old revision number: %s. New revision number: %s" , cm .projectConfig .GetRevision (), projectConfig .GetRevision ()))
7982 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+ }
8093 }
8194 } else {
8295 cm .projectConfig = projectConfig
@@ -120,7 +133,7 @@ func NewPollingProjectConfigManagerWithOptions(exeCtx utils.ExecutionCtx, sdkKey
120133 pollingInterval = defaultPollingInterval
121134 }
122135
123- pollingProjectConfigManager := PollingProjectConfigManager {requester : requester , pollingInterval : pollingInterval , exeCtx : exeCtx }
136+ pollingProjectConfigManager := PollingProjectConfigManager {requester : requester , pollingInterval : pollingInterval , notificationCenter : options . NotificationCenter , exeCtx : exeCtx }
124137
125138 pollingProjectConfigManager .SyncConfig (options .Datafile ) // initial poll
126139
@@ -142,3 +155,29 @@ func (cm *PollingProjectConfigManager) GetConfig() (optimizely.ProjectConfig, er
142155 defer cm .configLock .RUnlock ()
143156 return cm .projectConfig , cm .err
144157}
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