mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-02 14:00:25 +08:00
93 lines
1.5 KiB
Go
93 lines
1.5 KiB
Go
package events
|
|
|
|
import (
|
|
"sync"
|
|
|
|
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
|
)
|
|
|
|
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()
|
|
}
|
|
}
|
|
}
|