Files
donut/internal/controllers/srt_controller.go
2024-01-29 15:28:09 -03:00

94 lines
2.0 KiB
Go

package controllers
import (
"context"
astisrt "github.com/asticode/go-astisrt/pkg"
"github.com/flavioribeiro/donut/internal/entities"
"go.uber.org/fx"
"go.uber.org/zap"
)
type SRTController struct {
c *entities.Config
l *zap.Logger
}
func NewSRTController(c *entities.Config, l *zap.Logger, lc fx.Lifecycle) (*SRTController, error) {
// Handle logs
astisrt.SetLogLevel(astisrt.LogLevel(astisrt.LogLevelError))
astisrt.SetLogHandler(func(ll astisrt.LogLevel, file, area, msg string, line int) {
l.Sugar().Infow("SRT",
"ll", ll,
"msg", msg,
)
})
// Startup srt
if err := astisrt.Startup(); err != nil {
l.Sugar().Errorw("failed to start up srt",
"error", err,
)
return nil, err
}
lc.Append(fx.Hook{
OnStop: func(ctx context.Context) error {
// Clean up
if err := astisrt.CleanUp(); err != nil {
l.Sugar().Errorw("failed to clean up srt",
"error", err,
)
return err
}
return nil
},
})
return &SRTController{
c: c,
l: l,
}, nil
}
func (c *SRTController) Connect(params *entities.RequestParams) (*astisrt.Connection, error) {
c.l.Sugar().Infow("trying to connect srt")
if params == nil {
return nil, entities.ErrMissingRemoteOffer
}
if err := params.Valid(); err != nil {
return nil, err
}
c.l.Sugar().Infow("Connecting to SRT ",
"offer", params,
)
conn, err := astisrt.Dial(astisrt.DialOptions{
ConnectionOptions: []astisrt.ConnectionOption{
astisrt.WithLatency(c.c.SRTConnectionLatencyMS),
astisrt.WithStreamid(params.SRTStreamID),
astisrt.WithCongestion("live"),
astisrt.WithTranstype(astisrt.Transtype(astisrt.TranstypeLive)),
},
OnDisconnect: func(conn *astisrt.Connection, err error) {
c.l.Sugar().Fatalw("Disconnected from SRT",
"error", err,
)
},
Host: params.SRTHost,
Port: params.SRTPort,
})
if err != nil {
c.l.Sugar().Errorw("failed to connect srt",
"error", err,
)
return nil, err
}
c.l.Sugar().Infow("Connected to SRT")
return conn, nil
}