diff --git a/hub/route/server.go b/hub/route/server.go index fd6a52f6..7aac0667 100644 --- a/hub/route/server.go +++ b/hub/route/server.go @@ -209,16 +209,26 @@ func getLogs(w http.ResponseWriter, r *http.Request) { render.Status(r, http.StatusOK) } + ch := make(chan log.Event, 1024) sub := log.Subscribe() defer log.UnSubscribe(sub) buf := &bytes.Buffer{} - var err error - for elm := range sub { - buf.Reset() - logM := elm + + go func() { + for elm := range sub { + select { + case ch <- elm: + default: + } + } + close(ch) + }() + + for logM := range ch { if logM.LogLevel < level { continue } + buf.Reset() if err := json.NewEncoder(buf).Encode(Log{ Type: logM.Type(), @@ -227,6 +237,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { break } + var err error if wsConn == nil { _, err = w.Write(buf.Bytes()) w.(http.Flusher).Flush() diff --git a/log/log.go b/log/log.go index 750f0a06..be181fdd 100644 --- a/log/log.go +++ b/log/log.go @@ -10,8 +10,8 @@ import ( ) var ( - logCh = make(chan *Event) - source = observable.NewObservable[*Event](logCh) + logCh = make(chan Event) + source = observable.NewObservable[Event](logCh) level = INFO ) @@ -25,7 +25,7 @@ type Event struct { Payload string } -func (e *Event) Type() string { +func (e Event) Type() string { return e.LogLevel.String() } @@ -57,12 +57,12 @@ func Fatalln(format string, v ...any) { log.Fatalf(format, v...) } -func Subscribe() observable.Subscription[*Event] { +func Subscribe() observable.Subscription[Event] { sub, _ := source.Subscribe() return sub } -func UnSubscribe(sub observable.Subscription[*Event]) { +func UnSubscribe(sub observable.Subscription[Event]) { source.UnSubscribe(sub) } @@ -74,7 +74,7 @@ func SetLevel(newLevel LogLevel) { level = newLevel } -func print(data *Event) { +func print(data Event) { if data.LogLevel < level { return } @@ -91,8 +91,8 @@ func print(data *Event) { } } -func newLog(logLevel LogLevel, format string, v ...any) *Event { - return &Event{ +func newLog(logLevel LogLevel, format string, v ...any) Event { + return Event{ LogLevel: logLevel, Payload: fmt.Sprintf(format, v...), }