create event poll

This commit is contained in:
Kr328 committed 2019-11-24 21:47:30 +08:00
1 parent c7107e9d9b
commit 9aa20c6715
3 files changed
+94 -1

No files matched your search

+13
View File
@@ -7,6 +7,13 @@ var (
handleClose func()
)
const (
EventClose = 0
EventLog = 1
EventProxyChanged = 2
EventTraffic = 3
)
func SetHandlers(send func([]byte), close func()) error {
if handleSend != nil || handleClose != nil {
return errors.New("Already registered")
@@ -22,3 +29,9 @@ func ClearHandlers() {
handleSend = nil
handleClose = nil
}
func send(buf []byte) {
if handleSend != nil {
handleSend(buf)
}
}
+78
View File
@@ -1 +1,79 @@
package event
import "github.com/Dreamacro/clash/log"
import "encoding/json"
import "encoding/binary"
var logExit chan int = nil
func StartLogEvent() {
if logExit != nil {
return
}
go func() {
logExit = make(chan int)
sub := log.Subscribe()
defer log.UnSubscribe(sub)
defer func() {
close(logExit)
logExit = nil
}()
for {
select {
case data := <-sub:
log := data.(*log.Event)
if log == nil {
continue
}
var message struct {
Type int `json:"type"`
Message string `json:"message"`
}
message.Type = levelToInt(log.LogLevel)
message.Message = log.Payload
s, _ := json.Marshal(&message)
var prefix [4]byte
binary.BigEndian.PutUint32(prefix[:], EventLog)
send(append(prefix[:], s[:]...))
case <-logExit:
return
}
}
}()
}
func StopLogEvent() {
if logExit == nil {
return
}
logExit <- 0
}
func levelToInt(level log.LogLevel) int {
switch level {
case log.DEBUG:
return 1
case log.INFO:
return 2
case log.WARNING:
return 3
case log.ERROR:
return 4
}
return 1
}
@@ -38,4 +38,6 @@ object Parcels : AbstractSerialFormat(EmptyModule) {
return nextObject ?: throw NullPointerException("Parcel read data null")
}
}
}
}