Files
core/http/client/events.go
2024-10-14 10:51:35 +02:00

60 lines
1.2 KiB
Go

package client
import (
"context"
"io"
"net/http"
"github.com/datarhei/core/v16/encoding/json"
"github.com/datarhei/core/v16/http/api"
"github.com/datarhei/core/v16/mem"
)
func (r *restclient) Events(ctx context.Context, filters api.EventFilters) (<-chan api.Event, error) {
buf := mem.Get()
defer mem.Put(buf)
e := json.NewEncoder(buf)
e.Encode(filters)
header := make(http.Header)
header.Set("Accept", "application/x-json-stream")
stream, err := r.stream(ctx, "POST", "/v3/events", nil, header, "application/json", buf.Reader())
if err != nil {
return nil, err
}
channel := make(chan api.Event, 128)
go func(stream io.ReadCloser, ch chan<- api.Event) {
defer stream.Close()
defer close(channel)
decoder := json.NewDecoder(stream)
for decoder.More() {
var event api.Event
if err := decoder.Decode(&event); err == io.EOF {
return
} else if err != nil {
event.Component = "error"
event.Message = err.Error()
}
// Don't emit keepalives
if event.Component == "keepalive" {
continue
}
ch <- event
if event.Component == "" || event.Component == "error" {
return
}
}
}(stream, channel)
return channel, nil
}