Files
yt-dlp-webui/server/logging/observable_logger.go
Marco Piovanello 64fbdbbbdf Dropping rxgo (#201)
* rxgo event source to channel with drop strategy

* code optimizations
2024-09-18 17:49:25 +02:00

54 lines
912 B
Go

package logging
import (
"context"
)
/*
Logger implementation using the observable pattern.
Implements io.Writer interface.
The observable is an event source which drops everythigng unless there's
a subscriber connected.
The observer implementatios are a http ServerSentEvents handler and a
websocket one in handler.go
*/
type ObservableLogger struct {
logsChan chan []byte
}
func NewObservableLogger() *ObservableLogger {
return &ObservableLogger{
logsChan: make(chan []byte, 100),
}
}
func (o *ObservableLogger) Write(p []byte) (n int, err error) {
select {
case o.logsChan <- p:
n = len(p)
err = nil
return
default:
return
}
}
func (o *ObservableLogger) Observe(ctx context.Context) <-chan string {
logs := make(chan string)
go func() {
for {
select {
case <-ctx.Done():
return
case logLine := <-o.logsChan:
logs <- string(logLine)
}
}
}()
return logs
}