/
watcher.go
51 lines (40 loc) · 1.22 KB
/
watcher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package watcher
import (
"strings"
"github.com/pubgo/lug/config"
"github.com/pubgo/lug/types"
"github.com/pubgo/xerror"
"github.com/pubgo/xlog"
)
var defaultWatcher Watcher
var callbacks types.SMap
func Watch(name string, h CallBack) {
xerror.Assert(name == "" || h == nil, "[name, callback] should not be null")
xerror.Assert(callbacks.Has(name), "callback %s already exists", name)
callbacks.Set(name, h)
}
func onWatch(resp *Response) {
defer xerror.Resp(func(err xerror.XErr) {
xlog.Error("onWatch error", xlog.Any("err", err))
})
// 以name为前缀的所有的callbacks
xerror.Panic(callbacks.Each(func(k string, cb CallBack) {
mu.Lock()
defer mu.Unlock()
defer xerror.Resp(func(err xerror.XErr) {
xlog.Error("watch callback error", xlog.Any("err", err))
})
key := KeyToDot(resp.Key)
// 检查是否是以name为前缀, `.`是连接符
if !strings.HasPrefix(key+".", k+".") {
return
}
// 获取数据, 并且更新全局配置
cfg := config.GetCfg()
resp.OnDelete(func() { cfg.Set(key, "") })
resp.OnPut(func() { cfg.Set(key, string(resp.Value)) })
// 执行watch callback
var name = KeyToDot(strings.TrimPrefix(key, k))
xerror.PanicF(cb(name, resp), "event: %#v", *resp)
}))
}