49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package v2
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
pb "github.com/hiddify/hiddify-core/hiddifyrpc"
|
|
"github.com/sagernet/sing/common/observable"
|
|
)
|
|
|
|
func NewObserver[T any](listenerBufferSize int) *observable.Observer[T] {
|
|
return observable.NewObserver[T](&observable.Subscriber[T]{}, listenerBufferSize)
|
|
}
|
|
|
|
var logObserver = NewObserver[pb.LogMessage](10)
|
|
|
|
func Log(level pb.LogLevel, typ pb.LogType, message string) {
|
|
if level != pb.LogLevel_DEBUG {
|
|
fmt.Printf("%s %s %s\n", level, typ, message)
|
|
|
|
}
|
|
logObserver.Emit(pb.LogMessage{
|
|
Level: level,
|
|
Type: typ,
|
|
Message: message,
|
|
})
|
|
|
|
}
|
|
|
|
func (s *CoreService) LogListener(stream pb.Core_LogListenerServer) error {
|
|
logSub, _, _ := logObserver.Subscribe()
|
|
defer logObserver.UnSubscribe(logSub)
|
|
|
|
stopch := make(chan int)
|
|
go func() {
|
|
stream.Recv()
|
|
close(stopch)
|
|
}()
|
|
for {
|
|
select {
|
|
case <-stream.Context().Done():
|
|
return nil
|
|
case info := <-logSub:
|
|
stream.Send(&info)
|
|
case <-time.After(500 * time.Millisecond):
|
|
}
|
|
}
|
|
}
|