func/cloudevents/emitter.go

72 lines
1.4 KiB
Go

package cloudevents
import (
"context"
"fmt"
nethttp "net/http"
cloudevents "github.com/cloudevents/sdk-go/v2"
"github.com/cloudevents/sdk-go/v2/client"
"github.com/cloudevents/sdk-go/v2/event"
"github.com/cloudevents/sdk-go/v2/protocol/http"
"github.com/cloudevents/sdk-go/v2/types"
"github.com/google/uuid"
)
const (
DefaultSource = "/boson/fn"
DefaultType = "boson.fn"
)
type Emitter struct {
Endpoint string
Source string
Type string
Id string
Data string
ContentType string
Transport nethttp.RoundTripper
}
func NewEmitter() *Emitter {
return &Emitter{
Source: DefaultSource,
Type: DefaultType,
Id: uuid.NewString(),
Data: "",
ContentType: event.TextPlain,
Transport: nethttp.DefaultTransport,
}
}
func (e *Emitter) Emit(ctx context.Context, endpoint string) (err error) {
p, err := http.New(http.WithTarget(endpoint), http.WithRoundTripper(e.Transport))
if err != nil {
return err
}
c, err := client.New(p)
if err != nil {
return err
}
evt := event.Event{
Context: event.EventContextV1{
Type: e.Type,
Source: *types.ParseURIRef(e.Source),
ID: e.Id,
}.AsV1(),
}
if err = evt.SetData(e.ContentType, e.Data); err != nil {
return
}
event, result := c.Request(ctx, evt)
if !cloudevents.IsACK(result) {
return fmt.Errorf(result.Error())
}
if event != nil {
fmt.Printf("%v", event)
}
return nil
}