summaryrefslogtreecommitdiffhomepage
path: root/internal/logging/writer.go
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-10 13:29:44 +0200
committerKujtim Hoxha <[email protected]>2025-04-10 13:29:44 +0200
commit36f201d5d3aaba7e0285d86cf1c0cf6b54769cff (patch)
tree1f1c99e66df4c25f816fbfba2b1e255c94bec9ba /internal/logging/writer.go
parent0b007b9c77bc790127021a7e03c8e05ec8e5e081 (diff)
downloadopencode-36f201d5d3aaba7e0285d86cf1c0cf6b54769cff.tar.gz
opencode-36f201d5d3aaba7e0285d86cf1c0cf6b54769cff.zip
fix logs and add cancellation
Diffstat (limited to 'internal/logging/writer.go')
-rw-r--r--internal/logging/writer.go49
1 files changed, 45 insertions, 4 deletions
diff --git a/internal/logging/writer.go b/internal/logging/writer.go
index 06a5330e3..9fe469c5e 100644
--- a/internal/logging/writer.go
+++ b/internal/logging/writer.go
@@ -2,18 +2,47 @@ package logging
import (
"bytes"
+ "context"
"fmt"
+ "strings"
+ "sync"
"time"
"github.com/go-logfmt/logfmt"
"github.com/kujtimiihoxha/termai/internal/pubsub"
)
-type writer struct {
+const (
+ persistKeyArg = "$_persist"
+ PersistTimeArg = "$_persist_time"
+)
+
+type LogData struct {
messages []LogMessage
*pubsub.Broker[LogMessage]
+ lock sync.Mutex
+}
+
+func (l *LogData) Add(msg LogMessage) {
+ l.lock.Lock()
+ defer l.lock.Unlock()
+ l.messages = append(l.messages, msg)
+ l.Publish(pubsub.CreatedEvent, msg)
+}
+
+func (l *LogData) List() []LogMessage {
+ l.lock.Lock()
+ defer l.lock.Unlock()
+ return l.messages
+}
+
+var defaultLogData = &LogData{
+ messages: make([]LogMessage, 0),
+ Broker: pubsub.NewBroker[LogMessage](),
}
+type writer struct{}
+
func (w *writer) Write(p []byte) (int, error) {
d := logfmt.NewDecoder(bytes.NewReader(p))
for d.ScanRecord() {
@@ -30,7 +59,7 @@ func (w *writer) Write(p []byte) (int, error) {
}
msg.Time = parsed
case "level":
- msg.Level = string(d.Value())
+ msg.Level = strings.ToLower(string(d.Value()))
case "msg":
msg.Message = string(d.Value())
default:
@@ -50,11 +79,23 @@ func (w *writer) Write(p []byte) (int, error) {
}
}
}
- w.messages = append(w.messages, msg)
- w.Publish(pubsub.CreatedEvent, msg)
+ defaultLogData.Add(msg)
}
if d.Err() != nil {
return 0, d.Err()
}
return len(p), nil
}
+
+func NewWriter() *writer {
+ w := &writer{}
+ return w
+}
+
+func Subscribe(ctx context.Context) <-chan pubsub.Event[LogMessage] {
+ return defaultLogData.Subscribe(ctx)
+}
+
+func List() []LogMessage {
+ return defaultLogData.List()
+}