create event poll
This commit is contained in:
3 files changed
+94
-1
No files matched your search
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user