1.4.5.2
This commit is contained in:
13
EdgeNode/internal/events/events.go
Normal file
13
EdgeNode/internal/events/events.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package events
|
||||
|
||||
type Event = string
|
||||
|
||||
const (
|
||||
EventStart Event = "start" // start loading
|
||||
EventLoaded Event = "loaded" // first load
|
||||
EventQuit Event = "quit" // quit node gracefully
|
||||
EventReload Event = "reload" // reload config
|
||||
EventTerminated Event = "terminated" // process terminated
|
||||
EventNFTablesReady Event = "nftablesReady" // nftables ready
|
||||
EventReloadSomeServers Event = "reloadSomeServers" // reload some servers
|
||||
)
|
||||
91
EdgeNode/internal/events/utils.go
Normal file
91
EdgeNode/internal/events/utils.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package events
|
||||
|
||||
import (
|
||||
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Callbacks = []func()
|
||||
|
||||
var eventsMap = map[Event]map[interface{}]Callbacks{} // event => map[event key][]callback
|
||||
var locker = sync.Mutex{}
|
||||
|
||||
var eventKeyId = 0
|
||||
|
||||
func NewKey() interface{} {
|
||||
locker.Lock()
|
||||
defer locker.Unlock()
|
||||
eventKeyId++
|
||||
return eventKeyId
|
||||
}
|
||||
|
||||
// On 增加事件回调
|
||||
func On(event Event, callback func()) {
|
||||
OnKey(event, nil, callback)
|
||||
}
|
||||
|
||||
func OnEvents(events []Event, callback func()) {
|
||||
for _, event := range events {
|
||||
On(event, callback)
|
||||
}
|
||||
}
|
||||
|
||||
func OnClose(callback func()) {
|
||||
On(EventQuit, callback)
|
||||
On(EventTerminated, callback)
|
||||
}
|
||||
|
||||
// OnKey 使用Key增加事件回调
|
||||
func OnKey(event Event, key interface{}, callback func()) {
|
||||
if key == nil {
|
||||
key = NewKey()
|
||||
}
|
||||
|
||||
locker.Lock()
|
||||
defer locker.Unlock()
|
||||
|
||||
m, ok := eventsMap[event]
|
||||
if !ok {
|
||||
m = map[interface{}]Callbacks{}
|
||||
eventsMap[event] = m
|
||||
}
|
||||
m[key] = append(m[key], callback)
|
||||
}
|
||||
|
||||
// Remove 删除事件回调
|
||||
func Remove(key interface{}) {
|
||||
if key == nil {
|
||||
return
|
||||
}
|
||||
|
||||
locker.Lock()
|
||||
for k, m := range eventsMap {
|
||||
_, ok := m[key]
|
||||
if ok {
|
||||
delete(m, key)
|
||||
eventsMap[k] = m
|
||||
}
|
||||
}
|
||||
locker.Unlock()
|
||||
}
|
||||
|
||||
// Notify 通知事件
|
||||
func Notify(event Event) {
|
||||
// 特殊事件
|
||||
switch event {
|
||||
case EventQuit:
|
||||
teaconst.IsQuiting = true
|
||||
case EventTerminated:
|
||||
teaconst.IsQuiting = true
|
||||
}
|
||||
|
||||
locker.Lock()
|
||||
m := eventsMap[event]
|
||||
locker.Unlock()
|
||||
|
||||
for _, callbacks := range m {
|
||||
for _, callback := range callbacks {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
}
|
||||
33
EdgeNode/internal/events/utils_test.go
Normal file
33
EdgeNode/internal/events/utils_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package events_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/events"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestOn(t *testing.T) {
|
||||
type User struct {
|
||||
name string
|
||||
}
|
||||
var u = &User{name: "lily"}
|
||||
var u2 = &User{name: "lucy"}
|
||||
|
||||
events.On("hello", func() {
|
||||
t.Log("world")
|
||||
})
|
||||
events.On("hello", func() {
|
||||
t.Log("world2")
|
||||
})
|
||||
events.OnKey("hello", u, func() {
|
||||
t.Log("world3")
|
||||
})
|
||||
events.OnKey("hello", u, func() {
|
||||
t.Log("world4")
|
||||
})
|
||||
events.Remove(u)
|
||||
events.Remove(u2)
|
||||
events.OnKey("hello2", nil, func() {
|
||||
t.Log("world2")
|
||||
})
|
||||
events.Notify("hello")
|
||||
}
|
||||
Reference in New Issue
Block a user