github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/config/emitter.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package config 5 6 import ( 7 "sync" 8 9 "github.com/mattermost/mattermost-server/v5/mlog" 10 "github.com/mattermost/mattermost-server/v5/model" 11 ) 12 13 // emitter enables threadsafe registration and broadcasting to configuration listeners 14 type emitter struct { 15 listeners sync.Map 16 } 17 18 // AddListener adds a callback function to invoke when the configuration is modified. 19 func (e *emitter) AddListener(listener Listener) string { 20 id := model.NewId() 21 22 e.listeners.Store(id, listener) 23 24 return id 25 } 26 27 // RemoveListener removes a callback function using an id returned from AddListener. 28 func (e *emitter) RemoveListener(id string) { 29 e.listeners.Delete(id) 30 } 31 32 // invokeConfigListeners synchronously notifies all listeners about the configuration change. 33 func (e *emitter) invokeConfigListeners(oldCfg, newCfg *model.Config) { 34 e.listeners.Range(func(key, value interface{}) bool { 35 listener := value.(Listener) 36 listener(oldCfg, newCfg) 37 38 return true 39 }) 40 } 41 42 // srcEmitter enables threadsafe registration and broadcasting to configuration listeners 43 type logSrcEmitter struct { 44 listeners sync.Map 45 } 46 47 // AddListener adds a callback function to invoke when the configuration is modified. 48 func (e *logSrcEmitter) AddListener(listener LogSrcListener) string { 49 id := model.NewId() 50 e.listeners.Store(id, listener) 51 return id 52 } 53 54 // RemoveListener removes a callback function using an id returned from AddListener. 55 func (e *logSrcEmitter) RemoveListener(id string) { 56 e.listeners.Delete(id) 57 } 58 59 // invokeConfigListeners synchronously notifies all listeners about the configuration change. 60 func (e *logSrcEmitter) invokeConfigListeners(oldCfg, newCfg mlog.LogTargetCfg) { 61 e.listeners.Range(func(key, value interface{}) bool { 62 listener := value.(LogSrcListener) 63 listener(oldCfg, newCfg) 64 return true 65 }) 66 }