107 lines
2.2 KiB
Go
107 lines
2.2 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"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.LogEvent, 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.LogEvent, 128)
|
|
|
|
go func(stream io.ReadCloser, ch chan<- api.LogEvent) {
|
|
defer stream.Close()
|
|
defer close(channel)
|
|
|
|
decoder := json.NewDecoder(stream)
|
|
|
|
for decoder.More() {
|
|
var event api.LogEvent
|
|
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
|
|
}
|
|
|
|
func (r *restclient) MediaEvents(ctx context.Context, storage, pattern string) (<-chan api.MediaEvent, error) {
|
|
header := make(http.Header)
|
|
header.Set("Accept", "application/x-json-stream")
|
|
header.Set("Connection", "close")
|
|
|
|
query := &url.Values{}
|
|
query.Set("glob", pattern)
|
|
|
|
stream, err := r.stream(ctx, "POST", "/v3/events/media/"+url.PathEscape(storage), query, header, "", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
channel := make(chan api.MediaEvent, 128)
|
|
|
|
go func(stream io.ReadCloser, ch chan<- api.MediaEvent) {
|
|
defer stream.Close()
|
|
defer close(channel)
|
|
|
|
decoder := json.NewDecoder(stream)
|
|
|
|
for decoder.More() {
|
|
var event api.MediaEvent
|
|
if err := decoder.Decode(&event); err == io.EOF {
|
|
return
|
|
} else if err != nil {
|
|
event.Action = "error"
|
|
event.Name = err.Error()
|
|
}
|
|
|
|
// Don't emit keepalives
|
|
if event.Action == "keepalive" {
|
|
continue
|
|
}
|
|
|
|
ch <- event
|
|
|
|
if event.Action == "" || event.Action == "error" {
|
|
return
|
|
}
|
|
}
|
|
}(stream, channel)
|
|
|
|
return channel, nil
|
|
}
|